{"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を使う方法をメモしておく。
\\nactions/setup-node@v2.5.0が node-version-file
オプションに対応した。\\nつまり、.nvmrc
の内容を出力するステップは不要となり、よりシンプルなコードが書ける。最高。
steps:\\n - uses: actions/setup-node@v2\\n with:\\n node-version-file: .nvmrc\\n
\\nactions/setup-node@v2.2.0がnvm互換の lts
エイリアスに対応した(例.lts/*
)。
したがって基本的には(未サポートのnvm固有シンタックスを使ってないかぎり)、以下のようにactions/setup-nodeの node-version
に .nvmrc
の値をセットするだけで良いんじゃないかと思う。
# 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にて変更)
\\nbash
のこととか考えなくて良くなるし、actions/setup-nodeビルトインのProblem Matchersも使えるし。\\n多くの場合、Node.jsイメージのキャッシュも効くはず。
どうしても nvm
を使いたい場合は、従来どおり以下の内容が有効。
2020年6月4日現在、nvmは ubuntu-latest
(Ubuntu 18.04) イメージにデフォルトでインストールされている(バージョンは 0.35.3)。つまり、サードパーティのActionを入れる必要はない。
以下の例にあるように、nvm
コマンドを使う場合は shell: bash --login {0}
(または bash -l {0}
)が必須となる(参照:actions/virtual-environments#582)。
# .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\\nnvm: command not found
\\n
一度 nvm install
が成功すると、そのバージョンが default
エイリアスに設定される。そのため、毎回 nvm exec
をつけてコマンドを実行する必要はない。\\nただし、注意しないといけないのは、shell: bash --login {0}
が nvm install
以降の run
で省略できないことだ。\\nこの設定を忘れてしまうと、ubuntu-latest
イメージにプリインストールされたNode.jsが使われてしまう。これはログを注意深く見ないと気づかない可能性が高い。
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
を書くのはなかなか大変である。どうしても漏れが発生するだろう。
そこで、PATH
環境変数を書き換えてしまうという荒業を用いる。::set-env name={name}::{value}
という形式の文字列を出力することで、export PATH=...
と同様のことができる。
nvmが設定してくれる NVM_BIN
環境変数が使って、以下のように書ける。
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回だけ書けば済むようになった。
shell
が必要な理由nvmを使うには .bashrc
や .bash_profile
を読み込む必要がある。しかし、GitHub Actionsでの shell
のデフォルト値は bash --noprofile --norc -eo pipefail {0}
なので(ドキュメント)、それらのファイルをデフォルトでは読み込んでくれないのである。
多くのケースでは .nvmrc
ファイルをリポジトリにコミットすると思うので、普通は actions/checkout を使ってこのように書くだろう(ちなみに、--latest-npm --no-progress
を付ける付けないは好みである)。
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
を使っているリポジトリ(特にアプリケーション)では有益な方法だと思う。
こちらのリポジトリに実際の動作を残しておく。\\nybiquitous/using-nvm-on-github-action
\";"],"names":[],"sourceRoot":""}