Skip to content
Apothem
ランブック

リリース復旧ランブック

追加型リリースモデルのもとで、途中で失敗したリリースを、公開済みの履歴を書き換えずにステージごとに復旧する手順。

このランブックは、ahmed-g-gad/apothem の vX.Y.Z リリースが途中で失敗したときに、動作する状態を復元します。 リリースサイクルランブックと同じリリースモデル、すなわち追加型モデルに従います。 各リリースは main に 1 つのコミットと、署名付きの注釈付きタグを 1 つ追加します。タグのプッシュによって、リリースワークフローと npm ワークフローが実行されます。 何も強制プッシュされることはなく、main の履歴が書き換えられることは決してありません。

公開済みの履歴は恒久的です。 プロジェクトが公開したすべてのリリースタグ、GitHub Release、npm バージョンは公開されたままです。 npm のバージョンは不変です。公開済みの name@version は決して置き換えられず、公開が取り消されたバージョン番号は二度と使用できません。 したがって、復旧は新しいパッチリリースによって前に進みます。ユーザーがすでにインストールしている可能性のあるものを削除したり、付け替えたりはしません。

1. ステージの分類

ステージアクション失敗モード復旧パス
1リリースコミットを main に着地させる(リリースサイクルランブックの §2.1)リリースコミットで CI が失敗するmain への別のコミットで前方修正する。CI がグリーンになるまでタグを付けない
2署名付きの注釈付きタグをプッシュするプッシュが拒否される、またはタグが署名されていないか誤ったコミット上にある下記の §2
3release.yml が GitHub Release をビルド、署名、公開するジョブが失敗する、またはアセットが欠落している下記の §3
4publish-npm.yml が @ahmed-g-gad/apothem を公開する(同じタグのプッシュで実行される)公開が失敗する下記の §3
5Pages とリポジトリのメタデータサイトまたはメタデータが古い下記の §3

すべての復旧アクションは冪等です。 クリーンな状態で実行しても何も起こりません。部分的な状態で実行すると、期待されるステージ後の状態が復元されます。

2. タグの復旧

タグを診断します。

git fetch origin --tags
git ls-remote origin refs/tags/vX.Y.Z
git cat-file -t vX.Y.Z      # "tag" for an annotated tag
git tag -v vX.Y.Z           # signature check

何をすべきかは、そのタグから何かが公開されたかどうかによって決まります。

  • まだ何も公開されていない場合(リリースワークフローが publish ジョブより前に失敗し、かつ publish-npm.yml が公開しなかった): タグを削除し、同じコミットに -a -s で再度タグを付けます。

    git push --delete origin vX.Y.Z
    git tag -d vX.Y.Z
    git tag -a -s vX.Y.Z -m "vX.Y.Z" <release-commit-sha>
    git push origin vX.Y.Z
  • 何かが公開された場合(アセット付きの GitHub Release、または npm バージョン): タグを移動、削除、再利用することは決してしないでください。 vX.Y.(Z+1) で前方修正します。

タグ名が別のコミットに再利用されることは決してありません。

3. パブリッシャーの復旧

各パブリッシャーは個別に再試行します。

面診断復旧
リリースワークフローgh run view <run-id> --log が失敗したジョブを示すgh run rerun <run-id> --failed。Check the plugin version changed with the plugin での失敗は、バージョンが引き上げられていなかったことを意味する。リリースサイクルランブックの障害表を参照
GitHub Releasegh release view vX.Y.Z --json tagName,isDraft,isPrerelease,assetspublish GitHub Release ジョブを再実行する。このジョブは既存のリリースを編集し、--clobber でアセットを再アップロードする
npmnpm view @ahmed-g-gad/apothem version と npx @ahmed-g-gad/[email protected] --versionパッケージの npm Trusted Publishing を確認したうえで、vX.Y.Z に対して publish-npm.yml を再実行する(gh workflow run publish-npm.yml --field tag=vX.Y.Z)。npm のバージョンは不変であるため、バージョンがすでにレジストリにある場合、ワークフローは公開をスキップする
Pagesgh run list --workflow=publish-static-site.yml --limit=1 と curl -sSI https://apothem.ahmedgad.com/publish-static-site.yml を再実行する。CNAME が引き続き ahmed-g-gad.github.io に解決されることを検証する
リポジトリのメタデータgh repo view ahmed-g-gad/apothem --json description,homepageUrl,repositoryTopics,visibility説明、ホームページ、トピックをその場でパッチする。リポジトリを決して再作成しない

4. ロールバック

不良リリースは、それを削除することによってではなく、その修正をリリースすることによってロールバックします。

  1. 問題のあるコミットを main 上でリバートします(通常のリバートコミット)。

  2. リリースサイクルランブックに従って vX.Y.(Z+1) をカットします。

  3. 不良バージョンに印を付けます。その CHANGELOG.md セクションに ### Yanked の注記を追加し、その GitHub Release のノートを修正版を指すように編集し、npm 上で非推奨にします。

    npm deprecate @ahmed-g-gad/[email protected] "Contains <defect>; use X.Y.(Z+1)"

不良なタグ、GitHub Release、npm バージョンは公開されたままなので、ピン留めされたインストールと再現可能なビルドは引き続き解決されます。 ロールバックはリリースインシデントとして記録してください。

5. リリースファサードルール

リポジトリのリリースファサードルール(コントリビューター向け指示の Release Facade セクション)は、上記の追加型モデルを述べています。 公開済みのタグ、GitHub Release、npm バージョンは、いずれも公開されたままです。 「現在のバージョンのみ」という要件が対象とするのは、公開面が示す内容です。 このランブックは、公開済みのタグ、GitHub Release、npm バージョンを削除したり書き換えたりすることは決してありません。

6. 相互参照

On this page