引言

在创建 Jenkins Job,需要设置一些参数,有时想偷懒,在手动触发 Build 时不想输入太多参数,如果一些参数能互相关联就好了。这款 Active Choices Reactive Parameters 类型参数可以实现。

内容提要:

  1. 安装 Active Choices Plugin
  2. UI 应用 Active Choices Reactive Parameters
  3. Pipeline 脚本应用

安装 Active Choices Plugin

在用 Active Choices Reactive Parameters 之前,确保 Jenkins 上安装 Active Choices 插件。
Manage Jenkins -> pluginManager
在这里插入图片描述
安装成功后,打开 Job Configure 页面,勾上 This project is parameterized , 点开 Add Parameter,会看到多出下面三个选项。
在这里插入图片描述

应用 Active Choices Reactive Parameters

达成的效果如下:根据 Env 和 Project_Name 的数据动态生成 Smoke_Job_Name
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

首先添加 Env 和 Project_Name 参数:选择 Extensible Choice 参数类型
注意不要勾选 Editable,本人试过,动态参数不会动态生成
在这里插入图片描述
在这里插入图片描述
添加动态关联参数:选择 Active Choices Reactive Parameters 参数类型,具体介绍请参考官网 Active Choice

Fallback Script, 是当脚本运行失败或抛异常的处理。

在这里插入图片描述

Groovy 脚本:

if(Project_Name.equals("A") && Env.equals("Dev")){
return ["Dev/API-Test/A_Dev_Smoke"]
}else if(Project_Name.equals("A") && Env.equals("Prod")){
return ["Dev/API-Test/A_Prod_Smoke"]
}else if(Project_Name.equals("B") && Env.equals("Dev")){
return ["Dev/API-Test/B_Dev_Smoke"]
}else if(Project_Name.equals("B") && Env.equals("Prod")){
return ["Dev/API-Test/B_Prod_Smoke"]
}else{
return ["Not Ready"]
}

如果 Choice Type 选择 Multi Select,Groovy 脚本中也可以返回多个 Item, 例如:
return [“item 1”, “item 2”]
在这里插入图片描述

Pipeline 脚本应用

先看一下达成的效果:根据 Env 参数,动态绑定 Server 参数
在这里插入图片描述

在这里插入图片描述
Pipeline Groovy 脚本:
注意: sandbox: true

properties([
    parameters([
        [$class: "ChoiceParameter", 
            choiceType: "PT_SINGLE_SELECT", 
            description: "Select the Env Name from the Dropdown List", 
            filterLength: 1, 
            filterable: false, 
            name: "Env", 
            randomName: "choice-parameter-5631314439613978", 
            script: [
                $class: "GroovyScript", 
                fallbackScript: [
                    classpath: [], 
                    sandbox: true, 
                    script: 
                        '''return["Could not get Env"]'''
                ], 
                script: [
                    classpath: [], 
                    sandbox: true, 
                    script: 
                       '''return["Dev","QA","Stage","Prod"]'''
                ]
            ]
        ], 
        [$class: "CascadeChoiceParameter", 
            choiceType: "PT_SINGLE_SELECT", 
            description: "Select the Server from the Dropdown List", 
            filterLength: 1, 
            filterable: false, 
            name: "Server", 
            randomName: "choice-parameter-5631314456178619", 
            referencedParameters: "Env", 
            script: [
                $class: "GroovyScript", 
                fallbackScript: [
                    classpath: [], 
                    sandbox: true, 
                    script: 
                        '''return["Could not get Environment from Env Param"]'''
                ], 
                script: [
                    classpath: [], 
                    sandbox: true, 
                    script: 
                        ''' if (Env.equals("Dev")){
                                return["devaaa001","devaaa002","devbbb001","devbbb002","devccc001","devccc002"]
                            }
                            else if(Env.equals("QA")){
                                return["qaaaa001","qabbb002","qaccc003"]
                            }
                            else if(Env.equals("Stage")){
                                return["staaa001","stbbb002","stccc003"]
                            }
                            else if(Env.equals("Prod")){
                                return["praaa001","prbbb002","prccc003"]
                            }
                        '''
                ]
            ]
        ]
    ])
])

pipeline {
  environment {
         vari = ""
  }
  agent any
  stages {
      stage ("Example") {
        steps {
         script{
          echo 'Hello'
          echo "${params.Env}"
          echo "${params.Server}"
          if (params.Server.equals("Could not get Environment from Env Param")) {
              echo "Must be the first build after Pipeline deployment.  Aborting the build"
              currentBuild.result = 'ABORTED'
              return
          }
          echo "Crossed param validation"
        } }
      }
  }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐