一、概述
在前面的文章中,鏈接如下:
https://www.cnblogs.com/xiao987334176/p/13162700.html
已經通過Redeploy Rancher2.x Workload插件實現CI/CD,但是有一個問題,不能寫Pipeline腳本。
那么本文將介紹通過python腳本調用Rancher2.x api,以Pipeline腳本來實現CI/CD。
二、改造python腳本
在前面的文章中,鏈接如下:
https://www.cnblogs.com/xiao987334176/articles/13177526.html
已經通過python腳本調用Rancher2.x api,實現了修改鏡像地址。
但是在jenkins調用它時,需要傳一個BUILD_NUMBER參數給python腳本,來控制鏡像版本。
比如:
python rancher_deploy.py 100
其中,100就是BUILD_NUMBER
那么改造后的rancher_deploy.py代碼如下:
#!usr/bin/python # -*- coding: utf-8 -*- import requests # 去除requests警告信息 from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) import sys def update_image(BUILD_NUMBER): """ 修改鏡像地址 :param BUILD_NUMBER: jenkins構建id :return: bool """ CATTLE_ACCESS_KEY = 'token-v82g7' RANCHER_SECRET_KEY = 'zzph8mnrv7r2q5qqt9kds85xvjcwzpg5btkttpvj72nmfll8jmxn67' # 請求頭 header = {'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'Bearer {}:{}'.format(CATTLE_ACCESS_KEY, RANCHER_SECRET_KEY)} # 請求數據,r表示保留數據源格式。格式為:r"""json數據"""%BUILD_NUMBER content = r"""{"annotations":{"cattle.io/timestamp":"2020-06-22T10:42:46Z"},"containers":[{"allowPrivilegeEscalation":false,"image":"10.212.82.86:1180/java/admin-master:%s","imagePullPolicy":"Always","initContainer":false,"name":"admin-master","ports":[{"containerPort":8088,"dnsName":"admin-master-nodeport","hostPort":0,"kind":"NodePort","name":"tcp-8088","protocol":"TCP","sourcePort":0,"type":"/v3/project/schemas/containerPort"}],"privileged":false,"readOnly":false,"resources":{"type":"/v3/project/schemas/resourceRequirements"},"restartCount":0,"runAsNonRoot":false,"stdin":true,"stdinOnce":false,"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","tty":true,"type":"/v3/project/schemas/container"}],"created":"2020-06-22T10:42:46Z","creatorId":null,"deploymentConfig":{"maxSurge":1,"maxUnavailable":0,"minReadySeconds":0,"progressDeadlineSeconds":600,"revisionHistoryLimit":10,"strategy":"RollingUpdate"},"deploymentStatus":{"availableReplicas":1,"conditions":[{"lastTransitionTime":"2020-06-22T10:42:48Z","lastTransitionTimeTS":1592822568000,"lastUpdateTime":"2020-06-22T10:42:48Z","lastUpdateTimeTS":1592822568000,"message":"Deployment has minimum availability.","reason":"MinimumReplicasAvailable","status":"True","type":"Available"},{"lastTransitionTime":"2020-06-22T10:42:46Z","lastTransitionTimeTS":1592822566000,"lastUpdateTime":"2020-06-22T10:54:54Z","lastUpdateTimeTS":1592823294000,"message":"ReplicaSet \"admin-master-6c49c7c4b\" has successfully progressed.","reason":"NewReplicaSetAvailable","status":"True","type":"Progressing"}],"observedGeneration":7,"readyReplicas":1,"replicas":1,"type":"/v3/project/schemas/deploymentStatus","unavailableReplicas":0,"updatedReplicas":1},"dnsConfig":null,"dnsPolicy":"ClusterFirst","ephemeralContainers":[],"gids":[],"hostAliases":[],"hostIPC":false,"hostNetwork":false,"hostPID":false,"imagePullSecrets":[],"labels":{"workload.user.cattle.io/workloadselector":"deployment-default-admin-master"},"name":"admin-master","namespaceId":"default","nodeId":"","ownerReferences":[],"paused":false,"projectId":"c-l5nxb:p-dghs7","publicEndpoints":[],"readinessGates":[],"restartPolicy":"Always","scale":1,"scheduling":{"scheduler":"default-scheduler"},"selector":{"matchLabels":{"workload.user.cattle.io/workloadselector":"deployment-default-admin-master"},"type":"/v3/project/schemas/labelSelector"},"state":"active","sysctls":[],"terminationGracePeriodSeconds":30,"topologySpreadConstraints":[],"transitioning":"no","transitioningMessage":"","uuid":"96952959-73f4-48eb-9c8a-0476689c85f0","volumes":[],"windowsOptions":null,"workloadAnnotations":{"deployment.kubernetes.io/revision":"2","field.cattle.io/creatorId":"user-kmvzg"},"workloadLabels":{"cattle.io/creator":"norman","workload.user.cattle.io/workloadselector":"deployment-default-admin-master"},"workloadMetrics":[]}"""%BUILD_NUMBER # 應用服務api地址 api_url = 'https://10.212.82.86/v3/project/c-l5nxb:p-dghs7/workloads/deployment:default:admin-master' # 發送put請求,verify=False表示關閉驗證證書 r = requests.put(api_url, data=content, headers=header, verify=False) # print(r.text) # print(r.status_code) # 判斷返回狀態碼 if (r.status_code == 200): print('deploy ok') return True else: print('deploy error') return False if __name__ == '__main__': num = len(sys.argv) - 1 # 參數個數 if num < 1: exit("參數缺失,比如: python rancher_deploy.py 100") elif num > 1: exit("參數過多,比如: python rancher_deploy.py 100") else: pass BUILD_NUMBER = sys.argv[1] # jenkins構建id if not BUILD_NUMBER: exit("BUILD_NUMBER 不能為空") if not BUILD_NUMBER.isdigit(): exit("BUILD_NUMBER 必須是數字") ret = update_image(BUILD_NUMBER) if not ret: exit(1) else: exit(0)
說明:
content 參數要特別注意,格式為r"""json數據"""%BUILD_NUMBER。其中鏡像的版本比如用%s表示,后面的%BUILD_NUMBER會替換掉版本號。
在代碼末尾處,exit(0)表示正常。因為jenkins調用腳本時,退出碼為0,才會判斷為正常。否則為不正常!
由於一個分支,就是一個環境。這個python腳本,也是根據環境來的。因此,需要將此python代碼提交至項目根目錄即可。
三、Pipeline腳本
新建一個流水線風格的job

通用配置

參數化構建

流水線腳本

完整代碼如下:
env.CREDENTIALSID = '7a294fc5-2b2b-4d2d-92ff-54324e1b032a' env.BRANCHES = 'master' env.GIT_URL = 'ssh://git@10.212.21.158:/home/git/git_storage/admin-master' env.HARBOR_PROJECT = '10.212.82.86:1180/java/admin-master' node { if (env.Status == 'Deploy'){ stage('code pull') { checkout([$class: 'GitSCM', branches: [[name: env.BRANCHES]], doGenerateSubmoduleConfigurations: false, userRemoteConfigs: [[credentialsId: env.CREDENTIALSID, url: env.GIT_URL]]]) } stage('code Build') { sh 'mvn -f pom.xml clean package' } stage('docker push') { sh 'cd ${WORKSPACE} && cp dockerfile target' sh 'cd ${WORKSPACE}/target && docker build -t ${HARBOR_PROJECT}:${BUILD_NUMBER} .' sh 'docker push ${HARBOR_PROJECT}:${BUILD_NUMBER}' sh 'docker rmi ${HARBOR_PROJECT}:${BUILD_NUMBER}' } stage('rancher deploy') { sh 'python rancher_deploy.py ${BUILD_NUMBER}' } }else{ stage('rancher rollback') { sh 'python rancher_deploy.py ${BUILD_ID}' } } }
登錄到jenkins服務器,安裝pip和request模塊
yum install -y python-pip
pip install requests
注意:上面的腳本,python 2.7也可以執行。
發布

效果如下:

登錄Rancher,查看鏡像是否更改

回滾
比如我需要回滾到2

效果如下:

登錄Rancher,查看鏡像是否更改

