CircleCIでnvmをセットアップする


色々とハマってしまったので、共有しておきます。きっと誰かの役に立つでしょう。

簡単に言うと、CircleCIで nvm を使う場合は、 nvm.sh--install --no-use オプションを渡しておきましょう、ということです。以下は、設定ファイルからコマンド実行部分だけを抜粋したものです。

.circleci/config.yml
- checkout
- run:
    name: Setup Node.js via nvm
    command: |
      curl --silent -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
      echo 'export NVM_DIR="$HOME/.nvm"' >> $BASH_ENV
      echo 'source "$NVM_DIR/nvm.sh" --no-use' >> $BASH_ENV 
      source $BASH_ENV
      nvm install --latest-npm --no-progress
      nvm alias default
      sed -i -e 's/ --no-use//' $BASH_ENV
- run:
    name: Verify
    command: node -v && npm -v

インストール時に、一時的に --no-use オプションを付けてエラーを回避し、インストールが成功したら --no-use オプションを削除します。

プロジェクトルートに .nvmrc ファイルがある場合、--install --no-use オプションを付けないと nvm install に失敗します(CircleCI上のログを見ると、終了ステータス3を返してます)。以下は、検証用のプルリクエストです。

--install オプションはドキュメントに書かれてないのですが、コードを見ると古くからあることがわかります。ただし、ドキュメント化されてないので将来こっそり削除される不安があります…
https://github.com/nvm-sh/nvm/blob/3d9c31d94488884e74ae1ba0d46bc6607bc74667/nvm.sh#L3575

--no-use オプションはREADMEに書かれてますね!
https://github.com/nvm-sh/nvm#install--update-script

検証用のリポジトリはこちらです。
ybiquitous/circleci-nvm-setup: A way to setup nvm on CircleCI