GitHub Actionsのnode-versionをまとめてアップデートするコマンドラインツールを書いた
GitHubでのCIはActions | GitHubを使うようになりましたが、GitHub Actionのsetup-nodeにはLTSのような相対的な値を指定する方法がありません。
- Support aliases like LTS · Issue #26 · actions/setup-node
- Support for LTS version · Issue #208 · actions/setup-node
- Support
latest
as a version alias for the latest Node version · Issue #257 · actions/setup-node
そのため、GitHub ActionsでNode.jsのテストを書くには、次のようにnode-version
にそれぞれのバージョンを指定する必要があります。
Travis CIではnvmが使われていたので lts/*
などをLTSを指定できたので、
node_js: stable
とだけ書いていることが多かったです。
バージョンを書くのは問題ないのですが、バージョンを更新するのが面倒です。 また、ローカルでは古いバージョンで実行しないので、リポジトリをメジャーアップデートするコミットをpushしてから、Node.js 10では動かないパッケージが入ってきてテストが落ちてから気づくみたいな現象が起きやすいです。
この更新を楽にするためのgithub-actions-node-versionsというツールを書きました
github-actions-node-versions
github-actions-node-versionsは、.github/workflow/*.{yml,yaml}
の matrix
にかかれている node-version
を自動的にLTSとActiveなバージョンに更新します。
Node.jsでは、LTSとしてMaintenanceとActive LTSの2種類があり、2021-05-28時点では、Node.js 12と14が該当します。 また、LTSではないがActiveに開発するCurrentバージョンがあり、2021-05-28時点では、Node.js 16が該当します。
次のコマンドを実行すると node-version: [Maintenance LTS、Active LTS, Current]
に更新してくれるシンプルなツールです。
2021-05-28時点では node-version: [12, 14, 16]
と更新してくれます。
$ npx github-actions-node-versions
実行結果の例
$ npx github-actions-node-versions
— azu (@azu_re) May 26, 2021
でGitHub Actionsのnode_versionsのmatrixを
`[Maintenance_LTS, Current_LTS, Active]` に更新するツール書きましたhttps://t.co/2oVSq0KnR8 pic.twitter.com/RLUGGAPBkP
node-version-aliasを使っているので、https://nodejs.org/dist/の状態によって自動的に結果が変わります。
Node.js 17が出たときは、まだUnstableなので入ってほしくなくて奇数バージョンは除外しています。
なので、node-version: [14, 16]
となる気がします。(テストしてないので、テストと修正のPR待ってます!)
内部的な仕組み
コメントを維持しながらYAMLを変換したかったためjs-yamlが使えませんでした。 eemeli/yaml: JavaScript parser and stringifier for YAMLを使って、Yamlをパースしてtraverseしながら、位置情報を取得しています。
この位置情報を元に node-version
だけを書き換えることで、コメントを維持しながらYAMLのマイグレーションをしています。
おわりに
管理しているリポジトリが大量にあるので、こういうちょっとした変更も手作業じゃなくてツール化していることが多いです。
- azu/migrate-travis-ci-to-github-actions: [Opinionated] Migrate Travis CI to GitHub Actions. Node.js CI settings
- azu/mocha-migrate: Mocha migration script for mocha v7
- azu/set-env-to-github_env: A migration tools convert
::set-env
to $GITHUB_ENV on GitHub Actions. - shepherdを使って複数のリポジトリに一括でPRを出してまとめてマイグレーションする | Web Scratch
何度実行しても同じ結果になるマイグレーションツールを作っておくと何も考えなくて良いので楽だと思います。
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。