我正在尝试在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
和其他步骤没有执行?
答案 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全局配置,并确保没有意外定义任何空环境变量:
如果存在,则需要删除它们并重新运行。