jenkins harbor webhook自动触发构建

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jenkins harbor webhook自动触发构建相关的知识,希望对你有一定的参考价值。

背景:

cicd还是基于jenkins(spinnaker虽然也玩了,公司规模也小,简单jenkins可以走天下)其实很多场景还是手动构建的,基本没有做自动构建的jenkins流程。今天就突然有了那么一个需求。合作方大爷要频繁修改一个镜像。恩他们构建了镜像上传到仓库(仓库咱们的,对方木有),他们也不想第二次操作jenkins什么的...当然了他们也不会把代码仓库给到咱,然后我就想到了jenkins的构建触发器-Generic Webhook Trigger去触发构建。

jenkins-harbor webhook自动触发构建

关于jenkins的触发器插件:

搜索插件名称:Generic Webhook Trigger 重启jenkins后,进入一个Pipeline项目设置,已经可以选择这个触发器了.... 这里就忽略了,我这里早安装了插件好多年了......

harbor or ccr仓库webhook

其实我的镜像仓库使用了腾讯云的tcr镜像仓库,仓库可以配置触发器 看了一眼文档触发器操作指南 顺便看了一眼harbor的示例:https://www.1nth.com/post/jenkins_webhook/ 参数结构目测都一样的直接拿来用了!

jenkins Generic Webhook Trigger pipeline

jenkins创建pipeline

新建一个任务,自定义任务名称,选择流水线pipeline方式: 直接写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: 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
                
            
        
    

镜像仓库创建触发器:

设置名称,触发动作选择了推送镜像,命名空间,仓库名称设置好**,版本tag**空。url 的格式为:

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

token为上面pipeline脚本中设置的token内容 相对于https://www.1nth.com/post/jenkins_webhook/。我增加了一个image_tag 的字段。因为我每次都是修改tag版本标签的。习惯这样了.后面会用到这个image_tag(变量的名称其实都可以自定义,不一定用示例中的,我是偷懒,懒得改了)

构建镜像push 测试

随手push一下镜像到镜像仓库:

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

看了一眼腾讯云镜像仓库的触发器: jenkins自动触发构建成功:

下一步完善到kubernetes发布:

步骤就是sed修改tpl到yaml 文件然后apply yaml文件发布! 继续完善一下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 的格式。可以自己关注一下Optional filter正则匹配(其实也可以偷懒不加,看个人吧) 演示先屏蔽了apply过程。只sed修改tpl文件为yaml文件: xxx.tpl模板

apiVersion: apps/v1
kind: Deployment
metadata:
  name: xxxx
spec:
  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

看一下生成的yaml文件: 例子其实就是一个wiki项目。这样基本就完了。当然了我这里用的简单指定了执行的agent

 agent  label  "xxxx" 

stage的名字也可以换一下,这里偷懒了hello都没有修改

        stage(Hello) 

好久不用了触发器,这里就记录一下......

然后吐槽一下腾讯云tcr镜像服务的触发器:

任务状态的排序

这里说的是错误or成功的排序,首先在触发器任务重错误的优先级没有那么高,所以将错误排在前面完全没有必要:

正常的排序也完全没有规律

这任务的id排序完全没有规律....感觉没有处理好...... 后来我又触发了几次任务顺序更是可怕,这也没有失败的优先了 ?怎么排序的?且排序的失败的时间格式也与正常的不一致? 已经反馈给相关人员期待能完善一下,就正常的任务排序就好了最多做一个成功失败的勾选,这排序体验太差了.....

以上是关于jenkins harbor webhook自动触发构建的主要内容,如果未能解决你的问题,请参考以下文章

jenkins harbor webhook自动触发构建

Jenkins+Gitlab配置Webhook实现提交自动部署

用Jira webhook和Jenkins创建自动审批工作流

Jenkins获取Jira webhook的参数

webhook定时提醒 意义

码云Webhook触发Jenkins自动构建 - Jenkins演练