むにえる牧場

毎日むにえるをつくっています

【NodeSource】6.xを指定しても10.xしか落ちてこなくて困った話

はじめに

CircleCIにてNode.jsの環境をつくるのにNodeSourceを利用していました。
6.xを指定していたのですが、突然10.xが落ちてくるようになり、jobが動かなくなったので解決方法をメモ書きしておきます。

問題

CircleCIのjobで

 - run:
    name: Install Nodejs
    command: |
        curl -sL https://deb.nodesource.com/setup_6.x | bash -
        apt-get install -y nodejs

としていましたが、ここでインストールされるNode.js10.15.2 になってしまってました。
npmが同梱されていなくてこの後にnpm iする時点で落ちる。
npmを解決しても、その後のjobでnode-sassを利用していてNode 10.xだと動かない。
と問題になってました。

解決方法

試行錯誤した末にたどり着いたissueがこちら

github.com

コメントを意訳すると、

「現在のworkflowだとNode.jsの新しいバージョンを取得しようとしている。特定のバージョンを取得したい場合の回避方法があるからやってね」

とのこと。
手順は、

  • 現在入っているNode.jsを削除
$ sudo apt-get purge nodejs
  • 設定ファイルを開く
$ sudo vim/etc/apt/preferences.d/nodesource
  • 設定内容を記述
Package: *
  Pin: origin deb.nodesource.com
  Pin-Priority: 600
  • 変更が適用されているか確認する
$ apt-cache policy nodesource
  • 再度Node.jsをインストールする
$ sudo apt-get install nodejs

CircleCI jobへの適用

CirCleCIではこんな設定にして解決しました。

 - run:
    name: Set Preference
    command: |
        echo "Package: *" | tee -a /etc/apt/preferences.d/nodesource
        echo "Pin: origin deb.nodesource.com" | tee -a /etc/apt/preferences.d/nodesource
        echo "Pin-Priority: 600" | tee -a /etc/apt/preferences.d/nodesource
 - run:
    name: Install Nodejs
    command: |
        curl -sL https://deb.nodesource.com/setup_6.x | bash -
        apt-cache policy nodejs
        apt-get install -y nodejs

おわりに

今回の問題に行き当たったことで、

  • Pin-Priority : パッケージの優先度をつける
  • teeコマンド : ファイルへの出力と標準出力での出力を同時に行ってくれるコマンド

と学びがありました。
環境周りのエラーは本当に難しいので解決できて良かったです……!