首页 > 解决方案 > Jenkins 管道 - 如何读取输入参数、拆分其值并将值传递给构建作业?

问题描述

我配置了一个詹金斯管道,它调用不同的构建作业并将不同的值传递给作业。我配置了多个套件,这些套件会触发作业并行运行。这是示例代码:

pipeline {
  agent any
  parameters {
    string(name: 'ARRAY', defaultValue: 'AR1234', description: 'Enter array. ')
    string(name: 'email_recepients', defaultValue: 'abc@xyz.com', description: 'Enter email id')
    choice(name: 'regression_suite', choices: ['suite1', 'suite2', 'all'], description: '')
    choice(name: 'PRODUCT_RELEASE', choices: ['R1', 'R2'], description: 'Release on which test is being run')
    choice(name: 'interface', choices: ['int1', 'int2'], description: 'interface to use?')
    choice(name: 'Update_UTMS', choices: ['false', 'true'], description: 'Update UTMS/QC? If yes, select true')
    string(name: 'testset_id_1', defaultValue: 'NA', description: 'If Suite1, enter xxx ID <br> \
                       If Suite2, enter yyy ID <br> ')
    string(name: 'testset_id_2', defaultValue: 'NA', description: 'If Suite1, enter zzz ID <br> \
                       If Suite2, enter aaa ID <br> ')
    string(name: 'testset_id_3', defaultValue: 'NA', description: 'If Suite1, enter bbb ID <br> \
                       If Suite2, enter ccc ID <br>')
    string(name: 'testset_id_4', defaultValue: 'NA', description: 'If Suite1, enter ddd ID <br> \
                       If Suite2, enter fff ID <br>')
    string(name: 'testset_id_5', defaultValue: 'NA', description: 'If Suite1, enter eee ID')
    string(name: 'testset_all', defaultValue: '1,2,3,4,5,6,7,8,9', description: 'All of Testset IDs')
  }

  stages {
    stage('Starting Suite1 (Parallel execution)') {

      when {
        expression {
          params.regression_suite == "suite1" || params.regression_suite == "all"
        }
      }

      steps {
        script {
          try {
            catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
            suite1()
          }

          } finally {
            echo "Suite1 completed, but we continue"
          }
        }
      }
    }

    stage('Starting Suites2 (Parallel execution)') {

      when {
        expression {
          params.regression_suite == "suite2" || params.regression_suite == "all"
        }
      }

      steps {
        script {
          try {
            catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
            suite2()
          }

          } finally {
            echo "Suite2 completed, but we continue"
          }
        }
      }
    }

    
  }
}
def suite1() {
  parallel(
  bla1: {
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla1'), string(name: 'Interface', value: params.interface + '_0'),booleanParam(name: 'Update_UTMS', value: params.Update_UTMS), string(name: 'utms_testset_id', value: "${params.testset_id_1}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  bla1: {
    sleep(60)
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla2'), string(name: 'Interface', value: params.interface + '_1'),booleanParam(name: 'Update_UTMS', value: params.Update_UTMS), string(name: 'utms_testset_id', value: "${params.testset_id_2}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  bla3: {
    sleep(120)
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla3'), string(name: 'Interface', value: params.interface + '_2'),booleanParam(name: 'Update_UTMS', value: params.Update_UTMS), string(name: 'utms_testset_id', value: "${params.testset_id_3}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  bla4: {
    sleep(180)
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla4'), string(name: 'Interface', value: params.interface + '_3'),booleanParam(name: 'Update_UTMS', value: false), string(name: 'utms_testset_id', value: "${params.testset_id_4}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  bla5: {
    sleep(240)
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla5'), string(name: 'Interface', value: params.interface + '_4'),booleanParam(name: 'Update_UTMS', value: params.Update_UTMS), string(name: 'utms_testset_id', value: "${params.testset_id_5}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  failFast: false)
}

def suite2() {
  parallel(
  bla6: {
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla6'), string(name: 'Interface', value: params.interface + '_0'), string(name: 'utms_testset_id', value: "${params.testset_id_1}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  bla7: {
    sleep(60)
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla7'), string(name: 'Interface', value: params.interface + '_1'), string(name: 'utms_testset_id', value: "${params.testset_id_2}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  bla8: {
    sleep(180)
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla8'), string(name: 'Interface', value: params.interface + '_3'), string(name: 'utms_testset_id', value: "${params.testset_id_3}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  bla9: {
    sleep(240)
    build job: 'sd_regression',
    parameters: [string(name: 'ARRAY', value: "${params.ARRAY}"), string(name: 'email_recepients', value: "${params.email_recepients}"), string(name: 'test_type', value: 'bla9'), string(name: 'Interface', value: params.interface + '_4'), string(name: 'utms_testset_id', value: "${params.testset_id_4}"), string(name: 'PRODUCT_RELEASE', value: params.PRODUCT_RELEASE)]
  },
  failFast: false)
}

在这里,我有一个名为regression_suite的输入参数,它有一个名为all的选项。如果选择全部,则用户将为参数testset_all提供逗号分隔值(例如:1,2,3,4,5)。

我想要一个代码,我可以在其中读取这些值并将它们拆分并将其存储在变量中。然后我会将这些值替换为我的工作参数。
示例:
var_1= 1
var_2= 2
var_3= 3 等等。谢谢你。

标签: jenkinsgroovycontinuous-integrationjenkins-pipelinejenkins-groovy

解决方案


您可以使用下面的管道脚本,我已经遍历数组并打印了值,而不是 echo 语句,您可以将其分配给变量。

def loop_func(values){
    values.each {
        item -> echo "Hello ${item}"
    }
}
pipeline {
    agent any
    parameters {
        choice(name: 'regression_suite', choices: ['suite1', 'suite2', 'all'], description: '')
        string(name: 'testset_all', defaultValue: '1,2,3,4,5,6,7,8,9', description: 'All of Testset IDs')
    }
    stages {
        stage ("Test Stage"){
            when {
                expression {
                    "${params.regression_suite}" == "all"
                }
            }
            steps {
                script {
                    def values = "${params.testset_all}".split(',')
                    loop_func(values)
                }
            }
        }
    }
}

更新:

def loop_func(values){
    for (int i=0; i<values.size();i++) {
        env."var_${i}"=values[i]
    }
}
pipeline {
    agent any
    parameters {
        choice(name: 'regression_suite', choices: ['suite1', 'suite2', 'all'], description: '')
        string(name: 'testset_all', defaultValue: '1,2,3,4,5,6,7,8,9', description: 'All of Testset IDs')
    }
    stages {
        stage ("Test Stage"){
            when {
                expression {
                    "${params.regression_suite}" == "all"
                }
            }
            steps {
                script {
                    def values = "${params.testset_all}".split(',')
                    loop_func(values)
                    echo "The final Value is : ${env.var_6}"
                }
            }
        }
        stage("Test Stage2"){
            steps{
                echo "${env.var_8}"
            }
        }
    }
}

推荐阅读