我有一个 Jenkins 流水线,它构建并运行 Docker 机器(不是作为代理),而是使用脚本块以及 Docker Pipeline 插件方法 docker.build()
和 Image.run()
。这个流程很好用,但如果构建失败,Docker 容器就会保持运行状态!我目前在 post { always{} }
块中使用 Container.stop()
,但似乎不起作用。我不想通过 ssh 连接到我的 Jenkins 服务器来删除每次构建后的容器,因为它具有特定且必要的名称。 无论构建是否失败,我该如何停止并删除容器?
我的流水线:
pipeline {
agent none
stages {
stage('Checkout') {
agent any
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '<some credentials>', url: '<a git repo>']]])
}
}
stage('Spin Up Receiver') {
agent any
steps {
script {
def receiver = docker.build("receiver", "--rm centos7_receiver")
def receiver_container = receiver.run("-d -v ${PWD}/realtime_files/station_name/201707/f/20170710_191:/DSK1/SSN/LOG0_f/17001 --network='rsync_test' --name='test_receiver'")
}
}
}
stage('Run Tests') {
agent { dockerfile { args '-v /etc/passwd:/etc/passwd --network="rsync_test"' } }
steps {
sh "python ./rsyncUnitTests.py"
}
}
}
post {
always {
script {
receiver_container.stop()
}
}
failure {
sendEmail('foo@bar.com')
}
changed {
sendEmail('foo@bar.com')
}
}
}
pipeline
之外声明变量(def receiver_container
),然后就可以在管道的任何地方调用它并被识别。 - medley56