减少用于并行运行多个作业的管道脚本

时间:2020-10-05 12:28:30

标签: jenkins groovy jenkins-pipeline jenkins-plugins jenkins-groovy

我在下面的代码段中获得了匹配的作业名称,然后触发了所有它们并行运行。

共享库文件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来看,该脚本有点忙,不容易获取。这样做的主要目的是我希望减少管道脚本,使其更简洁,易于他人维护。简单的事情就像将外部方法称为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插件,但是我无法导入它并在该commonMethods库中使用它(该本地库我仅使用load ()方法是管道脚本的第一阶段。

所以我的问题是

  • 我可以在上面提到的外部库中使用Jenkins Pipeline Build Step插件吗?
  • 如果第一个问题无法解决,我想知道是否有任何更简洁的方法可以使我的脚本更简单,更简洁?

谢谢大家!

1 个答案:

答案 0 :(得分:1)

不确定它是否可运行并且看起来更清晰,但我只是尝试将所有问题和评论汇总在一起

<ul class="dropdown-menu">

    <div class="col-lg-6 mb-4" style="width: 300px;">
        <?php
        for ($x = 0; $x < sizeof($userguilds); $x++) {
            if ($userguilds[$x]->owner == 1) {
                //print_r($userguilds[$x]->name);
                echo "<h6 onclick='myFunction(this)' id='" . $userguilds[$x]->name . "'><li ><a href='#' >" . $userguilds[$x]->name . "</a></li></h6>";
            }
        }
        ?>
        <script>
            function myFunction(element) {
                console.log(element.id);
            }
        </script>
</ul>