1. Atlassian平台扩展全景

在开始任何定制开发之前,必须先回答一个基础问题:我要改的东西,究竟属于“配置”还是“扩展”?Atlassian 三件套(Jira、Confluence、Bitbucket)都提供了大量开箱即用的配置能力,同时也各自暴露了不同层次的扩展点。混淆这两者,往往导致两种典型失败:用代码去实现本可以点几下就完成的需求,或者用配置去硬凑一个本质上需要插件才能支撑的场景。

一、三款产品的定位差异决定了扩展方式

Jira 是事务与流程驱动的平台,核心对象是 Issue,核心机制是工作流引擎。它的扩展点围绕“事务如何流转、字段如何校验、权限如何收敛”展开。Confluence 是内容协作平台,核心对象是 Page 与 Space,扩展点更多集中在宏(Macro)、内容渲染、蓝图(Blueprint)和空间权限上。Bitbucket 是代码托管与流水线平台,核心对象是 Repository、Pull Request 和 Pipeline,扩展点集中在合并检查(Merge Check)、Webhook、CI/CD 钩子和应用链接上。

三者共享同一套底层扩展框架——Atlassian Connect 与 Forge,但各自暴露的 API 面和事件模型完全不同。理解这一点,才能判断一个跨产品需求应该落在哪个平台、用哪种扩展方式实现。

二、配置与扩展的边界

判断标准可以归纳为三条:

  • 是否改变数据模型:新增自定义字段、修改工作流状态、调整权限方案,属于配置;引入全新的对象类型或跨系统同步,属于扩展。
  • 是否引入外部逻辑:调用第三方 API、执行自定义计算、触发外部系统,属于扩展;仅使用内置条件、校验器、后置函数,属于配置。
  • 是否可被平台原生承载:如果平台已经提供了对应的 UI 入口和存储机制,优先配置;否则才考虑扩展。
经验法则:能用配置解决的,不要写代码;必须写代码的,优先用 Forge 而非 Connect,因为 Forge 由 Atlassian 托管运行时,免去了自建服务的运维成本。

三、工作流引擎在三款产品中的位置

Jira 的工作流引擎是最完整、最值得深入的对象。一个工作流由状态(Status)、转换(Transition)、条件(Condition)、校验器(Validator)、后置函数(Post Function)五类元素构成。状态是事务在某一时刻的归属;转换是状态之间的有向边;条件决定“谁能执行这次转换”;校验器决定“执行前必须满足什么”;后置函数决定“执行后系统自动做什么”。

Confluence 没有严格意义上的工作流引擎,但它的内容状态(草稿、发布、归档)和审批流(通过 Comala 等应用或原生 Page Approval)承担了类似职责。Bitbucket 的Pull Request 状态机(Open → Merged / Declined)配合 Merge Check 和 Pipeline 触发,构成了代码合并的流程控制。

下图展示了三款产品的扩展点分布与工作流引擎的定位关系:

Atlassian 平台扩展全景与工作流引擎定位 Jira 事务与流程驱动 工作流引擎 状态 · 转换 · 条件 · 校验 · 后置函数 自定义字段与屏幕 字段类型 · 上下文 · 屏幕方案 权限与通知方案 项目角色 · 问题安全 · 事件通知 REST API / Webhook Issue CRUD · 事件订阅 Forge / Connect 应用 自定义 UI · 触发器 · 存储 扩展边界 数据模型变更 · 外部逻辑引入 Confluence 内容协作平台 内容状态与审批 草稿 · 发布 · 归档 · 审批流 宏与蓝图 自定义宏 · 空间蓝图 · 模板 空间与页面权限 空间权限 · 页面限制 · 继承 REST API / Webhook 内容 CRUD · 事件订阅 Forge / Connect 应用 自定义 UI · 内容操作 · 存储 扩展边界 内容模型变更 · 外部逻辑引入 Bitbucket 代码托管与流水线 PR 状态机 Open → Merged / Declined Merge Check 合并前校验 · 自定义检查 Pipeline 钩子 构建触发 · 部署 · 环境 REST API / Webhook 仓库 CRUD · PR 事件 Forge / Connect 应用 自定义 UI · 代码操作 · 存储 扩展边界 代码模型变更 · 外部逻辑引入 共享扩展框架:Atlassian Connect(自托管) · Forge(Atlassian 托管运行时) · OAuth 2.0 授权

四、如何选择扩展方式

面对一个具体需求,可以按以下顺序判断:

  1. 先查原生配置:Jira 的工作流编辑器、字段配置、权限方案是否已经覆盖?Confluence 的宏和蓝图是否够用?Bitbucket 的 Merge Check 和 Pipeline 是否已满足?
  2. 再看 REST API:如果需求是“在外部系统中同步数据”或“批量操作”,REST API + Webhook 通常是最轻量的方案,不需要部署应用。
  3. 最后考虑 Forge/Connect:只有当需要自定义 UI、在平台内部嵌入交互、或需要持久化存储时,才引入应用开发。
常见误区:把“工作流”等同于“审批流”。Jira 的工作流引擎本质是状态机,它控制的是事务的生命周期,而不是审批层级。审批只是工作流的一种应用场景,不要用审批的思维去设计所有工作流。

五、一个判断示例

假设需求是:“当 Jira 事务从‘进行中’转为‘已完成’时,自动在 Confluence 中创建一条发布记录,并通知 Bitbucket 触发一次构建。”

拆解:Jira 侧需要工作流后置函数或 Webhook 监听转换事件;Confluence 侧需要 REST API 创建页面;Bitbucket 侧需要 Pipeline 触发接口。这个需求跨越三个产品,无法用单一配置完成,必须通过 Forge 应用或外部中间服务串联。此时,扩展的边界就清晰了:Jira 的工作流引擎负责“事件源”,Confluence 和 Bitbucket 的 API 负责“消费端”,Forge 负责“编排”。