自动化发布会在你推送版本标签或手动启动 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
设置自动化发布
-
使用拥有该包的 Atmosphere 账户登录插件 CLI。
pnpm exec emdash-plugin login alice.example.comCLI 将此本地发布会话存储在项目之外。GitHub Actions 永远不会收到它。
-
从插件目录准备包配置文件并生成工作流。
pnpm exec emdash-plugin release setup该命令从
emdash-plugin.jsonc读取包元数据。若缺少包配置文件,会提议创建。若配置文件存在但没有 delegated-release 设置,会提议添加它们,同时保留现有包元数据。在 monorepo 中,在插件包内运行该命令,或传入
--dir <plugin-directory>。若清单不含repo,设置会检测 GitHuborigin远程并预填仓库提示。设置会询问何时需要批准发布:
- 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以要求每次发布都经批准。 -
审查并提交生成的工作流。
该命令创建
.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。 -
打开 发布服务仪表板,使用同一 Atmosphere 账户登录。
选择 Authorize publishing。你的账户提供商会显示确切的委托权限。保留的授权可以创建包发布记录并上传包或列表图片 blob。它不能创建或编辑包配置文件、更新或删除发布,或写入其他集合。
-
启动发布工作流。
使用 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。
-
在首次运行时批准每个仓库 ref 范围。
服务在创建连接请求之前验证发起包配置文件是否指定了 GitHub 仓库。Action 会在 GitHub 作业摘要中写入链接并等待。打开链接并确认仓库、工作流文件、分支或标签以及环境。
对于由标签触发的运行,选择 All package version tags 或 Only this tag。手动运行在首次使用其分支时请求批准。确认另一个标签或分支范围会将其添加到仓库连接,而不会移除现有范围。服务存储 GitHub 仓库与所有者 ID,以及已批准的 ref 与环境。后续包仅在其签名配置文件指定同一仓库时才会复用这些范围。
由较旧生成工作流创建的包批准仍限于其原始包。第一个不匹配的包或 ref 会请求仓库连接;服务不会自动扩大现有包批准。
-
在需要时批准发布。
扩大插件权限的发布,或配置为每次发布都确认的配置文件,会进入 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 之前失败。
发布服务验证什么
服务在写入发布之前完成这些检查:
- GitHub OpenID Connect (OIDC) 令牌指定了已授权的仓库、所有者、工作流、ref、环境、提交、运行与 GitHub 托管的运行器。
- 包配置文件存在,由发布者签名,包含 delegated-release 设置,并指定同一规范 GitHub 仓库。
- 请求的包与版本与已构建的插件包匹配。
- 包校验和与上传的字节匹配。
- GitHub provenance 覆盖同一包、仓库、工作流、提交与运行。
- 发布记录声明的访问与包清单匹配。
- 版本记录尚不存在。
- 任何所需的通行密钥批准覆盖确切的验证结果与当前配置文件修订。
Action 为每次服务调用请求新的 GitHub OIDC 令牌。仅在工作流获授权后,包与 provenance 文件才进入私有瞬时存储。服务将已验证的包与图片字节上传到发布者的个人数据服务器 (PDS),在那里创建发布记录,并通过不可变的校验和寻址 URL 公开已验证的 provenance。
权限边界
每种凭证各司其职:
| Credential | Used by | Authority |
|---|---|---|
| Local CLI OAuth session | emdash-plugin profile setup | Create or update the publisher-owned package profile after local confirmation. |
| GitHub OIDC token | Release Action | Identify one GitHub workflow run to the service. It grants no AT Protocol write access. |
| Release-service delegation | Release service | Create package release records and upload the required blobs. |
| Publisher application session | Release dashboard | Authorise workflow connections and revoke delegated publishing. |
| Approver session and passkey | Approval page | Approve or reject one checksum-bound release verification. |
| Cloudflare Access identity | Service operator console | Operate 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 输入组合。
标准生成工作流提供这些输入。在此显示是为了让你审查生成的文件,而无需推断每个值授权什么:
| Input | Value |
|---|---|
service-url | Release-service HTTPS origin. |
publisher-did | DID that owns the package profile and releases. |
bundle-file | The single tarball produced by emdash-plugin release prepare. |
provenance-file | Raw bundle-path output from actions/attest-build-provenance. |
Action 返回这些输出:
| Output | Meaning |
|---|---|
connection-url | Browser URL for first-run workflow approval. |
intent-id | Release intent identifier. |
state | Published, terminal, or awaiting_approval state. |
approval-url | Browser URL when passkey approval is required. |
release-uri | Published release AT URI. |
release-cid | Published release record CID. |
reason-code | Stable 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。撤销会清除保留的发布委托。现有包配置文件、发布、审核标签、已安装插件与仪表板登录不会更改。
在下一次自动化发布之前,重新连接发布并再次批准工作流。
相关文档
- Bundling and publishing 涵盖本地发布与包验证。
- The plugin manifest 定义包元数据与声明的访问。
- Capabilities and security 说明在发布批准与安装期间审查的权限。
- The plugin registry 说明发现、审核与安装验证。