自动化插件发布

本页内容

自动化发布会在你推送版本标签或手动启动 GitHub Actions 工作流时,构建并发布沙箱插件。你的 Atmosphere 账户 仍拥有包配置文件与发布记录。GitHub 识别已批准的工作流,发布服务验证构建,并通过狭窄的委托写入发布记录。仓库不会存储 Atmosphere 账户凭证。

从你的计算机启动发布时,使用 emdash-plugin publish。当应由 GitHub Actions 构建并发布时,使用本指南。

前提条件

开始前请准备:

  • 包含沙箱 EmDash 插件的公开 GitHub 仓库。
  • 作为开发依赖安装的 @emdash-cms/plugin-cli。用 CLI 创建的插件已包含它。
  • 有效的 emdash-plugin.jsonc,包含 slug、publisher、license、作者与安全联系人。将 repo 设为规范 GitHub URL,或在交互式设置中确认检测到的 GitHub 远程。
  • package.json 中的版本,或仅注册表插件的 emdash-plugin.jsonc 中的版本。
  • publisher 所指定的 Atmosphere 账户。
  • 支持通行密钥的浏览器。发布批准需要用户验证。

在配置工作流之前运行清单检查:

pnpm exec emdash-plugin validate

设置自动化发布

  1. 使用拥有该包的 Atmosphere 账户登录插件 CLI。

    pnpm exec emdash-plugin login alice.example.com

    CLI 将此本地发布会话存储在项目之外。GitHub Actions 永远不会收到它。

  2. 从插件目录准备包配置文件并生成工作流。

    pnpm exec emdash-plugin release setup

    该命令从 emdash-plugin.jsonc 读取包元数据。若缺少包配置文件,会提议创建。若配置文件存在但没有 delegated-release 设置,会提议添加它们,同时保留现有包元数据。

    在 monorepo 中,在插件包内运行该命令,或传入 --dir <plugin-directory>。若清单不含 repo,设置会检测 GitHub origin 远程并预填仓库提示。

    设置会询问何时需要批准发布:

    • When plugin permissions increase 为默认。当声明的访问相对最新发布扩大时,发布会等待批准。
    • For every release 要求每个版本都经批准。

    设置还会询问发布是否需要可验证的 provenance。自动化发布的默认是 Require provenance。仅当同一配置文件还必须接受从可信本地环境直接发布的版本时,才选择 Allow releases without provenance。

    已登录的 Atmosphere 账户成为初始批准者。配置文件将包绑定到规范 GitHub 仓库 URL,并记录所选的 provenance 策略。

    当工作流文件已存在时,仅运行配置文件步骤:

    pnpm exec emdash-plugin profile setup

    发布包配置文件后,此命令会显示手动与 GitHub Actions 发布命令。

    在非交互式终端中,传入 --yes 以接受默认策略。当清单与 Git 远程都未提供仓库时传入 --repository <https-url>,传入 --provenance optional 以允许无 provenance 的发布,传入 --confirmation always 以要求每次发布都经批准。

  3. 审查并提交生成的工作流。

    该命令创建 .github/workflows/emdash-release.yml。它不会推送该文件,除非传入 --force,否则不会替换现有工作流。

    若仓库包含 .changeset/config.json,交互式设置会提供 Follow Changesets releases。当 Changesets 发布包含 emdash-plugin.jsonc 的包时,可复用的 EmDash 工作流会发布相同版本。如下所述将其连接到现有 Changesets 工作流。否则,生成的工作流会针对匹配 <slug>@<version> 的包标签运行。两种变体都支持手动运行,并可用 --trigger changesets|tags|manual 显式选择。

    工作流仅为每个作业授予所需的 contents、id-token 与 attestations 权限;将第三方 Actions 固定到完整提交标识符;运行生成该文件的确切插件 CLI 版本;从清单解析每个包;构建一个插件包;为这些确切字节创建 GitHub 构建 provenance;并将两个文件传给 EmDash 发布 Action。

    工作流位于仓库根目录,并由该仓库中的每个插件包共享。从嵌套包运行 release setup 仍会在根目录写入 .github/workflows/emdash-release.yml。

  4. 打开 发布服务仪表板,使用同一 Atmosphere 账户登录。

    选择 Authorize publishing。你的账户提供商会显示确切的委托权限。保留的授权可以创建包发布记录并上传包或列表图片 blob。它不能创建或编辑包配置文件、更新或删除发布,或写入其他集合。

  5. 启动发布工作流。

    使用 Changesets 时,合并版本拉取请求并让其发布作业完成。Changesets Action 会将其发布的包传给可复用的 EmDash 工作流。普通 npm 包会被忽略;包含 emdash-plugin.jsonc 的包会向 EmDash 发布相同版本。

    使用包标签触发器时,在创建版本标签之前更新包版本。以下命令启动 1.2.3 发布:

    git tag gallery@1.2.3
    git push origin gallery@1.2.3

    你也可以在仓库的 GitHub Actions 页面上选择 Run workflow。

  6. 在首次运行时批准每个仓库 ref 范围。

    服务在创建连接请求之前验证发起包配置文件是否指定了 GitHub 仓库。Action 会在 GitHub 作业摘要中写入链接并等待。打开链接并确认仓库、工作流文件、分支或标签以及环境。

    对于由标签触发的运行,选择 All package version tags 或 Only this tag。手动运行在首次使用其分支时请求批准。确认另一个标签或分支范围会将其添加到仓库连接,而不会移除现有范围。服务存储 GitHub 仓库与所有者 ID,以及已批准的 ref 与环境。后续包仅在其签名配置文件指定同一仓库时才会复用这些范围。

    由较旧生成工作流创建的包批准仍限于其原始包。第一个不匹配的包或 ref 会请求仓库连接;服务不会自动扩大现有包批准。

  7. 在需要时批准发布。

    扩大插件权限的发布,或配置为每次发布都确认的配置文件,会进入 Awaiting approval。从 Action 输出或发布仪表板打开批准 URL。若批准账户尚无通行密钥则注册一个,审查权限变更,并批准或拒绝该发布。

    默认 Action 设置在发布达到 Awaiting approval 时成功返回。服务工作流继续等待浏览器决定,并在批准后发布。

连接 Changesets 工作流

生成的 .github/workflows/emdash-release.yml 通过 workflow_call 接受 Changesets Action 的已发布包 JSON。向现有 Changesets 作业添加输出,然后从依赖作业调用 EmDash 工作流。当现有作业或步骤使用其他 ID 时,替换 release 与 changesets。

Changesets Action v2 使用 published-packages 输出。将以下作业输出与调用方添加到使用 Changesets CLI v3 的工作流:

jobs:
  release:
    # Keep the existing runner, permissions, and steps.
    outputs:
      published: ${{ steps.changesets.outputs.published }}
      published-packages: ${{ steps.changesets.outputs['published-packages'] }}

  publish-emdash-plugins:
    needs: release
    if: needs.release.outputs.published == 'true'
    uses: ./.github/workflows/emdash-release.yml
    with:
      published-packages: ${{ needs.release.outputs['published-packages'] }}
    permissions:
      contents: read
      id-token: write
      attestations: write

Changesets Action v1 使用 camel-case 的 publishedPackages 步骤输出。对使用 Changesets CLI v2 的工作流使用此表达式:

jobs:
  release:
    # Keep the existing runner, permissions, and steps.
    outputs:
      published: ${{ steps.changesets.outputs.published }}
      published-packages: ${{ steps.changesets.outputs.publishedPackages }}

  publish-emdash-plugins:
    needs: release
    if: needs.release.outputs.published == 'true'
    uses: ./.github/workflows/emdash-release.yml
    with:
      published-packages: ${{ needs.release.outputs['published-packages'] }}
    permissions:
      contents: read
      id-token: write
      attestations: write

让 Changesets 负责其版本拉取请求与包发布。仅当 Changesets 报告 published: true 时,EmDash 调用方才运行。对于仅 EmDash 的私有包,在 .changeset/config.json 中将 privatePackages.version 与 privatePackages.tag 都设为 true。将无关的私有应用与测试夹具加入 ignore。

添加另一个包

从其源目录准备包配置文件。现有根工作流与仓库连接会被复用:

pnpm exec emdash-plugin profile setup --dir packages/comments

使用 Changesets 时,将该包加入 changeset 并合并其版本拉取请求。使用包标签触发器时,更新包版本并推送其标签:

git tag comments@1.0.0
git push origin comments@1.0.0

工作流将 comments 解析为一个 emdash-plugin.jsonc,检查所选版本,并在接受制品上传之前验证签名配置文件是否指定了已连接的仓库。重复的包 ID 与版本不匹配会在 attestation 之前失败。

发布服务验证什么

服务在写入发布之前完成这些检查:

  1. GitHub OpenID Connect (OIDC) 令牌指定了已授权的仓库、所有者、工作流、ref、环境、提交、运行与 GitHub 托管的运行器。
  2. 包配置文件存在,由发布者签名,包含 delegated-release 设置,并指定同一规范 GitHub 仓库。
  3. 请求的包与版本与已构建的插件包匹配。
  4. 包校验和与上传的字节匹配。
  5. GitHub provenance 覆盖同一包、仓库、工作流、提交与运行。
  6. 发布记录声明的访问与包清单匹配。
  7. 版本记录尚不存在。
  8. 任何所需的通行密钥批准覆盖确切的验证结果与当前配置文件修订。

Action 为每次服务调用请求新的 GitHub OIDC 令牌。仅在工作流获授权后,包与 provenance 文件才进入私有瞬时存储。服务将已验证的包与图片字节上传到发布者的个人数据服务器 (PDS),在那里创建发布记录,并通过不可变的校验和寻址 URL 公开已验证的 provenance。

权限边界

每种凭证各司其职:

CredentialUsed byAuthority
Local CLI OAuth sessionemdash-plugin profile setupCreate or update the publisher-owned package profile after local confirmation.
GitHub OIDC tokenRelease ActionIdentify one GitHub workflow run to the service. It grants no AT Protocol write access.
Release-service delegationRelease serviceCreate package release records and upload the required blobs.
Publisher application sessionRelease dashboardAuthorise workflow connections and revoke delegated publishing.
Approver session and passkeyApproval pageApprove or reject one checksum-bound release verification.
Cloudflare Access identityService operator consoleOperate the hosted service. It does not represent a publisher or approver.

服务分别存储发布者与批准者状态。登录查看你的发布不会授予运维访问,运维身份也不能以发布者身份批准发布。

Action 行为

生成的工作流使用 apps/release-action 中的 Action。Action 接受已构建的包加原始 Sigstore provenance,或包含校验和绑定 HTTPS 制品源的兼容 release-file。不要将 release-file 与包或 provenance 输入组合。

标准生成工作流提供这些输入。在此显示是为了让你审查生成的文件,而无需推断每个值授权什么:

InputValue
service-urlRelease-service HTTPS origin.
publisher-didDID that owns the package profile and releases.
bundle-fileThe single tarball produced by emdash-plugin release prepare.
provenance-fileRaw bundle-path output from actions/attest-build-provenance.

Action 返回这些输出:

OutputMeaning
connection-urlBrowser URL for first-run workflow approval.
intent-idRelease intent identifier.
statePublished, terminal, or awaiting_approval state.
approval-urlBrowser URL when passkey approval is required.
release-uriPublished release AT URI.
release-cidPublished release record CID.
reason-codeStable reason for a terminal intent.

有关可选输入、自定义 URL 源工作流、轮询控制与确切输出行为,请参见 Action 参考。

故障排除

PACKAGE_PROFILE_REQUIRED

包配置文件缺失、缺少 delegated-release 设置、使用非规范仓库 URL,或指定了与 GitHub 工作流不同的仓库。

使用发布者账户在本地运行配置文件设置,然后重新启动工作流:

pnpm exec emdash-plugin profile setup

此检查在服务接受包或 provenance 上传之前运行。

需要公开仓库

GitHub 对私有与内部仓库使用私有 Sigstore 信任根。发布验证器目前仅信任公开 GitHub provenance。将发布工作流移到公开仓库,或使用 emdash-plugin publish 本地发布。

WORKLOAD_NOT_ALLOWED

GitHub 仓库、所有者、工作流文件、ref 或环境与已批准的工作流策略不匹配。打开发布仪表板,以预期范围批准新的工作流连接。

PROFILE_FETCH_FAILED

服务无法从发布者的 PDS 验证配置文件。在账户提供商可用后重试。若配置文件被移除或更改,运行 emdash-plugin profile setup。

POLL_TIMEOUT

Action 在工作流批准、发布批准或发布完成之前达到了 timeout-minutes。重新运行前在发布仪表板中检查 intent 状态。同一 GitHub Actions 运行的重新运行会复用其幂等密钥。

撤销自动化发布

在发布仪表板中选择 Turn off automated publishing。撤销会清除保留的发布委托。现有包配置文件、发布、审核标签、已安装插件与仪表板登录不会更改。

在下一次自动化发布之前,重新连接发布并再次批准工作流。

相关文档