亚洲成AV无码亚洲成aⅴ无码_国产精品无码一本本三本网站_亚洲欧美日韩专区一_真人版无码作爱视频拥有数百万视频创作者_点击进入精彩内容岛国

快訊:jenkins harbor webhook自動(dòng)觸發(fā)構(gòu)建

2023-02-28 12:16:46     來(lái)源:騰訊云

背景:

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

jenkins-harbor webhook自動(dòng)觸發(fā)構(gòu)建

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

搜索插件名稱(chēng):Generic Webhook Trigger


(相關(guān)資料圖)

image.png

重啟jenkins后,進(jìn)入一個(gè)Pipeline項(xiàng)目設(shè)置,已經(jīng)可以選擇這個(gè)觸發(fā)器了....

image.png

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

harbor or ccr倉(cāng)庫(kù)webhook

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

image.png

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

image.png

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

image.png

參數(shù)結(jié)構(gòu)目測(cè)都一樣的直接拿來(lái)用了!

jenkins Generic Webhook Trigger pipeline

jenkins創(chuàng)建pipeline

新建一個(gè)任務(wù),自定義任務(wù)名稱(chēng),選擇流水線(xiàn)pipeline方式:

直接寫(xiě)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                """            }        }    }}

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

設(shè)置名稱(chēng),觸發(fā)動(dòng)作選擇了推送鏡像,命名空間,倉(cāng)庫(kù)名稱(chēng)設(shè)置好,版本tag空。url 的格式為:

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

token為上面pipeline腳本中設(shè)置的token內(nèi)容

image.png

相對(duì)于https://www.1nth.com/post/jenkins_webhook/。我增加了一個(gè)image_tag 的字段。因?yàn)槲颐看味际切薷膖ag版本標(biāo)簽的。習(xí)慣這樣了.后面會(huì)用到這個(gè)image_tag(變量的名稱(chēng)其實(shí)都可以自定義,不一定用示例中的,我是偷懶,懶得改了)

構(gòu)建鏡像push 測(cè)試

隨手push一下鏡像到鏡像倉(cāng)庫(kù):

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

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

image.png

jenkins自動(dòng)觸發(fā)構(gòu)建成功:

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(guān)注一下Optional filter正則匹配(其實(shí)也可以偷懶不加,看個(gè)人吧)

image.png

演示先屏蔽了apply過(guò)程。只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

例子其實(shí)就是一個(gè)wiki項(xiàng)目。這樣基本就完了。當(dāng)然了我這里用的簡(jiǎn)單指定了執(zhí)行的agent

agent { label  "xxxx" }

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

stage("Hello") {}

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

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

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

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

image.png

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

這任務(wù)的id排序完全沒(méi)有規(guī)律....感覺(jué)沒(méi)有處理好......

image.png

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

image.png

已經(jīng)反饋給相關(guān)人員期待能完善一下,就正常的任務(wù)排序就好了最多做一個(gè)成功失敗的勾選,這排序體驗(yàn)太差了.....

標(biāo)簽: Jenkins

包裝