Jenkins docker 容器只是挂起并且从不执​​行步骤

Yu *_*hen 3 jenkins docker

我正在尝试在 Jenkins 中运行 Python 映像以使用 pytest 执行一系列单元测试,但是我在使用 Docker 时遇到了一些奇怪的行为。

我的 Jenkinsfile 管道是

  agent {
      docker { image 'python:3.6-jessie' }
    }

    stages {
      stage('Run tests') {
        steps {
            withCredentials([
                string(credentialsId: 'a-secret', variable: 'A_SECRET')
            {

              sh label: "Install dependencies", script: 'pip install -r requirements.txt'
              sh label: 'Execute tests', script: "pytest mytests.py"
            }
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行管道时,Docker 似乎正在执行一条很长的指令(-e环境变量比我定义的凭据多得多?),然后是cat.

然后构建只是挂起并且永远不会完成:

         Jenkins does not seem to be running inside a container
            $ docker run -t -d -u 996:994 
    -w /var/lib/jenkins/workspace/myproject 
    -v /var/lib/jenkins/workspace/myproject:/var/lib/jenkins/workspace/myproject:rw,z
    -v /var/lib/jenkins/workspace/myproject@tmp:/var/lib/jenkins/workspace/myproject@tmp:rw,z 
-e ******** -e ******** python:3.6-jessie cat
Run Code Online (Sandbox Code Playgroud)

当我通过 SSH 连接到我的实例并运行时docker ps,我看到

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
240d00459d92        python:3.6-jessie   "cat"               About a minute ago   Up About a minute                       kind_wright
Run Code Online (Sandbox Code Playgroud)

詹金斯为什么要跑cat?为什么 Jenkins 说我没有在容器内运行,但它已经清楚地为我创建了一个容器?最重要的是,为什么我的pip install -r requirements步骤和其他步骤没有执行?

Yu *_*hen 5

我终于想通了这一点。如果您的 Jenkins 配置中有空的全局环境变量,那么您似乎会得到一个格式错误的docker run命令,因为 Jenkins 将使用您的空字符串环境变量编写命令,如docker run -e some_env_var=some_value -e = ...

这将导致容器简单地挂起。

发生这种情况的一个明显迹象是您将收到错误消息:

invalid argument "=" for "-e, --env" flag: invalid environment variable: =
Run Code Online (Sandbox Code Playgroud)

这最初很难诊断,因为 Jenkins(理所当然地)用 *** 隐藏了您的实际凭据,因此空的环境字符串不会显示为空。

您需要检查您的 Jenkins 全局配置并确保您没有意外定义任何空的环境变量:

在此处输入图片说明

如果这些存在,您需要删除它们并重新运行。