Jenkinsで、npm: コマンドが見つかりません

Jenkinsジョブを実行したら、npm loginの箇所で、「npm: コマンドが見つかりません」エラーになってしまいました。

結論からいうと、nvmでインストールしたnpmだったので、JenkinsでnpmへのPATHが通っていませんでした。

npm: コマンドが見つかりません

ninton/jquery.jpostal.js
郵便番号から住所入力するjQueryプラグイン. Contribute to ninton/jquery.jpostal.js development by creating an account on GitHub.

Jpostalは郵便番号から住所を自動入力するjqueryプラグインで、筆者が開発しています。Jpostalは、githubでソース公開、npmでもソース公開、Google Cloudでホスティングしています。

最近、郵便データの更新処理からGoogle CloudへのデプロイをJenkins化したんですね。その作業中のことです。

自分のPCのターミナルでは、githubへのpushや、npmへの公開、Google Cloudへの自動デプロイまで、問題なく実行できました。

あともう少しね

npm_publish.sh

#!/bin/bash -ue expect -c " set timeout 10 spawn ./bin/npm_login.sh expect \"Username:\" send \"$NPM_USER\n\" expect \"Password:\" send \"$NPM_PASS\n\" expect \"Email: (this IS public)\" send \"$NPM_EMAIL\n\" expect eof exit " cd jquery.jpostal.js npm publish

npm_login.sh

#!/bin/bash -ue npm login

ところが、Jenkinsジョブで実行すると、npm_login.shの3行目で、

npm: コマンドが見つかりません

と表示されてしまいました。

何かインストールを忘れてない?

Jenkinsサーバでコマンドが不足していることが原因で、Jenkinsジョブが動かないことは、よくあることです。Jenkinsサーバにsshログインして、該当するシェルスクリプトを実行してみました。すると、最後まで実行できました。

npmはnvmでインストールしました。npmが動くか確認してみると、問題ないようです。

$ npm -v 6.13.4 $ which npm /home/jenkins/.nvm/versions/node/v12.16.1/bin/npm

Jenkinsサーバのターミナルも問題ないようね

JenkinsのConfigureのExecute Shellで、npm -vを試しました。

npm -v exit 0

Configureを保存して、Build Nowして、Console Outputを見ると、「npm: not found」

+ npm -v /tmp/jenkins7559008830890794218.sh: 2: /tmp/jenkins7559008830890794218.sh: npm: not found

JenkinsのConfigureのExecute Shellで、npm -vを試しました。

echo "which npm" which npm exit 0

Configureを保存して、Build Nowして、Console Outputを見ると、「which npm」でエラー終了しているようです。

ここいたって、ようやく、JenkinsでnpmへのPATHが通っていないことに気づきました。

つまり、凡ミス?

Jenkinsは ~/.bashrc を読み込まないのね

PATHを通す

JenkinsのManage Jenkins>Configure SystemのGlobal propertiesでPATHを設定してもいいでのすが、将来nvmでnodeバージョンを切り替えたら、PATHも変更する必要があります。

そこで今回は、npmを呼んでいるスクリプトの先頭で、~/.nvm/nvm.sh を 読み込むことにしました。

#!/bin/bash -ue . ~/.nvm/nvm.sh npm -v expect -c " set timeout 10 spawn ./bin/npm_login.sh (省略) " cd jquery.jpostal.js npm publish

JenkinsジョブのExecute Shellの先頭のほうがいいかもね

タイトルとURLをコピーしました