Harbor(Webhook)+Jenkins(Generic Webhook Trigger Plugin)的持续集成案例

背景: 看到Harbor有Webhook功能,想用起来,当产品组有新的容器镜像发布时,就自动触发部署到环境中。

Harbor部分

Webhook的POST请求JSON样例:

{
	"type": "pushImage",
	"occur_at": 1591172171,
	"event_data": {
		"resources": [{
			"digest": "sha256:8896bb6b310b53ff03c2172db6b2fa7841233d0de516021e9a4912bdef11aed3",
			"tag": "20200603",
			"resource_url": "test-docker.jchl.com/sbpt/icap-gateway-main:20200603"
		}],
		"repository": {
			"date_created": 1588750292,
			"name": "icap-gateway-main",
			"namespace": "sbpt",
			"repo_full_name": "sbpt/icap-gateway-main",
			"repo_type": "public"
		}
	},
	"operator": "sbpt"
}

 基础知识: JSONPath的语法,需要从json中获取所需要的值

JSONPath项目地址:https://github.com/json-path/JsonPath

JSONPath验证地址: https://jsonpath.curiousconcept.com/

Webhook endpoint: http://<user>:<password>@<JenkinsIP>:<JenkinsPort>/generic-webhook-trigger/invoke

 

Jenkins部分

安装插件:Generic Webhook Trigger Plugin

解释:使用JSONPath表达式$.type获取POST的JSON值内容,然后赋值给harbor_type,Jenkins可以通过$harbor_type使用该值。

同理,其他值的获取配置如下:

Variable:  harbor_image

Expression:  $.event_data.resources[0].resource_url

Variable:  harbor_namespace

Expression:  $.event_data.repository.namespace

Variable:  repo_name

Expression:  $.event_data.repository.name

Optional filter

Expression:  pushImage#sbpt#icap-gateway-main

Text:  $harbor_type#$harbor_namespace#$repo_name

解释:这里是Job触发的过滤器,根据上面的取值,拼接为Text,然后根据正则表达式检查匹配情况,匹配成功则触发Job否则忽略。

这里的例子是说同时满足 pushImage事件#sbpt项目#icap-gateway-main仓库名称 时就触发Job。

 

效果:

Jenkins构建环节配置执行Shell:

echo harbor_type=$harbor_type

echo harbor_image=$harbor_image

echo repo_name=$repo_name

echo harbor_namespace=$harbor_namespace

echo "do something..."

kubectl set image deployment.apps/$repo_name $repo_name=$harbor_image

 

 

PS: 我并不知道Harbor的Webhook样例,然而又翻不动Harbor的代码,还写了server配上去用来打印POST过来的内容,其实后来才发现Jenkins可以勾选“Print post content”。希望本文能节省你的时间,对你有用:)

 

posted @ 2020-06-03 18:14  sxusky  阅读(2071)  评论(1编辑  收藏  举报