GitHub ActionsのNode 20非推奨に備え、Claude Codeでworkflowを更新する
Node 20宣言のActionは、告知上すでに除去予定日を過ぎています。uses行の洗い出しからNode 24対応タグへの引き上げ、/batchでの分担、runner側の条件までをまとめます。
GitHub Actionsは、Node 20で動くActionを段階的に廃止してきました。告知では、2026年6月16日にrunnerの既定がNode 24へ変わり、2026年9月23日にNode 20そのものが取り除かれる予定とされていました。どちらの日付も過ぎています。Node 20宣言のActionが残っているworkflowは、失敗しうる状態です。対応は、uses:行を、Node 24で動くタグへ引き上げることです。
この作業は、行を洗い出し、Actionごとに「どのタグからNode 24になるか」を調べ、書き換えて、動作を確かめる流れになります。洗い出しと書き換えはClaude Codeが得意な機械作業です。ただし、タグの境目はActionごとにずれていて、v5に上げれば済むとは限りません。
Node 20の廃止はいつ何が変わるのか
Node 20廃止の予定
- 2025-09-19廃止の告知
runner v2.328.0がNode 20とNode 24の両方に対応し、既定はNode 20のままでした。
- 2026-06-16既定がNode 24に
告知された、runnerの既定がNode 24に変わる日です。
- 2026-09-23Node 20を除去
告知された、runnerを更新してNode 20を取り除く予定日です。
除去日は告知の公開後に何度か後ろへずれ、最終的に2026年9月23日と書き換えられました。除去が実際に走ったrunnerでは、Node 20宣言のActionは動きません。日付よりも、手元のworkflowに「Node 20で動くAction」が残っているかどうかが、いま失敗するかを決めます。
Node 20のまま使い続けるための逃げ道も用意されていました。ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=trueをworkflowのenvかrunnerの環境変数に置くと、6月16日以降もNode 20を使えます。ただし告知は、この設定が効くのはNode 20の除去までだと書いています。逃げ道は期限付きで、恒久策にはなりません。
更新の前に壊れる箇所を見つけたいときは、FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=trueをenvに置きます。Node 20宣言のActionもNode 24で強制的に動かせます。1つのworkflowだけで試す最小の形は次のとおりです。
jobs:
build:
runs-on: ubuntu-latest
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
steps:
- uses: actions/checkout@v4このjobで失敗したステップのActionが、先にタグを上げる対象です。確かめ終えたらenvの行は消します。
自分のworkflowで対象を洗い出す
最初に、リポジトリが使っているActionとそのタグを一覧にします。対象は.github/workflowsだけではありません。自作のcomposite actionを.github/actionsに置いているなら、そちらのuses:も対象です。
grep -rhoE 'uses: *[^ #]+' .github \
| sed -E 's/uses: *//' | sort | uniq -c | sort -rn出力は「何回使われているか、どのActionのどのタグか」の一覧になります。actions/checkout@v4が20行、actions/upload-artifact@v4が6行、というように並びます。
ローカルアクション(./.github/actions/...)とDockerイメージ参照(docker://...)も混ざります。この2つはタグを持たないので、一覧から外しておくと見通しがよくなります。
grep -rhoE 'uses: *[^ #]+' .github \
| sed -E 's/uses: *//' \
| grep -vE '^(\./|docker://)' | sort | uniq -c | sort -rnコミットSHAで固定している行は、uses: actions/checkout@<40桁のSHA> # v5のように、末尾のコメントにタグを書く形がよく使われます。この形の行は、タグだけ書き換えてもSHAが古いまま残ります。選んだタグに対応するSHAへ置き換え、コメントのタグも合わせて更新します。
Claude Codeに任せるなら、この一覧そのものを作らせるのが入口です。後述のプロンプトでも、最初のステップとして「uses:の一覧を作り、各Actionのaction.ymlを見てNode 20宣言のものを選ぶ」ことを指示します。
どのタグからNode 24になるか
Actionが何で動くかは、タグ時点のaction.ymlのruns.usingに書かれています。境目はこの値で決まります。主要なActionでは次のとおりです。
| Action | Node 20のままのタグ | Node 24になる最初のタグ |
|---|---|---|
actions/checkout | Node 20のままのタグv4 | Node 24になる最初のタグv5 |
actions/setup-node | Node 20のままのタグv4 | Node 24になる最初のタグv5 |
actions/cache | Node 20のままのタグv4 | Node 24になる最初のタグv5 |
actions/upload-artifact | Node 20のままのタグv4、v5 | Node 24になる最初のタグv6 |
actions/download-artifact | Node 20のままのタグv4、v5、v6 | Node 24になる最初のタグv7 |
actions/github-script | Node 20のままのタグv7 | Node 24になる最初のタグv8 |
actions/setup-java | Node 20のままのタグv4 | Node 24になる最初のタグv5 |
actions/setup-go | Node 20のままのタグv5 | Node 24になる最初のタグv6 |
docker/login-action | Node 20のままのタグv3 | Node 24になる最初のタグv4 |
docker/build-push-action | Node 20のままのタグv5、v6 | Node 24になる最初のタグv7 |
actions/labeler | Node 20のままのタグv5 | Node 24になる最初のタグv6 |
表の値は各タグのaction.ymlにあるruns.usingです。新しいタグが出たら、同じ箇所を見れば判定できます。上げる前に、対象タグのaction.ymlを開いて確かめてください。
落とし穴
vを1つ上げても、Node 20のままのActionがある
upload-artifactはv5、download-artifactはv6でもNode 20宣言でした。「最新の1つ前に上げれば安全」と指示すると、この2つは対象から漏れます。指示には「action.ymlのruns.usingがnode24になるタグを選ぶ」と、判定基準を書いてください。
Claude Code公式Actionは何で動くか
anthropics/claude-code-action@v1は、action.ymlのruns.usingがcompositeです。Node上で直接動くActionではなく、内側のステップを順に実行する形です。内側ではoven-sh/setup-bunをコミットSHAで固定して呼んでおり、そのタグ(v2.2.0)のruns.usingはnode24でした。
つまり、claude-code-action@v1の行は書き換えずに済みます。Claude Codeの公式ドキュメントのサンプルはactions/checkout@v6とanthropics/claude-code-action@v1の組み合わせで、こちらも追加の手当てが要りません。更新が必要になるのは、サンプルを写す前から使っていたactions/checkout@v4などの行です。
/batchでworkflowを一括更新する
/batchは、コードベース全体に及ぶ変更を5〜30の独立したユニットに分け、計画を見せてから、ユニットごとにバックグラウンドのサブエージェントをworktreeで隔離して走らせる組み込みスキルです。各サブエージェントが実装し、テストを走らせ、変更を公開します。コマンドの全体像は/batchの解説にあります。
ここでの使い分けは次のとおりです。
- workflowが数ファイル、
uses:が十数行なら、ユニットに割るより、Claude Codeへ普通に頼むほうが速い - workflowが数十ファイルあり、build・test・deployが別々に管理されているなら、ファイル群ごとにユニットを切る意味が出る
複数のリポジトリにまたがる場合は、/batchが分けるのが1つのリポジトリの中だけなので、リポジトリごとにセッションを開きます。
/batch .github 配下の全 workflow と composite action の uses: を、
Node 24 で動くタグへ引き上げる。
手順:
1. uses: の一覧を作る
2. 各 Action の action.yml を取得し、runs.using が node24 のタグを選ぶ
(一つ上げれば足りるとは限らない。判定は runs.using で行う)
3. SHA 固定の行は、選んだタグに対応する SHA に置き換え、コメントのタグも更新する
4. 自作の composite action も同様に確認する
5. 変更後に actionlint を実行して結果を報告する/batchは計画を出してから実行に入ります。そこでユニットの切り方を見ます。ファイル単位で切られていると、同じActionを複数のユニットが別々のタグへ書き換え、PRを統合したときに食い違いかねません。Action単位で切るよう、計画の段階で指示を足してください。
PRはユニットの数だけ並ぶので、レビューの負荷が先に来ます。更新が機械的な1行差し替えばかりなら、1PRにまとめるよう頼む選択肢もあります。
書き換えの検証にactionlintを使う
書き換えた後に、YAMLの構文や入力名の誤りを機械で拾っておくと、レビューが楽になります。actionlintをhookで走らせる設定を入れておけば、/batchの各サブエージェントが編集のたびに検証できます。
引き上げの前に確かめる条件
Node 24対応のタグは、動作条件も変わっています。
タグを上げる前に見る条件
runnerのバージョン
actions/checkoutのv5はNode 24で動き、runnerがv2.327.1以上であることを求めます。GitHubホストのrunnerなら意識しなくて済みますが、self-hosted runnerは更新が要ります。Dockerコンテナ内のgit操作
actions/checkoutのv6は、認証情報を.git/configではなく$RUNNER_TEMPの別ファイルに保存します。Dockerコンテナアクションから認証が必要なgitコマンドを走らせるには、runnerがv2.329.0以上である必要があります。古いOSとARM32
Node 24はmacOS 13.4以下と互換性がありません。ARM32のself-hosted runnerも、Node 20の廃止後はサポート対象から外れます。
self-hosted runnerを使っているチームは、タグの引き上げより先にrunnerのバージョンとOSを確認します。順番を逆にすると、書き換えたworkflowがrunnerで起動しなくなります。
手順のまとめ
Node 20対応の更新手順
- 1
uses行を洗い出す
.github/workflowsと自作のcomposite actionのuses:を一覧にします。 - 2
Node 24になるタグを調べる
Actionごとに
action.ymlのruns.usingを見て、node24になる最初のタグを決めます。 - 3
runnerの条件を確かめる
self-hosted runnerは、バージョンとOS、アーキテクチャを先に確認します。
- 4
書き換えて検証する
/batchか通常のセッションで書き換え、actionlintと実際のworkflow実行で確かめます。
依存の更新を継続的に受けたいなら、RenovateやDependabotの更新PRをClaude Codeで検証する運用に組み込む形もあります。一度きりの引き上げは/batch、以降の追随はbotに任せる、という分担です。
Claude Code自身をGitHub Actionsに組み込む手順はClaude CodeをGitHub Actionsに組み込む解説に、claude_argsなどの入力はパラメータとclaude_argsの渡し方にあります。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。