ワークフローが@v3のようなタグでactionを参照している場合、GitHub Actionsを信頼できるでしょうか?ロックファイルを使うと、後からタグが移動しても、実行されるactionのコミットを特定できます。チームは依存関係の更新を差分で確認し、CIで使われるactionの検証可能な一覧を管理できます。実用上の境界として、ロックファイルが対象とするのはステップから呼び出されるactionです。jobレベルで呼び出される再利用可能なワークフローは、別途固定する必要があります。説明されている仕組みはGitHub Enterprise Cloudで利用できます。

ロックファイルは何を固定するのか?
ブランチやタグへの参照は便利ですが、参照先のバージョンは変わることがあります。uses: octo-org/deploy-action@v3のような記述はタグ名を指定しており、GitHubは実行時にその参照をコミットへ解決します。プロジェクトの所有者がタグを移動させると、依存関係が固定されていない場合、次の実行で別のコードが取得される可能性があります。
GitHubのロックファイルに関するドキュメントによると、ファイル.github/workflows/actions.lockには依存関係への参照と対応するコミットSHAが保存され、他のactionが使用するactionを含む推移的依存関係も記録されます。このファイルはGitHub CLI拡張機能gh actions-lockが作成し、手動では編集しません。
ジェネレーターは、ワークフローファイル内のuses参照を具体化することもできます。たとえば、ロックファイルの作成時点で解決されたコミットを保ったまま、可動タグへの参照をより具体的なものにできます。そのため、導入時にはワークフローとロックファイルの変更を含む差分全体を確認し、チームが実行する意図のあるバージョンが固定されているかを確かめる必要があります。
これにより、依存関係の更新はリポジトリ上で確認できる変更になります。チームはコミットの変更を確認して議論し、通常のレビュー手順で承認できます。ロックファイルはactionのコードを監査し、依存関係の一貫性を保つのに役立ちますが、選択したコードの安全性をそれ自体で証明するものではありません。
固定の対象範囲はどこまでか?
jobs.<job_id>.uses内で呼び出される再利用可能なワークフローは、それを呼び出すリポジトリのロックファイルでは固定されません。再利用可能なワークフローの依存関係は、そのワークフローが定義されているリポジトリに属します。呼び出し自体を固定するには完全なコミットSHAを指定し、そのワークフローが使用するactionを固定するには、元のリポジトリに独自のロックファイルが必要です。

ロックファイルが管理するのはactionのコードであり、actionに渡されるパラメーター、シークレット、runnerのイメージなど、その他のビルド入力は対象外です。ロックファイルが答えるのは、「どのコミットのactionコードが実行されるのか」という具体的な問いです。これらの要素には、それぞれ独自の管理ルールが必要です。
もう一つの例外は、uses: ./のようなパスで呼び出すローカルactionです。GitHubの説明によると、拡張機能gh actions-lockはローカルactionのパスを固定も解析もしません。そのactionが他のactionを使う場合、依存関係は別途管理する必要があります。ドキュメントでは、ローカルactionへの参照を$/形式に移行する方法が説明されています。
つまり、ロックファイルの1件の記録は依存関係チェーンの一部になり得ますが、すべての要素の管理に取って代わるものではありません。外部の再利用可能なワークフローについては、呼び出しが固定されていることと、元のリポジトリの状態を確認してください。ローカルactionについては、その依存関係がどのように扱われているかを確認しましょう。
CIを突然停止させずに管理を導入するには?
GitHubは、選んだリポジトリとワークフローでまず試験導入することを推奨しています。Require lockfileポリシーを有効にすると、uses:依存関係がないワークフローも含め、正しいロックファイルがない対象ワークフローの実行がブロックされます。ポリシーのEvaluateモードはGitHub Enterprise Cloudでのみ利用できます。そのため、まず対象範囲と自動更新を整え、その後で必須ルールを有効にしてください。
- 元の参照を確認する。ロックファイルを作成する前に、actionがチームの固定したいバージョンを指していることを確認します。ジェネレーターは、現在の参照から解決されたコミットを固定します。
- ロックファイルを作成してレビューする。
gh-actions-lock拡張機能をインストールし、リポジトリのルートでgh actions-lockを実行して、書き換えられたuses参照も含めた差分全体を確認します。 - 更新と検証を設定する。Dependabotは、すでに接続されているワークフローの該当する記録を更新できます。CIでは、pull requestに対する検証ジョブで
gh actions-lock --verifyを設定し、主要なビルドの前にロックファイルの古さを検出できます。 - レビュアーを割り当てる。
.github/workflows/actions.lockをCODEOWNERSに追加し、ビルドセキュリティの担当者による変更確認を必須にします。 - ポリシーを試験導入する。接続済みのリポジトリとワークフローから始めます。Evaluateで結果を分析し、Activeモードに切り替える前に、すべての対象ワークフローが準備済みで、ロックファイルも最新であることを確認します。
Require lockfileと、完全な長さのコミットSHAへの固定を求める別のポリシーであるRequire actions to be pinned to a full-length commit SHAは異なるルールです。GitHubによると、両方を同時に維持できます。CIでの検証と必須ポリシーもそれぞれ役割が異なります。前者はpull requestの作業中に古いファイルを検出し、後者は要件を満たさないワークフローの実行をブロックします。
例:デプロイactionの更新
ワークフローがocto-org/deploy-action@v3を使ってアプリケーションを公開するとします。まずチームは、その参照がどのバージョンに解決されるかを確認し、次にgh actions-lockを実行して、ワークフローの差分とロックファイル内のコミット記録をまとめて確認します。actionを更新すると、レビュアーは参照と固定されたコミットの変更を確認できます。これにより、可動タグが常に同じコードを指すと想定せず、具体的な更新内容を評価できます。
別のリポジトリにある再利用可能なワークフローがデプロイを実行する場合、ローカルのロックファイルはその依存関係を対象としません。再利用可能なワークフローへの参照を完全なSHAで固定し、元のリポジトリが独自のaction依存関係を管理していることを確認してください。大規模な組織では、この方法で個別のルールを検証可能なプロセスにまとめつつ、パラメーター、シークレット、runnerは別途管理できます。
ロックファイルは、actionのコードを管理する仕組みとして役立ちます。推移的依存関係を含め、バージョンと更新を確認しやすくします。対象範囲を適切に保つには、再利用可能なワークフローとローカルactionも確認し、更新を自動化したうえで、試験導入後にのみ必須ポリシーを有効にしてください。