【问题标题】:npm install fails in Jenkins pipelinenpm install 在 Jenkins 管道中失败
【发布时间】:2017-10-04 17:24:36
【问题描述】:

我创建了一个 docker 镜像,以便能够运行 node >= 7.9.0 和 monogodb 以在 Jenkins 中进行测试。有些人可能会争辩说,使用 mongodb 进行测试不是正确的方法,但该应用程序广泛使用它,而且我有一些复杂的更新和删除,所以我需要它。

Docker 文件位于我的 github 存储库中的 dockerfiles/test/Dockerfile 下。使用管道语法时,docker 映像已成功构建,但我无法在管道的步骤中执行 sh 'npm install' 或 sh 'npm -v' 。 docker 镜像已经过测试,如果我在本地构建并运行它,我可以在那里进行 npm 安装。 sh 'node -v' 和 sh 'ls' 在管道中成功运行。

这是管道语法。

pipeline {
  agent { dockerfile { dir 'dockerfiles/test' } }
  stages {
    stage('Build') {
        steps {
           sh 'npm install'
        }
    }
  }
  post {
      always {
        echo 'I will always say Hello again!'
      }
  }
}

我收到此错误:错误:脚本返回退出代码 -1。我在这里看不出有什么问题。我还用其他节点图像进行了测试,结果相同。如果我使用节点从属服务器运行它,我可以进行安装,但我不希望有许多不同的从属服务器,并且有很多用于集成测试的设置。

这里是 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"]

【问题讨论】:

  • npm install 是本地命令。尝试在您的 Jenkinsfile 中使用 dir 来选择您希望运行该命令的目录。
  • @MattSchuchard 谢谢,但我在正确的目录中。执行 ls 时,我可以看到我的 package.json 和源文件。
  • 我的猜测是容器中没有有效的用户,而您的npm install 需要有效的用户和主目录,并且由于 Jenkins 以 Jenkins 用户身份运行容器,因此这些可能不存在。您的npm install 可能使用需要有效用户和主目录的 SSH(或其他东西),但这些可能不存在于您的 Dockerfile 中。用户问题有JENKINS-38438
  • @mkobit 谢谢!但我已经在我的 docker 文件中将用户设置为 Jenkins,但事实并非如此
  • 你能发布一个导致你的问题的最小 Dockerfile 吗?

标签: docker jenkins npm jenkins-pipeline


【解决方案1】:

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

问题

  • Jenkins 运行管道作业
  • 此作业正在 debian slim 容器中运行命令
  • 所有命令都立即失败,没有错误输出,只有ERROR: script returned exit code -1
  • 在 docker 外部运行容器并使用相同的用户执行相同的命令正在正常工作

从 Jenkins 文件中提取:

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-35370Jenkins Docker Pipeline Exit Code -1

通过在我的 debian Dockerfile 中安装 procps 包解决了我的问题:

apt-get install -y procps

【讨论】:

  • 在安装 procps 修复时遇到了同样的问题
【解决方案2】:

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

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

在 npm 安装期间对我来说它失败了:

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 问题,这将使未来更清晰。

【讨论】:

  • 谢谢你,但这对我的问题没有帮助。
  • 我从来没有遇到过 EACCES 问题。
猜你喜欢
  • 2017-08-02
  • 2015-02-24
  • 2022-01-16
  • 2015-10-12
  • 2012-07-18
  • 1970-01-01
  • 2016-01-22
  • 2019-02-23
  • 2017-06-17
相关资源
最近更新 更多