2017-07-25 62 views
4

我有一個Jenkins管道,可以構建並運行Docker機器,而不是作爲代理,但使用腳本塊以及Docker管道插件方法docker.build()Image.run()。這工作正常,但如果構建失敗,碼頭集裝箱仍在運行!我目前在post{ always{} }塊中有Container.stop(),但似乎不起作用。我不希望ssh進入我的Jenkins服務器,以便在每次構建後刪除容器,我不能只留下它,因爲它有一個特定的名稱。 無論構建失敗,我如何停止和rm容器?使用Docker Pipeline Plugin時,在Jenkins停止和移除Docker容器的正確方法是什麼?

我的管道:

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('[email protected]') 
     } 
     changed { 
      sendEmail('[email protected]') 
     } 
    } 
} 
+0

我發現了答案。您必須爲'pipeline'的docker機器_outside_聲明變量('def receiver_container')。然後,您可以從管道中的任何位置調用它,並且會被識別。 – medley56

+0

你能否提供你的解決方案作爲你自己問題的答案? –

回答

2

這裏是一個可行的解決方案。您只需要爲主管道外的容器定義一個變量。然後,您可以在管道中的任何位置使用它來啓動或停止容器。特別是,您可以刪除post{ always{ } }中的容器。

def receiver_container 
pipeline { 
    agent any 
    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 receiver_docker") 
        receiver_container = receiver.run("-d -u 0:0 -v /var/lib/jenkins/workspace/RsyncRealtime/jenkins_rt:/DSK1/SSN/LOG5_F/17191 --network='rsync_test' --name='test_receiver'") 
       } 
      } 
     } 
     stage('Run Unit Tests') { 
      agent { 
       dockerfile { 
        args '-u 0:0 -v /etc/passwd:/etc/passwd --network="rsync_test"' 
       } 
      } 
      steps { 
       sh "sshpass -p 'test' ssh [email protected]_receiver ls -l /DSK1/SSN/LOG5_F/17191" 
       sh "python ./rsyncUnitTests.py" 
      } 
     } 
    } 
    post { 
     always { 
      script { 
       receiver_container.stop() 
      } 
     } 
     failure { 
      sendEmail('[email protected]') 
     } 
     changed { 
      sendEmail('[email protected]') 
     } 
    } 
} 
相關問題