プラグインの自動リリース

このページ

自動リリースは、バージョンタグをプッシュしたとき、または GitHub Actions ワークフローを手動で開始したときに、サンドボックスプラグインをビルドして公開します。Atmosphere アカウントは引き続きパッケージプロファイルとリリース記録の所有者です。GitHub が承認済みワークフローを識別し、リリースサービスがビルドを検証して、狭い委任を通じてリリースを書き込みます。リポジトリに Atmosphere アカウントの資格情報は保存されません。

コンピューターから開始するリリースには emdash-plugin publish を使用します。GitHub Actions がリリースをビルドおよび公開する場合はこのガイドを使用します。

前提条件

開始前に次を用意してください。

  • サンドボックス化された EmDash プラグインを含む公開 GitHub リポジトリ。
  • 開発依存関係としてインストールされた @emdash-cms/plugin-cli。CLI で作成したプラグインにはすでに含まれています。
  • slug、publisher、license、著者、セキュリティ連絡先を含む有効な emdash-plugin.jsonc。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 設定がない場合は、既存のパッケージメタデータを保持したまま追加を提案します。

    モノレポでは、プラグインパッケージ内でコマンドを実行するか、--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 なしのリリースを許可する場合は --provenance optional を、すべてのリリースで承認を要求する場合は --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 バージョンを実行し、各パッケージをマニフェストから解決し、1 つのプラグインバンドルをビルドし、その正確なバイトに対する 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 に任せます。EmDash の呼び出し側は Changesets が published: true を報告したときのみ実行されます。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 を 1 つの 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 を公開します。

権限の境界

各資格情報には 1 つの役割があります。

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.

サービスはパブリッシャーと承認者の状態を別々に保存します。リリースを表示するためのサインインはオペレーターアクセスを付与せず、オペレーターの ID はパブリッシャーとしてリリースを承認できません。

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 を選択します。取り消しは保持されたリリース委任をクリアします。既存のパッケージプロファイル、リリース、モデレーションラベル、インストール済みプラグイン、ダッシュボードのログインは変更されません。

次の自動リリースの前に、公開を再接続し、ワークフローを再度承認してください。

関連ドキュメント