1.获取镜像harbor镜像tag
1.1 jenkins安装Active Choices
1.2 新建一个pipelin流水线,配置级联变量。 打开配置-勾选参数化构建- 添加参数,选择Active Choices Parameter 。
**name:** Harbor_Pro
**Groovy Script:** return["base","ops","oa"]
1.3 打开配置-勾选参数化构建- 添加参数,选择Active Choices Reactive Parameter 。
**name:** Image_Name
**Groovy Script:** def get_list = [ "bash","-c", "curl -s -X 'GET' 'https://harbor.xx.com/api/v2.0/projects/${Harbor_Pro}/repositories?page=1&page_size=10' -H 'accept: application/json' -H 'authorization: Basic YWRtaW46YWRtaW4=' | xargs -d ',' -n1 | xargs -n1 | grep name | awk -F / '{print \$2}'" ]
return get_list.execute().text.tokenize("\n")
**Referenced parameters:** Harbor_Pro
1.4 打开配置-勾选参数化构建- 添加参数,选择Active Choices Reactive Parameter 。
**name:** Image_Tag
**Groovy Script:** def get_tag = [ "bash", "-c", "curl -s -H 'authorization: Basic YWRtaW46YWRtaW4=' -H 'Content-Type: application/json' -X GET https://harbor.xx.com/v2/${Harbor_Pro}/${Image_Name}/tags/list | sed -r 's#(\\{.*\\[)(.*)(\\]\\})#\\2#g' | xargs -d ',' -n1 | xargs -n1 | sort -t '_' -k2 -k3 -nr | head -5"]
return get_tag.execute().text.tokenize("\n")
**Referenced parameters:** Harbor_Pro,Image_Name
1.5 应用保存,查看效果
2. 发布应用至k8s生产环境以及快速回滚
Pipeline脚本:
pipeline {
agent {
kubernetes {
cloud 'kubernetes'
yaml '''
apiVersion: v1
kind: Pod
spec:
imagePullSecrets:
- name: harbor-admin
containers:
- name: kubectl
image: harbor.xx.com/ops/kubectl:1.22.2
imagePullPolicy: IfNotPresent
command: ["cat"]
tty: true
'''
}
}
environment {
Full_Image = "harbor.xx.com/${Harbor_Pro}/${Image_Name}:${Image_Tag}"
}
stages {
stage('输出完整的镜像名称') {
steps {
sh 'echo 镜像名称-tag: ${Full_Image}'
}
}
stage('部署应用至K8S') {
steps {
withCredentials([file(credentialsId: 'kubeconfig', variable: 'KUBECONFIG')]) {
container('kubectl'){
sh 'mkdir -p ~/.kube && cp ${KUBECONFIG} ~/.kube/config'
sh 'kubectl set image deployment/${Image_Name} ${Image_Name}=${Full_Image} -n ${Harbor_Pro}-prod'
}
}
}
}
stage('快速回滚') {
steps {
withCredentials([file(credentialsId: 'kubeconfig', variable: 'KUBECONFIG')]) {
container('kubectl'){
script {
timeout(time:1 , unit: 'HOURS'){
def UserInput = input message: '是否回退至上一个版本', parameters: [choice(choices: ['No', 'Yes'], name: 'rollback')]
if (UserInput == "Yes"){
sh 'mkdir -p ~/.kube && cp ${KUBECONFIG} ~/.kube/config'
sh 'kubectl rollout undo deployment ${Image_Name} -n ${Harbor_Pro}-prod'
}else {
echo "没有选择回退"
}
}
}
}
}
}
}
}
}