jsonscraper
市場
ジャーナルに戻る

GitHub Actionsのロックファイルは実行コードを固定するが、CI全体は固定しない

新しい仕組みでactionのバージョンを固定する方法、その保護範囲の限界、必須化の前に確認すべきこと

編集方針 誤りを報告する

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

記事:GitHub Actionsのロックファイルは実行コードを固定するが、CI全体は固定しない
概要:GitHub ActionsのロックファイルはactionをコミットSHAで固定し、推移的依存関係も記録します。ただし、再利用可能なワークフローやローカルaction、その他のビルド入力は別途管理が必要です。
画像の役割:カバー — 中心となる考え方
セクション:
ビジュアルの内容:編集記事風の写真スタイルの概念図。分岐するコード依存関係のグラフが、半透明のロックファイルカード上に正確なコミットハッシュのラベルとして印字され、その横に別の
ロックファイルはactionのコミットを固定し、再利用可能なワークフローは別途固定する必要があります。© jsonscraper · AI生成

ロックファイルは何を固定するのか?

ブランチやタグへの参照は便利ですが、参照先のバージョンは変わることがあります。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を固定するには、元のリポジトリに独自のロックファイルが必要です。

記事:GitHub Actionsのロックファイルは実行コードを固定するが、CI全体は固定しない
概要:GitHub ActionsのロックファイルはactionをコミットSHAで固定し、推移的依存関係も記録します。ただし、再利用可能なワークフローやローカルaction、その他のビルド入力は別途管理が必要です。
画像の役割:補足図2 — 別の具体的な側面
セクション:固定の対象範囲はどこまでか?
ビジュアルの内容:GitHub Actionsの保護範囲を示すロシア語の技術インフォグラフィック。ワークフローステップのactionと、それらの
この図は、ロックファイルの対象となるものと、チームが別途管理するものを示しています。© jsonscraper · AI生成イラスト

ロックファイルが管理するのは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でのみ利用できます。そのため、まず対象範囲と自動更新を整え、その後で必須ルールを有効にしてください。

  1. 元の参照を確認する。ロックファイルを作成する前に、actionがチームの固定したいバージョンを指していることを確認します。ジェネレーターは、現在の参照から解決されたコミットを固定します。
  2. ロックファイルを作成してレビューする。gh-actions-lock拡張機能をインストールし、リポジトリのルートでgh actions-lockを実行して、書き換えられたuses参照も含めた差分全体を確認します。
  3. 更新と検証を設定する。Dependabotは、すでに接続されているワークフローの該当する記録を更新できます。CIでは、pull requestに対する検証ジョブでgh actions-lock --verifyを設定し、主要なビルドの前にロックファイルの古さを検出できます。
  4. レビュアーを割り当てる。.github/workflows/actions.lockをCODEOWNERSに追加し、ビルドセキュリティの担当者による変更確認を必須にします。
  5. ポリシーを試験導入する。接続済みのリポジトリとワークフローから始めます。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も確認し、更新を自動化したうえで、試験導入後にのみ必須ポリシーを有効にしてください。

人々

この記事にはまだ人物がリストされていません。

読み続けてくださいGitHub CLIに有効期限付きOAuthトークンが追加:有効化と連携の確認方法
次の記事を読む

読んだ内容を実用的な連携へ

jsonscraperのソーシャルデータAPIを調べ、リクエストを試し、次のワークフローを構築しましょう。

APIを探す