在 Jenkins 流水线中,npm 安装失败

4
我创建了一个Docker镜像,以便在Jenkins中测试使用Node >= 7.9.0和MongoDB。有些人可能会认为使用mongodb进行测试不是正确的方法,但应用程序广泛使用它,并且我需要进行一些复杂的更新和删除操作,因此需要它。
Docker文件位于我的Github仓库的dockerfiles/test/Dockerfile下。使用pipeline语法时,Docker镜像可以成功构建,但是我不能在pipeline步骤中执行sh 'npm install' 或 sh 'npm -v'。 Docker镜像已经过测试,如果我在本地构建并运行它,则可以在其中进行npm安装。 sh 'node -v'在pipeline中成功运行,也可以运行sh 'ls'。
以下是pipeline语法。
pipeline {
  agent { dockerfile { dir 'dockerfiles/test' } }
  stages {
    stage('Build') {
        steps {
           sh 'npm install'
        }
    }
  }
  post {
      always {
        echo 'I will always say Hello again!'
      }
  }
}

我遇到了这个错误:ERROR: 脚本返回退出码-1。我在这里看不出任何问题。我还使用其他具有相同结果的node镜像进行了测试。如果我使用node从机运行它,我可以进行安装,但我不想有很多不同的从机来完成集成测试的设置。
以下是dockerfile代码:
FROM ubuntu:16.04

ENV DEBIAN_FRONTEND noninteractive

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
RUN echo "deb http://repo.mongodb.org/apt/ubuntu $(cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2)/mongodb-org/3.2 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.2.list

RUN apt-get update && apt-get install -y \
curl && \
curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
apt-get install -y nodejs && \
apt-get install -y mongodb-org


RUN mkdir -p /data/db
RUN export LC_ALL=C
RUN groupadd -g 1000 jenkins && useradd -u 1000 jenkins -g jenkins

EXPOSE 27017

CMD ["/usr/bin/mongod"]

1
我的猜测是容器中没有有效的用户,而你的 npm install 需要一个有效的用户和主目录。由于 Jenkins 以 Jenkins 用户身份运行容器,因此这些可能不存在。你的 npm install 可能使用需要有效用户和主目录的 SSH(或其他内容),但这些在 Dockerfile 中可能不存在。有关用户问题,可以参考 JENKINS-38438 - mkobit
你能否发布一个最小化的Dockerfile,以便我们可以重现你的问题? - burnettk
@mkobit 我已经读了几遍Jira问题,但我看不出我做错了什么。如果我像Jenkins流水线一样启动容器,我就可以进行安装。docker run -t -d -u 1000:1000 - Edgesoft
你能否从一个失败的构建中获取控制台日志并在此处发布吗? - burnettk
@burnettk 我只得到了脚本返回的退出码-1。当执行npm -v时,版本号在catch块消息中。非常奇怪。 - Edgesoft
显示剩余6条评论
2个回答

3

找到了类似问题的解决方法。

问题

  • Jenkins运行流水线任务
  • 该任务在debian slim容器中运行命令
  • 所有命令都会立即失败,没有错误输出,只有ERROR: script returned exit code -1
  • 在docker之外运行容器,并使用相同用户执行相同命令时,一切正常

Jenkinfile中的提取片段:

androidImage = docker.build("android")
androidImage.inside('-u root') {
    stage('Install'){
        sh 'npm install' // is failing with generic error and no output
}

解决方案

在 Jenkins 的 bugtracker 上找到了答案:https://issues.jenkins-ci.org/browse/JENKINS-35370,以及在Jenkins Docker Pipeline Exit Code -1上也有相关内容。

我的问题通过在 Debian Dockerfile 中安装 procps 软件包得到了解决:

apt-get install -y procps

安装procps时遇到了相同的问题,已经解决。 - d3l33t

0

我尽可能忠实地复制了您的设置。我使用了您的Dockerfile和Jenkinsfile,这是我的package.json:

{
  "name": "minimal",
  "description": "Minimal package.json",
  "version": "0.0.1",
  "devDependencies": {
    "mocha": "*"
  }
}

在我进行npm install时,它就像这样失败了:

npm ERR! Error: EACCES: permission denied, mkdir '/home/jenkins'

我在你的Dockerfile中更新了一行代码,添加了--create-home

RUN groupadd -g 1000 jenkins && useradd -u 1000 jenkins -g jenkins --create-home

而且构建已通过。对于@mkobit的关键问题和链接到jenkins问题的致敬,这将使未来更加清洁。


谢谢您的回复,但是它并没有解决我的问题。 - Edgesoft
我从未遇到过EACCES问题。 - Edgesoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接