「lockfile missing pin for …」:GitHub Actions のワークフローのロックファイル(actions.lock)、Set up job で落ちるジョブ、ロックファイルの作り直し方
2026年10月28日から、リポジトリはワークフローが使うアクションと、そのアクションが使うアクションを、.github/workflows/actions.lock に固定できます(GitHub の changelog・パブリックプレビューは10月14日から)。このファイルは GitHub CLI の拡張機能 gh actions-lock が作り、ワークフローは1つずつ載せられます。ワークフローを載せると、GitHub Actions はロックファイルに記録したコミットを動かし、そのワークフローが使うアクションのすべてにエントリが要ります。1つでも欠けると、実行はたいていステップの前で止まります。直すには、ロックファイルを手で書き換えるのではなく、gh actions-lock をもう一度実行し、ワークフローとロックファイルを一緒にコミットします。
見え方
ほかのアクションが呼ぶアクションにエントリが無いと、ワークフローのすべてのジョブが Set up job で、そのアクションと参照を挙げて失敗します(msgvault #1740・2026年11月2日):
##[error]lockfile missing pin for actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
このリポジトリでは、1つのマージのあと、main とすべてのプルリクエストの実行が、変更の中身に関係なくこの形で失敗し、再実行しても通りませんでした。呼ぶ側のアクションが別のリポジトリのものなら、ログにはまずそのダウンロードが出ます(cicd-suite #33):
Download action repository 'hyperpolymath/cicd-suite@c5270b0e0a0a7177d6ee77fc4451f38978b612f0' ##[error]lockfile missing pin for hyperpolymath/deed-ecosystem@f9d999b60cb5f383679ea19912bcdc49c944973a
ワークフロー自身の uses: の行にエントリが無いと、実行はジョブが始まる前に、ロックファイルに無いアクションを参照する不正なワークフローファイルとして失敗し(metadatastician/standards #784)、実行にはジョブが1つもありません(statistikles #117)。どちらもパブリックプレビューより前の報告です。
./ のパスで使うアクションは例外です。それがエントリの無いアクションを呼ぶと、ジョブはそのステップに来たところで失敗し、その前のステップはもう動いています、と GitHub のドキュメントにあります。
なぜ
ロックファイルには2つの節があります。workflows は載せた各ワークフローが使う参照の一覧、dependencies は参照ごとのタグかブランチ、コミット、リポジトリの数字の owner_id と repo_id です。エントリのキーは owner/repo@ref なので、同じコミットでも別の ref(タグでなく SHA)にはエントリがありません。msgvault では、ロックファイルにあるのは actions/cache@v6.1.0 で、リポジトリの2つのコンポジットアクション($/.github/actions/go-cache-restore と $/.github/actions/go-cache-save として呼ぶ)が使っていたのは actions/cache/restore@55cc8345… # v6.1.0、つまり同じコミットを SHA で書いたものでした。
こうなるよくある形:
uses:の行を、手で、または道具で足したり変えたりして、gh actions-lockを実行しなかった。Dependabot は例外で、載せたワークフローのバージョン更新では、同じプルリクエストで合うエントリを作り直します。まだロックファイルに無いワークフローを載せることはしません。$/で呼ぶリポジトリのコンポジットアクションが、呼ぶアクションを変えた。それが呼ぶアクションも同じロックファイルを使うので、参照はそのキーと合っている必要があります。- 拡張機能がエントリを落とした。既存のロックファイルをバージョン 0.2.0 と 0.4.0 で更新すると、コンポジットアクションが
DeterminateSystems/nix-installer-action@v23として呼ぶアクションが、ロックファイルに小文字ですでに載っていたときに落ち、ランナーは「lockfile missing pin」で止まりました。0.4.0 の--verifyはこれをincomplete-lockfileとして出し、gh actions-lock --relockで戻ります(gh-manage #71・日本語)。
直し方
リポジトリのルートで:
gh extension upgrade gh-actions-lock gh actions-lock --verify gh actions-lock
--verify はファイルを1つも変えずに同じ確認をし、問題ごとに種類を出します(下)。引数なしの実行は、欠けたエントリを足し、どのワークフローも使わないエントリを消します。uses: の行を解決したバージョンに書き換えることもあり、@v3 が同じコミットの @v3.1.0 になります。差分を全部見てから、ワークフローとロックファイルを一緒にコミットします。
または、uses: の行を、ロックファイルにすでにある参照に合わせます。msgvault はこちらで直しました(msgvault #1727):
- uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + uses: actions/cache/restore@v6.1.0
拡張機能の問題解決のガイドは、ロックファイルを手で書き換えないこと(参照と合わないエントリは拡張機能が断ります)、エラーを消すために消さないことを挙げています。固定した参照はそのまま残るので、ファイルが無いと、すべての参照がいま指すコミットへ解決し直され、動いたタグも警告なしに受け入れられます。変更を戻すには、既定のブランチ(ここでは main)から戻して作り直します:
git fetch origin git checkout origin/main -- .github/workflows/actions.lock gh actions-lock
./ のパスで使うアクションがほかのアクションを呼んでいると、拡張機能は local-action のエラーを出し、何も書きません。gh actions-lock --migrate-local-actions は ./ を $/ に書き換え、アクションをワークフローのコミットで動かし、それが呼ぶものを固定します。--ignore-local-actions は ./ のまま残し、それが呼ぶものにはエントリが付きません。
gh actions-lock --verify が出すもの
問題にはそれぞれ見出しと種類があります。終了コードは、エラーが残っていなければ 0、止める問題があれば 1、読めないロックファイルなど道具そのものが失敗したら 2 です。gh-actions-lock のリポジトリの問題解決のガイドから:
- 「Not pinned」(
not-pinned):uses:の依存にエントリが無いか、「workflow has no lockfile entry」と出る。gh actions-lockを実行します。 - 「Ref changed」(
ref-changed):uses:の行が、たとえばv6.2.0からv6に変わり、ロックファイルは古いまま。gh actions-lockを実行するか、行を戻します。 - 「Pinned commit not in upstream history」(
unreachable-pin):固定したコミットが、強制プッシュ、動いたタグ、書き換えたエントリのどれかで、参照の履歴に無くなった。先に上流の履歴を見比べ、そのうえでgh actions-lock --accept-moved。自動化では使いません。どのタグにもブランチにも含まれない完全な SHA のuses:も同じエラーになります。フォークにしか無いコミットかもしれないからです。 - 「Locked commit isn't the tag's commit」(
tag-commit-mismatch):v4.2.1のような完全なタグのエントリが、タグが動いたかエントリを書き換えたせいで、タグの指すコミットより古いコミットを固定している。gh actions-lock --relockを実行します。バージョン 0.2.0 はこの場合に上の見出しを出していました(gh-actions-lock #202)。 - 「Repository replaced (identity changed)」(
repo-replaced):その名前が、固定したときとは別のリポジトリのものになった。同じ名前で固定し直さず、アクションがいまどこにあるかを探します。 - 「OLD-NAME was renamed or transferred to NEW-NAME」(
repo-renamed):同じリポジトリの名前が変わった。gh actions-lockでuses:の名前を更新します。 - 「Lockfile doesn't match locked manifest」(
incomplete-lockfile):固定したアクションのaction.ymlが、そのエントリに無いアクションを使っている。gh actions-lock --relockを実行します。 - 「Lockfile is unreadable」、終了コード 2:たいていは手での書き換え、リポジトリ全体の置換、解き方を誤ったマージの衝突です。上のとおり戻します。報告の例(gh-actions-lock #166):
Lockfile .github\workflows\actions.lock is unreadable (lockfile is unreadable: .github/workflows/actions.lock: line 144, column 14: action body ref "v1.0.17" does not match pin key ref "v2.0.0" for dependency "jessehouwing/actions-dependency-submission@v2.0.0"). Delete and recreate it?
拡張機能はここでファイルを消して作り直すかを尋ねました。ガイドは、作り直すとすべての参照が解決し直されるので、代わりに戻すようにと書いています。
ロックファイルの入れ方
gh extension install github/gh-actions-lock gh actions-lock
これで .github/workflows の下のワークフローがすべて載ります。1つだけなら .github/workflows/ci.yml のようにパスを渡します。コミットの前に確かめることを、GitHub のドキュメントは3つ挙げています:
- 許可するアクションの設定。リポジトリ、Organization、Enterprise が指定したアクションだけを許していると、載せたワークフローは固定した SHA で確かめられるので、
actions/checkout@v6のようなタグの項目はもう合いません。ワイルドカードか完全な SHA にします。 jobs.<job_id>.usesで呼ぶ再利用可能なワークフローは固定されません。完全な SHA で固定します。それが使うものは、そのワークフローのリポジトリのロックファイルが受け持ちます。- ポリシー「Require actions to be pinned to a full-length commit SHA」は、載せたワークフローでは満たされるので、
uses:の行はタグのままにできます。ロックファイルに無いワークフローには、いままでどおり SHA が要ります。
保つためには、プルリクエストで gh actions-lock --verify を動かすワークフローを必須のチェックにすること(gh-actions-lock のリポジトリの verify-lockfile.yml が例です)と、変わったコミットをだれかが見るように、ロックファイルを CODEOWNERS に入れることを GitHub は勧めています。管理者は Require lockfile のポリシーも設定でき、これは対象のワークフローのうち載っていないもの(uses: が1つも無いワークフローも含む)の実行と、自分のリポジトリで載っていない再利用可能なワークフローを呼ぶワークフローの実行を止めます。
見分け方
- Set up job で「lockfile missing pin for OWNER/REPO@REF」:ほかのアクションが呼ぶアクションにエントリが無い。このページです。
- 実行がジョブの前に、ロックファイルに無いアクションを参照する不正なワークフローファイルとして失敗する:ワークフローの
uses:の行にエントリが無い。直し方は同じです。ほかの理由の不正なファイルは 「Invalid workflow file」 に。 - 「lockfile verification did not produce a result for this action」のあとに「Unable to resolve action」と「the repository has been renamed or transferred. Run `gh actions-lock` to update the lockfile」:アクションのリポジトリが移った(gh-actions-lock #110・2026年8月)。
uses:の行を新しい名前にしてからgh actions-lockを実行します。 - 文にロックファイルが出てこない「Unable to resolve action」:アクションかその参照が見つからない(「Unable to resolve action」)。ロックファイルが無いときのリポジトリの引っ越しも、この形で失敗します(free-disk-space の引っ越し)。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べるので、Set up job で止まった実行がすぐ分かり、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「Unable to resolve action」 · 「Invalid workflow file」 · free-disk-space の引っ越し · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English