我正在尝试在 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步骤和其他步骤没有执行?
我终于想通了这一点。如果您的 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 全局配置并确保您没有意外定义任何空的环境变量:
如果这些存在,您需要删除它们并重新运行。
| 归档时间: |
|
| 查看次数: |
3134 次 |
| 最近记录: |