2023-02-28 12:16:46 来源:腾讯云
背景:
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/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
看一下生成的yaml文件:
例子其实就是一个wiki项目。这样基本就完了。当然了我这里用的简单指定了执行的agent
agent { label "xxxx" }
stage的名字也可以换一下,这里偷懒了hello都没有修改
stage("Hello") {}
好久不用了触发器,这里就记录一下......
然后吐槽一下腾讯云tcr镜像服务的触发器:
任务状态的排序
这里说的是错误or成功的排序,首先在触发器任务重错误的优先级没有那么高,所以将错误排在前面完全没有必要:
正常的排序也完全没有规律
这任务的id排序完全没有规律....感觉没有处理好......
后来我又触发了几次任务顺序更是可怕,这也没有失败的优先了 ?怎么排序的?且排序的失败的时间格式也与正常的不一致?
已经反馈给相关人员期待能完善一下,就正常的任务排序就好了最多做一个成功失败的勾选,这排序体验太差了.....
标签: Jenkins
- 加快虚拟仿真实训基地建设 启动职业学校信息化建设试点很必要
- “双减”后如何在满足学生多样需求方面做“加法”?
- 处于生理活跃期且心理发展不成熟 高校开设公共卫生必修课很必要
- 价格低于相应蔬菜零售价 西安投放约1万吨政府储备蔬菜
- 深受年轻消费群体所青睐 国潮风商品成为年货新选择
知识
- 他把银行卡卖给骗子,“黑吃黑”“截胡”十万元
- “老司机”4S店试驾豪车 结果油门当刹车撞了
- 新开工改造城镇老旧小区5.34万个
- 发动巡河志愿者2万余名 “用心护好每一条河”
- 假客服的套路:伪装成大平台客服,层层布局引人上钩
人物
- 浙江两轮核酸检测结果均为阴性 无新增本土阳性感染者
- 新疆阿克苏地区库车市发生4.1级地震 震源深度18千米
- 抵返哈尔滨人员须持48小时内核酸检测阴性证明
- 浙大紫金港校区已解封 有7337人有序离开该校区
- 2021年广东省第七届风筝锦标赛落幕
- 黑龙江讷河市启动全员核酸检测 目前讷河市全员核酸检测结果均为阴性
- 【同心粤港澳 携手大湾区】南头古城,搭建深港澳三地文化创意活动交流平台
- 重庆入河排污口整治工作推进至全市26个区县
- 四川省第二批政法队伍教育整顿:立案审查调查省级政法机关干警58人
- 长三角区域生态环境部门“云签约”长江大保护倡议书
- 古老长城重焕新生机
- 藏不住了!你同事里有许多“武林高手”……
- 浙江杭州2例无症状感染者系感染德尔塔变异株
- 喜马拉雅的深情和誓言
- 浪漫之城打造山海城一体新地标
- 让老年人更适应数字生活
- 内蒙古通辽市新增1例本土确诊病例、1例无症状感染者
- 徐州无新增确诊病例 核酸检测55515人结果均为阴性
- 甘肃培树“农家巧娘”增技能:返乡创业掌勺又“掌柜”
- 内蒙古通辽市科尔沁区一地调整为中风险地区
- 上海本轮疫情涉及闭环管理的医疗机构全面恢复门急诊
- 青年学生成艾滋病感染高发人群 “社会疫苗”如何打?
- 内蒙古满洲里新增本土确诊病例1例 当地开展第二轮大规模核酸检测
- 江西无新增本土确诊病例 上饶全面恢复正常生产生活秩序
- 中老铁路上会四国语言的列车长:用心维护中老友谊的桥梁
- 海南首次发现有环志的世界极危鸟种勺嘴鹬
- 一场“网络劝生者”和“网络劝死者”的战役
- 内蒙古通辽新增本土确诊和无症状感染者各1例 轨迹公布
- 江西中烟工业有限责任公司原总经理姚庆艳接受审查调查
- 宁夏45例新冠肺炎确诊病例均已治愈出院
- 内蒙古通辽市科尔沁区发现2名初筛阳性人员
- 生活在闹钟里的丈夫:自己迟一秒,渐冻症妻子就会多一分疼
- 辽宁新冠肺炎确诊病例零新增
- 11月28日16-24时,内蒙古新增本土确诊病例1例
- 奥密克戎毒株为何“需要关注”?现有防疫工具还有效吗?
- 黑龙江新增本土无症状感染者1例
- 这辈子一定要去趟这个公园 在这里“有种爱叫放手”
- 那年今日 | 一张漫画涨知识之11月29日
- 寒潮预警!我国中东部迎大范围降温 黑龙江等地降幅可达12℃
- 冷空气继续影响我国中东部 华北黄淮等地有雾和霾天气