Jenkins pipeline 07 input 流水线交互
input 流水线交互在部署之前,也就是构建之前弹出选择框,那个是参数化构建,如下所示:如果想在部署的时候弹出选择框去选是否要继续,还是是否要跳过。这个时候就需要input了,input就是要和我们做交互的,比如shell里面的read -p将参数的值给一个变量参数解析message: 提示信息ok: 表单中确认按钮的文本submitter: 提交人,默认所有人可以parameters: 交互时用
·
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
}
}
}
}
更多推荐
已为社区贡献26条内容
所有评论(0)