2017-03-12 50 views
11

我正在關注一個關於Jenkins管道的教程,並且我可以在節點6.10的docker容器中獲得一個「hello world」。npm安裝在jenkins管道中的Docker中失敗

但是,當我將一個默認的EmberJS應用程序(使用ember init)添加到repo並嘗試在管道中構建它時,它在運行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. 

注意:我想不是以root/sudo運行npm install

更新:我已經能夠取得一些進展如下:

我發現詹金斯使用使用容器從日誌構建命令:

[Pipeline] withDockerContainer 
$ docker run -t -d -u 501:20 -w /long-workspace-directory -v /long-workspace-directory:/long-workspace-directory:rw -v /[email protected]:/[email protected]:rw -e 

所以泊塢窗圖像運行時, ,它的工作目錄是/long-workspace-directory(這真是一個神祕的jenkins工作區路徑),用戶ID是501(組ID 20)等等。用戶沒有名字(這顯然打破了與此無關的其他事情題)。

  1. 改,代理使用Dockefile:

    agent { 
        dockerfile { 
        filename 'Dockerfile' 
        args '-v /.cache/ -v /.bower/ -v /.config/configstore/' 
        } 
    } 
    
  2. 指定args '-v ...'用於創建卷的目錄NPM安裝/亭子需求。

+0

'npm ERR!請嘗試以root/Administrator身份再次運行此命令。試試這個提示。 – kumkanillam

+2

通常情況下,您不會以root身份運行'npm install';它被認爲是非常糟糕的形式;我想避免這種情況。 – les2

+0

請查看[nvm](https://github.com/creationix/nvm) –

回答

0

您可以構建,在本地目錄中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 
2

我添加相同的問題。我解決它使用root用戶運行多克爾圖像:從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 
    } 
} 
7

已經浪費在這個問題上一整天,我發現只需加入以下作爲在一個環境變量代理階段使用管道編輯器移除了問題。

'npm_config_cache=npm-cache' 
+2

你只需要設置'HOME = .',因爲'npm_config_cache'是'$ HOME/.npm',所以在這種情況下它將是'./.npm '而不是'/ .npm' –

+1

我可以確認只是設置'HOME ='。就足夠了 – amarillion

+1

爲了完整性'environment {HOME =「。」 }'修復了Jenkins聲明語法的問題。 – bordeltabernacle

7

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" 
     } 
    } 
} 
+0

我正在使用紗線,並有同樣的問題。你知道如何解決紗線問題嗎? –

0

我們遇到同樣的問題,對於我們來說,問題的核心在於Container和運行Jenkins節點的用戶具有不同的UID。 更改容器中用戶的UID + GID(並更改用戶主目錄的所有權)爲 ,運行構建節點npm的用戶將表現正常。

如果容器用戶的主目錄不可寫,也可能發生這種情況。

代碼在Dockerfile:

RUN usermod -u <uid of buildnode> <container user> && \ 
    groupmod -g <gid of buildnode> <container user group> && \ 
    chown -R <container user>:<container user group> /home/<container user> 

由於工作區安裝到它已經屬於 UID的容器。當通過Jenkinsfile運行容器時,UID和GID爲 ,容器用戶將自動設置爲與buildnode相匹配。但主目錄仍然有其原始所有者。

現在node_modules將被放置在當前目錄中。