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”。希望本文能节省你的时间,对你有用:)