唐人社视频呦一区二区_国际av_日本一区二区三区高清千人斩_亚洲国产成人久久综合下载_2021亚洲国产成A在线

快訊:jenkins harbor webhook自動觸發(fā)構建

2023-02-28 12:16:46     來源:騰訊云

背景:

cicd還是基于jenkins(spinnaker雖然也玩了,公司規(guī)模也小,簡單jenkins可以走天下)其實很多場景還是手動構建的,基本沒有做自動構建的jenkins流程。今天就突然有了那么一個需求。合作方大爺要頻繁修改一個鏡像。恩他們構建了鏡像上傳到倉庫(倉庫咱們的,對方木有),他們也不想第二次操作jenkins什么的...當然了他們也不會把代碼倉庫給到咱,然后我就想到了jenkins的構建觸發(fā)器-Generic Webhook Trigger去觸發(fā)構建。

jenkins-harbor webhook自動觸發(fā)構建

關于jenkins的觸發(fā)器插件:

搜索插件名稱:Generic Webhook Trigger


(相關資料圖)

image.png

重啟jenkins后,進入一個Pipeline項目設置,已經可以選擇這個觸發(fā)器了....

image.png

這里就忽略了,我這里早安裝了插件好多年了......

harbor or ccr倉庫webhook

其實我的鏡像倉庫使用了騰訊云的tcr鏡像倉庫,倉庫可以配置觸發(fā)器

image.png

看了一眼文檔觸發(fā)器操作指南:

image.png

順便看了一眼harbor的示例:https://www.1nth.com/post/jenkins_webhook/

image.png

參數結構目測都一樣的直接拿來用了!

jenkins Generic Webhook Trigger pipeline

jenkins創(chuàng)建pipeline

新建一個任務,自定義任務名稱,選擇流水線pipeline方式:

直接寫pipeline了:

image.png
pipeline {    agent any    triggers {      GenericTrigger(              genericVariables: [                [key: "harbor_type", value: "$.type", expressionType: "JSONPath"],                [key: "harbor_image", value: "$.event_data.resources[0].resource_url", expressionType: "JSONPath"],                [key: "image_tag", value: "$.event_data.resources[0].tag", expressionType: "JSONPath"],                [key: "harbor_namespace", value: "$.event_data.repository.namespace", expressionType: "JSONPath"],                [key: "repo_name", value: "$.event_data.repository.name", expressionType: "JSONPath"],              ],              token: "xxxxxxx" ,              causeString: " Triggered on $branch" ,              printContributedVariables: true,              printPostContent: true,              //regexpFilterText: "$ref",              //regexpFilterExpression: "refs/heads/" + BRANCH_NAME              regexpFilterText: "$harbor_type#$harbor_namespace#$repo_name",              regexpFilterExpression: "pushImage#xxxx#xxxx"          )    }    stages {        stage("Hello") {            steps {                sh """                echo harbor_type=$harbor_type                echo harbor_image=$harbor_image                echo harbor_image=$image_tag                echo repo_name=$repo_name                echo harbor_namespace=$harbor_namespace                echo "do something..."                #kubectl set image deployment.apps/$repo_name $repo_name=$harbor_image                """            }        }    }}

鏡像倉庫創(chuàng)建觸發(fā)器:

設置名稱,觸發(fā)動作選擇了推送鏡像,命名空間,倉庫名稱設置好,版本tag空。url 的格式為:

image.png
https://jenkins.xxx.com/generic-webhook-trigger/invoke?token=xxxxxx

token為上面pipeline腳本中設置的token內容

image.png

相對于https://www.1nth.com/post/jenkins_webhook/。我增加了一個image_tag 的字段。因為我每次都是修改tag版本標簽的。習慣這樣了.后面會用到這個image_tag(變量的名稱其實都可以自定義,不一定用示例中的,我是偷懶,懶得改了)

構建鏡像push 測試

隨手push一下鏡像到鏡像倉庫:

docker push  xxxx.xxxx.com/xxxx/xxxx:v2
image.png

看了一眼騰訊云鏡像倉庫的觸發(fā)器:

image.png

jenkins自動觸發(fā)構建成功:

image.png

下一步完善到kubernetes發(fā)布:

步驟就是sed修改tpl到y(tǒng)aml 文件然后apply yaml文件發(fā)布!

繼續(xù)完善一下pipeline:

pipeline {    agent any    triggers {      GenericTrigger(              genericVariables: [                [key: "harbor_type", value: "$.type", expressionType: "JSONPath"],                [key: "harbor_image", value: "$.event_data.resources[0].resource_url", expressionType: "JSONPath"],                [key: "image_tag", value: "$.event_data.resources[0].tag", expressionType: "JSONPath"],                [key: "harbor_namespace", value: "$.event_data.repository.namespace", expressionType: "JSONPath"],                [key: "repo_name", value: "$.event_data.repository.name", expressionType: "JSONPath"],              ],              token: "xxxxx" ,              causeString: " Triggered on $branch" ,              printContributedVariables: true,              printPostContent: true,              //regexpFilterText: "$ref",              //regexpFilterExpression: "refs/heads/" + BRANCH_NAME              regexpFilterText: "$harbor_type#$harbor_namespace#$repo_name",              regexpFilterExpression: "pushImage#xxxx#xxxx"          )    }    stages {        stage("Hello") {            agent { label  "xxxx" }            steps {               sh "sed -e "s/{image_tag}/$image_tag/g" /home/xxxx/jenkins/yaml/xxxx/xxxx.tpl > /home/xxxx/jenkins/yaml/xxxx/xxxx.yaml"               sh "sudo kubectl apply -f /home/xxxx/jenkins/yaml/xxxx/xxxx.yaml --namespace=xxxx"                                // sh """                // echo harbor_type=$harbor_type                // echo harbor_image=$harbor_image                // echo harbor_image=$image_tag                // echo repo_name=$repo_name                // echo harbor_namespace=$harbor_namespace                // echo "do something..."                // #kubectl set image deployment.apps/$repo_name $repo_name=$harbor_image                // """            }        }    }}

注意:regexpFilterExpression: "pushImage#xxxx#xxxx" 的格式??梢宰约宏P注一下Optional filter正則匹配(其實也可以偷懶不加,看個人吧)

image.png

演示先屏蔽了apply過程。只sed修改tpl文件為yaml文件:

xxx.tpl模板

apiVersion: apps/v1kind: Deploymentmetadata:  name: xxxxspec:  replicas: 1  strategy:    rollingUpdate:      maxSurge: 0      maxUnavailable: 1  selector:    matchLabels:      app: xxxx  template:    metadata:      labels:        app: xxxx    spec:      containers:        - name: xxxx          image: xxxx.xxxx.com/xxxx/xxxx:{image_tag}          envFrom:          - configMapRef:              name: xxxx          ports:            - containerPort: 3000              protocol: TCP          resources:            requests:              memory: "256M"              cpu: "250m"            limits:              memory: "2048M"              cpu: "2000m"       imagePullSecrets:                                                      - name: xxxx
image.png

看一下生成的yaml文件:

image.png

例子其實就是一個wiki項目。這樣基本就完了。當然了我這里用的簡單指定了執(zhí)行的agent

agent { label  "xxxx" }

stage的名字也可以換一下,這里偷懶了hello都沒有修改

stage("Hello") {}

好久不用了觸發(fā)器,這里就記錄一下......

然后吐槽一下騰訊云tcr鏡像服務的觸發(fā)器:

任務狀態(tài)的排序

這里說的是錯誤or成功的排序,首先在觸發(fā)器任務重錯誤的優(yōu)先級沒有那么高,所以將錯誤排在前面完全沒有必要:

image.png

正常的排序也完全沒有規(guī)律

這任務的id排序完全沒有規(guī)律....感覺沒有處理好......

image.png

后來我又觸發(fā)了幾次任務順序更是可怕,這也沒有失敗的優(yōu)先了 ?怎么排序的?且排序的失敗的時間格式也與正常的不一致?

image.png

已經反饋給相關人員期待能完善一下,就正常的任務排序就好了最多做一個成功失敗的勾選,這排序體驗太差了.....

標簽: Jenkins

包裝