{"version":3,"file":"395.js","mappings":"6HAAA,w7T","sources":["webpack:///./src/blog/2020/using-nvm-on-github-actions.md"],"sourcesContent":["export default \"
Table of Contents

よく忘れるので、GitHub Actionsでnvmを使う方法をメモしておく。

\\n

基本的にはactions/setup-nodeだけでよい

\\n

2021年12月2日追記

\\n

actions/setup-node@v2.5.0node-version-file オプションに対応した。\\nつまり、.nvmrc の内容を出力するステップは不要となり、よりシンプルなコードが書ける。最高。

\\n
steps:\\n  - uses: actions/setup-node@v2\\n    with:\\n      node-version-file: .nvmrc\\n
\\n
\\n

2021年7月7日追記

\\n

actions/setup-node@v2.2.0がnvm互換の lts エイリアスに対応した(例.lts/*)。

\\n

したがって基本的には(未サポートのnvm固有シンタックスを使ってないかぎり)、以下のようにactions/setup-nodeの node-version.nvmrc の値をセットするだけで良いんじゃないかと思う。

\\n
# See: https://github.com/actions/setup-node/issues/32#issuecomment-539794249\\nsteps:\\n  - run: echo \\\"::set-output name=nvmrc::$(< .nvmrc)\\\"\\n    id: nvm\\n  - uses: actions/setup-node@v2\\n    with:\\n      node-version: \\\"${{ steps.nvm.outputs.nvmrc }}\\\"\\n
\\n

(当サイトでもybiquitous/homepage#545にて変更)

\\n

bash のこととか考えなくて良くなるし、actions/setup-nodeビルトインのProblem Matchersも使えるし。\\n多くの場合、Node.jsイメージのキャッシュも効くはず。

\\n

どうしても nvm を使いたい場合は、従来どおり以下の内容が有効。

\\n

nvmはプリインストール済み

\\n

2020年6月4日現在、nvmは ubuntu-latest (Ubuntu 18.04) イメージにデフォルトでインストールされている(バージョンは 0.35.3)。つまり、サードパーティのActionを入れる必要はない。

\\n

使い方

\\n

以下の例にあるように、nvm コマンドを使う場合は shell: bash --login {0} (または bash -l {0})が必須となる(参照:actions/virtual-environments#582)。

\\n
# .github/workflows/nvm.yml\\nname: nvm\\non: [push]\\njobs:\\n  run:\\n    runs-on: ubuntu-latest\\n    steps:\\n      - run: nvm install 14.3.0\\n        shell: bash --login {0} #<-- 必須!\\n
\\n

この shell 設定がない場合、以下のエラーが出る(参考)。

\\n
\\n

nvm: command not found

\\n
\\n

一度 nvm install が成功すると、そのバージョンが default エイリアスに設定される。そのため、毎回 nvm exec をつけてコマンドを実行する必要はない。\\nただし、注意しないといけないのは、shell: bash --login {0}nvm install 以降の run で省略できないことだ。\\nこの設定を忘れてしまうと、ubuntu-latest イメージにプリインストールされたNode.jsが使われてしまう。これはログを注意深く見ないと気づかない可能性が高い。

\\n
steps:\\n  - run: nvm install 14.3.0\\n    shell: bash --login {0}\\n  - run: node --version #=> \\\"12.16.3\\\" (preinstalled version)\\n  - run: node --version #=> \\\"14.3.0\\\" (nvm installed version)\\n    shell: bash --login {0}\\n
\\n

しかし、毎回忘れずに shell を書くのはなかなか大変である。どうしても漏れが発生するだろう。

\\n

そこで、PATH 環境変数を書き換えてしまうという荒業を用いる。::set-env name={name}::{value} という形式の文字列を出力することで、export PATH=... と同様のことができる。

\\n

nvmが設定してくれる NVM_BIN 環境変数が使って、以下のように書ける。

\\n
steps:\\n  - run: node --version #=> \\\"12.16.3\\\"\\n  - run: |\\n      nvm install 14.3.0\\n      echo \\\"::set-env name=PATH::${NVM_BIN}:${PATH}\\\"\\n    shell: bash --login {0}\\n  - run: node --version #=> \\\"14.3.0\\\"\\n
\\n

これで、shell: bash --login {0} を1回だけ書けば済むようになった。

\\n

shell が必要な理由

\\n

nvmを使うには .bashrc.bash_profile を読み込む必要がある。しかし、GitHub Actionsでの shell のデフォルト値は bash --noprofile --norc -eo pipefail {0} なので(ドキュメント)、それらのファイルをデフォルトでは読み込んでくれないのである。

\\n

まとめ

\\n

多くのケースでは .nvmrc ファイルをリポジトリにコミットすると思うので、普通は actions/checkout を使ってこのように書くだろう(ちなみに、--latest-npm --no-progress を付ける付けないは好みである)。

\\n
name: nvm\\non: [push]\\njobs:\\n  run:\\n    runs-on: ubuntu-latest\\n    steps:\\n      - uses: actions/checkout@v2\\n      - run: |\\n          nvm install --latest-npm --no-progress\\n          echo \\\"::set-env name=PATH::${NVM_BIN}:${PATH}\\\"\\n        shell: bash --login {0}\\n      - run: ... # using `node` or `npm`\\n
\\n

このやり方では actions/setup-node を使う必要はない。setup-node に比べると若干コードが増えてハックじみてるが、.nvmrc を使っているリポジトリ(特にアプリケーション)では有益な方法だと思う。

\\n

こちらのリポジトリに実際の動作を残しておく。\\nybiquitous/using-nvm-on-github-action

\";"],"names":[],"sourceRoot":""}