簡體   English   中英

減少並行運行多個作業的管道腳本

[英]Reduce the pipeline script for running multiple jobs parallel

我有下面的代碼片段來獲取匹配的作業名稱,然后觸發所有它們並行運行。

共享庫文件CommonPipelineMethods.groovy

import jenkins.instance.*
import jenkins.model.*
import hudson.model.Result
import hudson.model.*

import org.jenkinsci.plugins.workflow.support.steps.*

class PipelineMethods {

def buildSingleJob(downstreamJob) {
    return {
        result = build job: downstreamJob.fullName, propagate: false
        echo "${downstreamJob.fullName} finished: ${result.rawBuild.result}"
        }
    }

}
return new PipelineMethods();

主要的 Jenkinsfile 腳本:

def commonPipelineMethods;

pipeline {
    stages {
        stage('Load Common Methods into Pipeline') {
            def JenkinsFilePath = '/config/jenkins/jobs'
            commonPipelineMethods = load "${WORKSPACE}${JenkinsFilePath}/CommonPipelineMethods.groovy"
        }
        stage('Integration Test Run') {
            steps {
                script {
                    matchingJobs = commonPipelineMethods.getIntegrationTestJobs(venture_to_test, testAgainst)
                    parallel matchingJobs.collectEntries{downstreamJob-> [downstreamJob.name, commonPipelineMethods.buildSingleJob(downstreamJob)]}
                }
            }
        }
    }
}

該腳本工作正常,但從Map .... parallel step for parallel來看Map .... parallel step for parallel該腳本有點忙,不容易得到它。 這樣做的主要目的是我想減少管道腳本,使其更清晰,更易於其他人幫助維護。 一些簡單的事情,比如將外部方法調用為matchingJobs = commonMethods.getIntegrationTestJobs(venture, environment) ,因此其他人可以立即理解它並知道代碼在此上下文中的作用。

我嘗試了幾種方法來改進它,但似乎它是否將其中的一部分用於在管道本身之外但在外部庫中構建單個作業,例如

def buildSingleJobParallel (jobFullName) {
        String tempPipelineResult = 'SUCCESS'
        result = build job: jobFullName, propagate: false
        echo "${jobFullName} finished: ${result.rawBuild.result.toString()}"
            if (result.rawBuild.result.isWorseThan(Result.SUCCESS)) {
                tempPipelineResult = 'FAILURE'
                }
    }

然后詹金斯提示我groovy.lang.MissingMethodException: No signature of method: PipelineMethods.build() is applicable for argument types: (java.util.LinkedHashMap) values: [[job:test_1, propagate:false]]

我可以理解build()方法來自 Jenkins Pipeline Build Steps Plugins,但我未能導入它並在commonMethods庫中使用它(這個本地庫我只是在我的管道腳本的第一階段使用load ()方法。

所以我的問題是

  • 我可以在上面提到的外部庫中使用 Jenkins Pipeline Build Step 插件嗎?
  • 如果第一個問題不可能,我想知道是否有任何更簡潔的方法可以使我的腳本更簡單、更簡潔?

謝謝大家!

不確定它是否可以運行並且看起來更清晰,但我只是嘗試將所有問題和評論放在一起


//function that returns closure to be used as one of parallel jobs
def buildSingleJobParallel(steps, mjob){ 
    return {
        def result = steps.build job: mjob.fullName, propagate: false
        steps.echo "${mjob.fullName} finished: ${steps.result.rawBuild.result}"
        if (result.rawBuild.result.isWorseThan(Result.SUCCESS)) {
            steps.currentBuild.result = 'FAILURE'
        }
    }
}



stage('Integration Test Run') {
    steps {
        script {
            //build map<jobName, Closure> and run jobs in parallel
            parallel matchingJobs.collectEntries{mjob-> [mjob.name, buildSingleJobParallel(this, mjob)]}
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM