本記事は GitHub Actions Advent Calendar 2021 の7日目の記事です🎅
作ったきっかけ
プロダクトを運用していると、定期的に言語やライブラリのバージョンアップ対応が必要になると思います。Volta を使用している場合、Node.js のバージョンを上げる時に必要な作業はこの辺りでしょうか。
- volta pin コマンドを実行して、Node.js のバージョンを上げる
- GitHub Actions で Node.js のバージョンを指定している箇所を修正する
- etc...
複数箇所に Node.js のバージョンが記述されていると、いざバージョンを上げよう!となった時に修正すべきファイルが増えてしまうので、一元管理する方法を検討していました。
そこで、今回は Volta + GitHub Actions を使っている場合に Node.js のバージョンアップ業が少しだけ楽になるアクションを作りました。
#Volta とは
Volta は Node.js などのバージョンを管理するためのツールです。本記事では触れませんが、 Node.js 以外に npm や yarn なども管理することができます。詳細については公式のドキュメントを参照ください。
似たツールとしては nodenv や nvm などがあります。以下の記事が参考になると思います。
作ったアクション
今回作ったアクションはこちらになります。
具体的な使い方については後述しますが、 package.json に記述されている Node.js のバージョンを取得することができます。
使い方
Volta をインストール
下記を参考にしつつ、環境に応じてインストールしてください。
Volta 経由で Node.js をインストールする
volta install
コマンドを実行して、任意のバージョンの Node.js をインストールします。
volta install node@16.13.0
プロジェクト内で使用する Node.js のバージョンを固定する
次に volta pin
コマンドを実行します。
volta pin node@16.13.0
上記を実行することで、package.json に Node.js のバージョンが追記されます。
これで プロジェクト内で使用する Node.js のバージョンが固定されました。
"volta": {
"node": "16.13.0"
}
get-node-version-from-volta アクションをワークフローに組み込む
ここから get-node-version-from-volta アクションを使用していきます。
ワークフローの steps に下記を追加することで、package.json で指定されている Node.js のバージョンを後続の step で取得できるようになります。ここで指定した id は後続の step で使用します。
- name: Get node version from volta
id: get-node-version
uses: keita-hino/get-node-version-from-volta@main
Volta で指定した Node.js のバージョンを取得する
今回の場合、steps.get-node-version.outputs.nodeVersion
から volta で指定した Node.js のバージョンを参照できます。(get-node-version
には、 uses した時に指定した id が入ります。)
今回は例として、取得した Node.js のバージョンを setup-nodeアクション に渡します。
これで、volta pin
コマンドを使って Node.js のバージョンを変えると、ワークフロー内の Node.js のバージョンも自動で追従されるようになるため、ワークフローの修正が不要になります🎉
- uses: actions/setup-node@v2
with:
node-version: ${{ steps.get-node-version.outputs.nodeVersion }}
全体像のサンプル
下記のサンプルは Node.js をインストールして終わっていますが、実際には後続の step でテストなどを実行します。
name: get node version
on: push
jobs:
buid:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Get node version from volta
id: get-node-version
uses: keita-hino/get-node-version-from-volta@main
- uses: actions/setup-node@v2
with:
node-version: ${{ steps.get-node-version.outputs.nodeVersion }}
...
おわりに
今回は、 Node.js のバージョンを上げる時にワークフローの修正が不要になるアクションを作成しました。まだ実プロダクトで試せてないのですが、今後機会があれば投入してみたいと思っています。もし、Volta を使って Node.js のバージョンを管理している方がいれば使ってみていただけると嬉しいです!🙏
気になった技術について Twitter で雑に呟いているので、よかったらフォローお願いします!@_kt15_