我有一个Jenkins管道,用于构建和运行Docker机器,而不是代理,但使用脚本块以及Docker管道插件方法docker.build()
和Image.run()
。这工作正常,但如果构建失败,docker容器将继续运行!我目前在Container.stop()
块中有post{ always{} }
但它似乎无法正常工作。我不希望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')
}
}
}
答案 0 :(得分:2)
这是一个有效的解决方案。您只需为容器外部主流水线定义一个变量。然后,您可以在管道中的任何位置使用它来启动或停止容器。特别是,您可以在localStorage.removeItem('AddToFav');
。
post{ always{ } }
答案 1 :(得分:2)
您可以使用Image.withRun()而不是Image.run()。
Image.withRun [(args [,command])] {...}
与run一样,但只要它的主体退出就会停止容器,所以你不需要try-finally块。
这里有其他有用的命令: https://qa.nuxeo.org/jenkins/pipeline-syntax/globals#docker