Jenkins泊坞窗容器只是挂起而从未执行任何步骤

时间:2019-02-08 03:47:48

标签: docker jenkins

我正在尝试在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"
            }
     }
  }
}

但是,当我运行管道时,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

当我通过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

Jenkins为什么运行cat?当詹金斯为我明确创建了一个容器时,为什么詹金斯说我不在容器内运行?而且最重要的是,为什么我的pip install -r requirements和其他步骤没有执行?

1 个答案:

答案 0 :(得分:1)

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

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

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

invalid argument "=" for "-e, --env" flag: invalid environment variable: =

这最初很难诊断,因为詹金斯(正确地)用***隐藏了您的实际凭证,因此空的环境字符串不会显示为空。

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

enter image description here

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