我尝试在 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
?为什么 Jenkins 说我没有在容器内运行,而它显然已经为我创建了一个容器?最重要的是,为什么我的 pip install -r requests
和其他步骤没有执行?
最佳答案
我终于明白了这一点。如果您的 Jenkins 配置中有空的全局环境变量,那么您似乎会得到格式错误的 docker run
命令,因为 Jenkins 将使用空字符串环境变量编写命令,如 docker run -e some_env_var=some_value -e = ...
这将导致容器简单地挂起。
发生这种情况的一个明显迹象是您会收到错误消息:
invalid argument "=" for "-e, --env" flag: invalid environment variable: =
这最初很难诊断,因为 Jenkins(正确地)用 *** 隐藏了您的实际凭据,因此空环境字符串不会显示为空。
您需要检查 Jenkins 全局配置并确保没有意外定义任何空环境变量:
如果存在,您需要删除它们并重新运行。
关于docker - Jenkins docker 容器只是挂起并且从不执行步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54585747/