【发布时间】:2018-05-05 05:22:48
【问题描述】:
我有一个构建和运行 Docker 机器的 Jenkins 管道,它不是作为代理,而是使用脚本块以及 Docker 管道插件方法 docker.build() 和 Image.run()。这工作正常,但如果构建失败,docker 容器将继续运行!我目前在post{ always{} } 块中有Container.stop(),但它似乎不起作用。我不希望 ssh 进入我的 Jenkins 服务器以在每次构建后删除容器,我不能只留下它,因为它有一个特定且必要的名称。 无论构建失败,我如何停止和 rm 容器?
我的管道:
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的 docker 机器 outside 声明变量 (def receiver_container)。然后你可以从管道中的任何地方调用它,它会被识别。 -
您能否提供您的解决方案来回答您自己的问题?
标签: docker jenkins-plugins jenkins-pipeline