Repository navigation
ci: release apple-mail as a packaged CLI - #8
Merged
Merged
Conversation
Pin actions/checkout to v6.1.0, setup-rust-toolchain to v1.17.0, and Rust to 1.98.1, and run tests with --locked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add Release Please config and a workflow that builds the cargo-dist archive on a macOS runner, smoke-tests it, attests its provenance, and uploads the archive, checksums, and shell installer to the release. The flake now reads its version from Cargo.toml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Release Please now creates draft releases with forced tag creation, and the artifact job publishes the release only after tests, build, smoke test, attestation, and uploads succeed, so the latest installer URL never points at missing files. Manual rebuilds must run on the tag itself, and the job fails unless the checked-out commit equals the run's commit, so attestations record the tagged commit instead of main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 of 6 tasks
furedea
added a commit
that referenced
this pull request
Oct 20, 2026
## 概要 - **Release PR #10(0.1.1)はこの PR より先にマージしないこと**.main の現行ワークフローのままリリースすると,以下の問題を抱えたまま 0.1.1 が出る. - 成果物のビルドを `release_artifacts.yml` に分け,release-please がタグ上で起動する.自動でも手動でも同じ経路を通るため,draft が取り残されなくなる.成果物ワークフローは draft の Release にしか触れない. - 公開は REST API で `draft` を boolean の `false`,`make_latest` を `legacy` として送り,古いタグの実行が後から終わっても新しい版の latest を奪わない. ```mermaid flowchart LR A[main へ push] --> B[release-please] B -->|Release PR のマージ後| C[タグと draft Release] C --> W[gh workflow run release_artifacts.yml --ref タグ] M[失敗した draft の再開] --> W W --> V[ref,HEAD,draft の検証] V --> D[テスト,ビルド,スモークテスト,attestation,アップロード] D --> P[gh api PATCH -F draft=false -f make_latest=legacy で公開] ``` | 項目 | 変更前(#8 時点の main) | 変更後 | |---|---|---| | 成果物のビルド | `release_please.yml` 内の後続ジョブ | `release_artifacts.yml` をタグ上で `workflow_dispatch` 起動 | | 自動と手動の経路 | 自動は push の実行内,手動は `release_please.yml` の `workflow_dispatch` | どちらも `gh workflow run release_artifacts.yml --ref <tag> -f tag_name=<tag>` | | 後続 push との競合 | マージコミットの実行が後続 push に置き換わると,ガードで失敗して draft が残る | タグ上で動くので `GITHUB_SHA` は常にタグのコミット | | 公開済み Release の再ビルド | `--clobber` で上書きできてしまう | ビルド前に `isDraft` を確認し,draft でなければ失敗 | | 公開と latest | `gh release edit --draft=false`(make_latest は true 扱い) | `gh api -X PATCH .../releases/<id> -F draft=false -f make_latest=legacy`(`draft` は boolean) | ## 受け入れ条件 - [ ] この PR をマージしてから Release PR #10 をマージする - [ ] #10 のマージ後,`release_please.yml` が `release_artifacts.yml` をタグ上で起動し,成果物のアップロード後に Release が公開される - [ ] 公開後の latest が最新の版を指し,README の `releases/latest/download` のインストーラーが最新版を配る - [x] `release_artifacts.yml` はタグ以外の ref,HEAD と `GITHUB_SHA` の不一致,公開済みの Release でビルド前に失敗する - [x] 公開ステップは `draft` を boolean(`-F draft=false`),`make_latest` を `legacy` として送り,`gh release edit` を使わない - [x] CONTRIBUTING.md に draft の再開手順を記載し,公開済みの Release は作り直さないことを明記する <details> <summary>詳細</summary> **経緯** #8 のレビュー(Codex)で見つかった 2 件と,この PR のレビューで見つかった 2 件の修正.#8 は修正前の `eee0747` の時点で squash マージされたため,修正コミットを main の上に cherry-pick して出し直した. **1. [high] 公開済み Release の作り直し** - `gh release upload --clobber` は各アセットを消してから上げ直す.公開済みの Release を手動で作り直すと,途中のネットワーク障害でファイルが欠けたまま公開状態になり,README の `releases/latest` のインストーラー URL が壊れる - `Verify release target` ステップで `gh release view "$TAG_NAME" --json isDraft --jq .isDraft` が `true` でなければ失敗する **2. [medium] draft の取り残し** - 一つのワークフロー内では,Release PR のマージコミット R の待機中の実行が後続の push S に置き換わると,S の実行は HEAD=R,`GITHUB_SHA`=S となってガードで失敗する.release-please は PR を tagged 済みにしているため以後 `release_created` は立たず,draft が残る - `release_please.yml` は draft とタグを作るだけにし,`release_created` のときに `gh workflow run release_artifacts.yml --ref "$TAG_NAME" -f tag_name="$TAG_NAME"` を実行する.ジョブには既存の権限に加えて `actions: write` を付け,`GITHUB_TOKEN` で起動する(`workflow_dispatch` は `GITHUB_TOKEN` からでも新しい実行を作れる) - `release_artifacts.yml` は `workflow_dispatch` のみで,concurrency はタグごと.ref と SHA のガードは維持する **3. [medium] 古い版が latest を奪う問題(`ef18660`)** - タグごとの concurrency では,v0.1.1 の実行が v0.1.2 の公開後に終わりうる.`make_latest` を指定せずに公開すると true 扱いになり,古い版が latest になって README のインストーラーが古い版を配る - `Publish release` ステップで `gh release view "$TAG_NAME" --json databaseId` から ID を取り,REST API の PATCH で `make_latest=legacy` を指定して公開する.`legacy` では GitHub が作成日時と semver から latest を選ぶ **4. [high] `draft` が文字列で送られる問題(`814caa9`)** - `gh api -f draft=false` は JSON の文字列 `"false"` を送るが,Release API は boolean を要求する - `draft` は typed の `-F draft=false` で送る(`gh api` の `-F` は `true`,`false`,`null`,整数を JSON の型に変換する).`make_latest` は文字列なので `-f make_latest=legacy` のまま **変更ファイル** - `.github/workflows/release_please.yml`:成果物ジョブを外し,起動ステップを追加 - `.github/workflows/release_artifacts.yml`:新規(ガード,`-F draft=false -f make_latest=legacy` の公開ステップを含む) - `CONTRIBUTING.md`:Release 節 **ローカル検証** - `Verify release target` の本体をコミット済みのワークフローから取り出し,`/bin/bash` 3.2 と偽の `gh` で 6 ケース検証(ref が main,別タグ,SHA 不一致,公開済み,draft 状態が空は失敗,タグ上で SHA 一致かつ draft は成功) - `Publish release` の本体を同様に取り出し,呼び出しを記録する偽の `gh` で 4 ケース検証(終了コード 0,`api -X PATCH repos/furedea/apple-mail-cli/releases/4242 -F draft=false -f make_latest=legacy` が 1 回,`release edit` は 0 回,`-f draft=` は 0 回).`-f draft=false` の時点では 2 件失敗,修正後は 4 件成功 - `actionlint`,`zizmor --offline`:指摘なし **CI や実リリースでしか確認できないこと** - `GITHUB_TOKEN` による `gh workflow run --ref <tag>` の起動 - draft Release への `gh release view`/`upload` と `gh api PATCH` による公開,`make_latest=legacy` での latest の選ばれ方 **その他** - `RELEASE_PLEASE_TOKEN` は登録済み(#10 が作られている).この PR で必要な権限の追加はない - 古いリモートブランチ `ci/release-packaged-cli` は不要で,削除してよい </details> Refs #7, #8, #10 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: furedea <132188853+furedea@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Closed
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
Release Artifactsワークフローを起動する.macOS ランナーでaarch64-apple-darwinの cargo-dist アーカイブをビルド,検証,attestation,アップロードし終えてから Release を公開する.RELEASE_PLEASE_TOKENの登録が必要.未登録のままマージすると release-please ジョブが失敗する.release_artifacts.ymlをタグ上で起動(自動・手動で同じ経路).sha256,sha256.sum,source.tar.gz,シェルインストーラーactions/attest-build-provenance.常にタグのコミットを記録cargo install --path .,nix runcargo install --locked --git,nix profile installstable,cargo testcargo test --locked受け入れ条件
RELEASE_PLEASE_TOKENシークレットを登録する(下記「シークレット登録」参照)release-please-config.jsonと.release-please-manifest.json(0.1.0)を追加cargo test --lockedとビルドが通り,アーカイブでapple-mail --versionが成功する(ローカルのdist buildでは確認済み).sha256,インストーラーが添付され,gh attestation verifyが通るgh workflow run release_artifacts.yml --ref <tag> -f tag_name=<tag>で再開できる.タグ以外の ref や公開済みの Release では失敗する詳細
シークレット登録
GITHUB_TOKENで作った Release PR では CI が起動しないため,agent-harness と同じく PAT を使う.RELEASE_PLEASE_TOKEN(リポジトリシークレット)furedea/apple-mail-cliのみgh secret set RELEASE_PLEASE_TOKEN --repo furedea/apple-mail-cli成果物ワークフローの起動には
GITHUB_TOKEN(actions: write)を使う.workflow_dispatchはGITHUB_TOKENからでも新しい実行を作れるので,PAT の権限を増やす必要はない.ワークフローの構成
release_please.yml(main への push):release-please で Release PR,タグ,draft Release を作る.release_createdのときだけgh workflow run release_artifacts.yml --ref "$TAG_NAME" -f tag_name="$TAG_NAME"を実行するrelease_artifacts.yml(workflow_dispatchのみ):テスト,ビルド,スモークテスト,attestation,アップロード,公開.concurrency はタグごとGITHUB_SHA=S となってガードで失敗する.release-please は PR を tagged 済みにしているので,以後release_createdは立たず draft が取り残される.タグ上で起動すればGITHUB_SHAは常にタグのコミットになるdraft から公開までの流れ
release-please-config.jsonに"draft": trueと"force-tag-creation": trueを設定.draft でもタグがすぐ作られるため,成果物ワークフローをタグ上で起動でき,次回の release-please も前回リリースを見つけられる(force-tag-creationは release-please v17.2.0 で追加,固定中の action v4.4.1 は^17.3.0を同梱)autorelease: pending→tagged)でリリース作成を判断するため,draft でも重複作成しないgh release edit "$TAG_NAME" --draft=falseを実行.途中で失敗すれば draft のまま残り,README のreleases/latestの URL が欠けた成果物を指すことはないVerify release targetステップ(checkout 直後,ビルド前)GITHUB_REFがrefs/tags/$TAG_NAMEでなければ失敗し,正しいコマンドを表示するGITHUB_SHAと一致しなければ失敗するgh release view "$TAG_NAME" --json isDraftがtrueでなければ失敗する.--clobberは各アセットを消してから上げ直すため,公開済みの Release を作り直すとネットワーク障害で欠けた Release が残りうる変更ファイル
.github/workflows/release_please.yml,.github/workflows/release_artifacts.yml(ともに新規),release-please-config.json,.release-please-manifest.jsonCargo.toml:[profile.dist],[workspace.metadata.dist](targetaarch64-apple-darwin,shell installer,cargo-dist 0.30.2)flake.nix:version を Cargo.toml から読む.github/workflows/{ci,codeql,dependency_review,gha_lint}.yml:ピンそろえ,cargo test --locked.ls-lint.yml:慣習名のCONTRIBUTING.md,CHANGELOG.md,release-please-config.jsonを除外README.md,CONTRIBUTING.mdagent-harness との差分
macos-15,musl/apt 手順なし,リリースジョブで JXA チェック(pnpm run check)も実行/bin/bashは 3.2 でmapfileがないため,アップロード一覧はwhile readで配列化ローカル検証
cargo test --locked,cargo fmt --check,cargo clippy --locked --all-targets -- -D warnings:成功pnpm run check,nixfmt,statix,deadnix,ls-lint,commitlint:成功nix flake check:成功,nix build .#でapple-mail-cli-0.1.0をビルドactionlint,zizmor --offline:指摘なしVerify release targetの本体を/bin/bash3.2 と偽のghで 6 ケース検証(ref が main,別タグ,SHA 不一致,公開済み,draft 状態が空は失敗,タグ上で SHA 一致かつ draft は成功)cargo-dist-versionのみ合わせる)でdist planと,ワークフローと同じdist build手順を実行し,アーカイブ展開後のapple-mail --version/--helpとshasum -a 256 -cが成功.アップロード対象は 6 ファイルCI や実リリースでしか確認できないこと
apple-mail-cli-vX.Y.Zを想定)GITHUB_TOKENによるgh workflow run --ref <tag>の起動,draft Release へのgh release view/upload/edit --draft=false,公開後の latest の切り替わり,attestationfeatコミットとbump-patch-for-minor-pre-majorにより 0.1.1 が提案される見込み除外
Closes #7
🤖 Generated with Claude Code