jenkins管道:无法将构建参数传递给共享库变量

时间:2017-06-20 17:42:06

标签: jenkins groovy jenkins-pipeline

基本上我不能将构建属性传递给Library var call而不需要额外的废话。

jenkinsfile相关块:

tc_test{
    repo = 'test1'
    folder = 'test2'
    submodules = true
    refs = params.GitCheckout
}

导致错误

  

java.lang.NullPointerException:无法启用属性“GitCheckout”   null object

然而,这有效:

def a1 = params.GitCheckout
tc_test{
    repo = 'test1'
    folder = 'test2'
    submodules = true
    refs = a1
}

共享库中vars / tc_test.groovy的内容:

def call ( body ) {

    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config
    try {
        body()
    } catch(e) {
        currentBuild.result = "FAILURE";
        throw e;
    } finally {

        config.each{ k, v -> println "${k}:${v}" }

    }
}

我对groovy并不是很好,所以它可能是显而易见的。

2 个答案:

答案 0 :(得分:4)

来自Jenkins JIRA的the answer

小解决方法是使用地图而不是闭包:

tc_test ([
  repo: 'test1',
  folder: 'test2',
  submodules: true,
  refs = params.GitCheckout
])

可能有缺点,但对我来说效果很好。

仍然必须将params作为参数传递才能访问它们,但至少代码现在更有意义。

答案 1 :(得分:1)

假设您有一个共享库来调用Rundeck作业,

参数:
1 runDeckJobId-在设置中可用的Rundeck唯一作业ID。
2 role-与Rundeck Job相关的广告组
3 runDeckProject-在rundeck中配置的项目的名称。
4 optional-所有可选参数作为Map。
    -rundeckInstanceType-Rundeck实例当前在英国或香港。
    -retries-启动后重试以检查作业状态的次数(默认值= 100)
    -timeout-每次重试之前要等待的秒数(默认值= 15)
    -verbose-如果需要在rundeck api调用中进行详细调用(默认值= false)
    -rundeckArgs-所有rundeck参数均作为地图。例如:PlayBook的名称,清单文件的位置。

JenkinsFile中的示例用法:

if (isRundeckDeployment == "true") {
    def optional = [
        rundeckInstance : "UK",
        timeout : 10,
        rundeckArgs : [
            artifactPack      : "${artifactPath}",
            DEPLOYMENT_ENVIRONMENT: "${deploymentEnvironment}",
            EXTRA_ARGS            : "-e deployment_serial=1"
        ]
    ]
    triggerRundeckJob("job-id", "AD-group-id", "BitbucketKey", optional)
} 

共享库函数,文件名:vars文件夹中的triggerRundeckJob

def call(String rundeckJobId, String role, String  rundeckProject, Map optional) {

    String jobUserId
    wrap([$class: 'BuildUser']) {
        jobUserId = "${BUILD_USER_ID}"
    }
    // Determine rundeck instance type, by default instance is UK (rundeckAuthToken)
    String mainRundeckId  = optional.rundeckInstance == "HK" ? "rundeckAuthTokenHK": "rundeckAuthToken"
    String rundeckBaseURL = optional.rundeckInstance == "HK" ? "https://rundeckUrl/selfservice" : "https://rundeckUrl:9043/selfservice"

    withCredentials([string(credentialsId: mainRundeckId, variable: 'mainRundeckIdVariable')]) {
        int retries     = optional.retries ?: 100
        int timeout     = optional.timeout ?: 15
        String verbose  = optional.verbose? "-v" : "-s"
        String rundeckArgsString = optional.rundeckArgs.collect{ "-${it.key} \\\"${it.value}\\\"" }.join(" ")

        def tokenResponse = sh(returnStdout: true, script: "curl -k ${verbose} -X POST -d '{\"user\": \"${jobUserId}\",\"roles\":\"${role}\",\"duration\":\"30m\"}' -H Accept:application/json -H 'Content-Type: application/json' -H X-Rundeck-Auth-Token:${mainRundeckIdVariable} ${rundeckBaseURL}/api/19/tokens")
        def tokenResponseJson = readJSON text: tokenResponse

        def rundeckResponse =  sh(returnStdout: true, script: "curl -k ${verbose} --data-urlencode argString=\"${rundeckArgsString}\" -H Accept:application/json -H X-Rundeck-Auth-Token:${tokenResponseJson.token} ${rundeckBaseURL}/api/19/job/${rundeckJobId}/run")
        def rundeckResponseJson = readJSON text: rundeckResponse

        if(!rundeckResponseJson.error){
            while(true){
                if(retries==0) {
                    currentBuild.result = "FAILURE"
                    echo "Rundeck Job Timedout, See: ${rundeckBaseURL}/project/${rundeckProject}/job/show/${rundeckJobId}"
                    break;
                }
                def jobStateResponse = sh(returnStdout: true, script:"curl -k ${verbose} -H Accept:application/json -H X-Rundeck-Auth-Token:${tokenResponseJson.token} ${rundeckBaseURL}/api/19/execution/${rundeckResponseJson.id}/state")
                def jobStateResponseJson = readJSON text: jobStateResponse

                if(jobStateResponseJson.completed) {
                    if(jobStateResponseJson.executionState == "FAILED") {
                        currentBuild.result = "FAILURE"
                        echo "Rundeck Job FAILED, See: ${rundeckBaseURL}/project/${rundeckProject}/job/show/${rundeckJobId}"
                        break
                    }else{
                        currentBuild.result = "SUCCESS"
                        echo "Rundeck Job SUCCESS, See: ${rundeckBaseURL}/project/${rundeckProject}/job/show/${rundeckJobId}"
                        break
                    }
                }
                else{
                    sleep timeout
                }
                retries--
            }
        }else{
            echo "******************Rundeck Job Error: ${rundeckResponseJson.message} ******************"
            currentBuild.result = "FAILURE"
        }
    }
}