jenkins 調用Rancher2.x api實現CI/CD


一、概述

在前面的文章中,鏈接如下:

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,查看鏡像是否更改

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM