我正在使用 Docker 管道插件通过 Docker 容器执行我的构建脚本。我注意到,如果我让脚本在inside()
命令中执行时返回非零退出代码,Jenkins 会将管道执行标记为失败。此示例 Jenkinsfile 说明了该场景:
docker.image('alpine').inside() {
sh 'exit 1'
}
但是,如果我使用 withRun()
命令,类似的 Jenkinsfile 不会导致构建失败,即使 docker ps -l
命令显示容器以非零状态退出:
node() {
sh 'touch ./test.sh'
sh 'echo "exit 1" >> ./test.sh'
sh 'chmod 755 ./test.sh'
docker.image('alpine').withRun("-v ${WORKSPACE}:/newDir", '/bin/sh /newDir/test.sh') {container ->
sh "docker logs ${container.id} -f"
sh 'docker ps -l'
}
}
如果容器以非零代码退出,有没有办法使构建失败withRun()
?
可能的解决方案之一:
docker.withRegistry("https://${REGISTRY}", 'creds-id') {
stage("RUN CONTAINER"){
Image = docker.image("${IMAGE}-${PROJECT}:${TAG}")
try {
c = Image.run("-v /mnt:/mnt")
sh "docker logs -f ${c.id}"
def out = sh script: "docker inspect ${c.id} --format='{{.State.ExitCode}}'", returnStdout: true
sh "exit ${out}"
} finally {
c.stop()
}
}
}
我无法从 withRun()
命令中找到有关退出代码的更多信息,因此我最终只是从sh
步骤执行docker run
命令:
node() {
sh 'touch ./test.sh'
sh 'echo "exit 1" >> ./test.sh'
sh 'chmod 755 ./test.sh'
sh "docker run --rm -v ${WORKSPACE}:/newDir alpine /bin/sh /newDir/test.sh"
}
运行一个基于docker wait
输出退出的脚本怎么样?
sh "exit $(docker wait ${container.id})"
wait
打印容器的退出代码,根据 sh 文档,如果出现错误会导致构建失败:
通常,以非零状态代码退出的脚本将导致步骤失败并出现异常。