私はJenkinsパイプラインについてのチュートリアルに従っており、node 6.10 dockerコンテナで "hello world" を動作させることができます。
しかし、デフォルトのEmberJSアプリ(ember init
を使用)をレポに追加し、パイプラインでそれを構築しようとすると、npm installを実行すると失敗します(ディレクトリアクセスの問題のため)。Jenkinsfile はこちらです: https://github.com/CloudTrap/pipeline-tutorial/blob/fix-build/Jenkinsfile
ビルドが出力するエラーメッセージ(ローカルにインストールし、Macbookで java -jar jenkins.war
を使用して実行します。
npm ERR! Linux 4.9.12-moby
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v6.10.0
npm ERR! npm v3.10.10
npm ERR! path /.npm
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall mkdir
npm ERR! Error: EACCES: permission denied, mkdir '/.npm'
npm ERR! at Error (native)
npm ERR! { Error: EACCES: permission denied, mkdir '/.npm'
npm ERR! at Error (native)
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'mkdir',
npm ERR! path: '/.npm',
npm ERR! parent: 'pipeline-tutorial' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
注意: npm install
を root / sudo で実行することは not したいです。
UPDATE: 以下のように少し前進することができました。
Jenkinsがコンテナを使用してビルドするために使用するコマンドをログから発見しました。
[Pipeline] withDockerContainer
$ docker run -t -d -u 501:20 -w /long-workspace-directory -v /long-workspace-directory:/long-workspace-directory:rw -v /long-workspace-directory@tmp:/long-workspace-directory@tmp:rw -e
つまり、docker イメージが実行されると、作業ディレクトリは /long-workspace-directory
(本当は暗号のような jenkins workspace path) で、ユーザー ID は 501 (group id 20) などになっています。ユーザは名前を持っていません(この質問とは関係ない他のことを壊しているようです)。
1.Dockefileを使用するようにエージェントを変更しました。
<!-- language: lang-groovy -->
エージェント {
dockerfile {
ファイル名 'Dockerfile'
args '-v /.cache/ -v /.bower/ -v /.config/configstore/'
}
}
2.args '-v ...'` は、npm install / bower が必要とするディレクトリのボリュームを作成するために指定します。
https://github.com/jenkins-infra/jenkins.io/blob/master/Jenkinsfile より
docker.image('openjdk:8').inside {
/* One Weird Trick(tm) to allow git(1) to clone inside of a
* container
*/
withEnv([
/* Override the npm cache directory to avoid: EACCES: permission denied, mkdir '/.npm' */
'npm_config_cache=npm-cache',
/* set home to our current directory because other bower
* nonsense breaks with HOME=/, e.g.:
* EACCES: permission denied, mkdir '/.config'
*/
'HOME=.',
]) {
// your code
}
}
私も同じ問題を追加します。Dockerイメージの実行にroot
ユーザーを使って解決しました。
node {
stage("Prepare environment") {
checkout scm
// Build the Docker image from the Dockerfile located at the root of the project
docker.build("${JOB_NAME}")
}
stage("Install dependencies") {
// Run the container as `root` user
// Note: you can run any official Docker image here
withDockerContainer(args: "-u root", image: "${JOB_NAME}") {
sh "npm install"
}
}
}
ビルドする前に、グローバルな依存関係を設定せずに、ローカルディレクトリに NVM_DIR
で nvm
をインストールすることができます。
mkdir -p node_dir
export NVM_DIR=$(pwd)/node_dir
curl https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
source $(pwd)/node_dir/nvm.sh
nvm install 7
nvm use 7
新しいロケーションは:
$ which node
~/someDir/node_dir/versions/node/v7.7.2/bin/node
$ which npm
~/someDir/node_dir/versions/node/v7.7.2/bin/npm