如果 Docker Pipeline Plugin withRun 命令返回非零退出代码,我如何使 Jenkins 构建



我正在使用 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 文档,如果出现错误会导致构建失败:

通常,以非零状态代码退出的脚本将导致步骤失败并出现异常。

最新更新