input 流水线交互


其实就审批,交互,审批使用的是input这个插件。这个可以实现流水线和我们交互,确认之后才能进行下一步,同时还可以在这个期间选参数,这个参数是通过交互式传到流水线的值。

主要就是交互式的逻辑和引用,一个是怎么加交互式的阶段,然后就是怎么将参数传递到后续的作业里面。

 input {
                message "是否继续发布"
                ok "Yes"
                submitter "admin"
                parameters {
                  string( name: 'username', defaultValue: '', description: '用户名', trim: true)
                }
            }

在部署之前,也就是构建之前弹出选择框,那个是参数化构建,如下所示:

如果想在部署的时候弹出选择框去选是否要继续,还是是否要跳过。这个时候就需要input了,input就是要和我们做交互的,比如shell里面的read -p将参数的值给一个变量。

参数解析

  • message: 提示信息
  • ok: 表单中确认按钮的文本(提交按钮展示的值,可以写成提交或者yes)
  • submitter: 提交人,默认所有人可以(谁可以去审批)
  • parameters: 交互时用户选择的参数
input {
  message '请选择版本号'
  ok '提交'
  submitter 'devops'
  parameters {
    choice choices: ['1.1.1', '1.1.2'], description: '', name: 'VERSION'
  }
}

允许的提交者是Jenkins里面的用户,input最好写到stage里面

stage('Hello') {
         input {
           message '请选择版本号'
           ok '提交'
           submitter 'devops'
           parameters {
           choice choices: ['1.1.1', '1.1.2'], description: '', name: 'VERSION'
          }
             
         }

            steps {
                script{
                    echo "The input variable version is ${VERSION}"

如果这里可选的是一个数组,那么方式如下:

def lists = [1,2,3,4,5]

choice choices: lists, description: '', name: 'VERSION'

16:26:44  The input variable version is 1.1.2

高级一点的用法,input和Extended Choice Parameter结合

/*
清理docker镜像

1. 获取镜像列表
2. 用户选择删除
3. 调用api删除

*/
pipeline {
    agent {
        label "build"
    }

    stages{

        stage("GetTags"){
            steps{
                script{
                    env.projectName = "library"
                    env.repoName = "sonarqube"
                    env.result = GetArtifactTag(env.projectName, env.repoName)
                    env.result = env.result - '[' - ']'
                    println(result) // 8.9, 8.9.1, 8.9.2-community
                }
            }
        }

        stage("Clean"){
            steps{
                script{

                    def result = input  message: "是否删除${env.projectName}项目的${env.repoName}这些标签:", 
                                        parameters: [extendedChoice(defaultValue: "${env.result}", 
                                                                    multiSelectDelimiter: ',', 
                                                                    name: 'taga', 
                                                                    quoteValue: false, 
                                                                    saveJSONParameterToFile: false, 
                                                                    type: 'PT_CHECKBOX', 
                                                                    value: "${env.result}", 
                                                                    visibleItemCount: 20)]
                    println("${result}")
                    // println("Delete  ${taga}, doing.......")
                    // tags = "${taga}" - '[' - ']'

                    for(t in result.split(',')){
                        println("Delete >>>>" + t.trim())
                        DeleteArtifactTag(env.projectName,env.repoName, t.trim())
                    }
                }
            }

        }
    }
}


// 删除镜像tag
def DeleteArtifactTag(projectName,repoName, tagName){
    harborAPI = "http://192.168.1.200:8088/api/v2.0/projects/${projectName}/repositories/${repoName}"
    apiURL = "artifacts/${tagName}/tags/${tagName}"
    sh """ curl -X DELETE "${harborAPI}/${apiURL}" -H "accept: application/json"  -u admin:Harbor12345 """
}


// 获取镜像的所有标签
// acmp-nginx-service
def GetArtifactTag(projectName,repoName ){
    harborAPI = "http://121.40.102.116:8888/api/v2.0/projects/${projectName}/repositories/${repoName}"
    apiURL = "artifacts?page=1&page_size=10"
    response = sh returnStdout: true, script:  """curl -X GET "${harborAPI}/${apiURL}" -H "accept: application/json" -u admin:Harbor12345 """
    response = readJSON text: """${response - "\n"}""" 
    tags = []
    for (t in response[0].tags){
        tags << t.name
    }

    return tags   // [8.9, 8.9.1, 8.9.2-community]
}

 

stage("CheckHealth"){
    steps{
        script{
            result = sh returnStdout: true, script: """ curl "http://${env.domainName}/health" """
            if (result == "ok\n"){
                println("success!")
            }
        }
    }
}

stage("RollOut"){
    input {
        message "是否进行回滚"
        ok "提交"
        submitter "zeyang,aa"
        parameters {
            choice(choices: ['yes', 'no'], name: 'opts')
        }
    }

    steps{
        script{
            switch("${opts}") {
                case "yes":
                def result = input  message: "选择回滚版本?", 
                    parameters: [choice(choices: env.REVISION, name: 'rversion')]

                println("${result}")
                sh "helm rollback ${env.appName} ${result} -n ${env.namespace} "
                break

                case "no":
                break
            }
        }
    }
}
Logo

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

更多推荐