用镜像仓库Webhook触发Jenkins构建,本质是仓库推送新镜像时主动通知Jenkins启动任务,适用于镜像已构建完成、仅需后续部署或验证的场景;需确认仓库支持(如Harbor v2.0+、TCR支持,ACR需桥接),在Jenkins安装Generic Webhook Trigger插件并配置Token、变量提取与正则过滤,在Harbor/TCR中设置目标URL及pushImage事件,最后在Pipeline中使用提取变量执行拉取、扫描、部署等操作。

用镜像仓库的 Webhook 触发 Jenkins 构建,本质是让镜像仓库(如 Harbor、TCR)在推送新镜像时,主动“通知” Jenkins 启动一次构建任务。这种方式适合“镜像已构建完成,只需后续部署或验证”的场景,比如:镜像由其他团队构建并推送到你的私有仓库,你希望 Jenkins 自动拉取、校验、部署或触发测试。
确认镜像仓库是否支持推送事件 Webhook
不是所有仓库都原生支持向 Jenkins 发送推送通知:
-
Harbor(v2.0+):完全支持,可在“项目 → Webhook”中配置目标 URL(Jenkins 地址),选择触发事件为
pushImage - 腾讯云 TCR:支持自定义 Webhook,可设置推送镜像时回调 Jenkins 的指定地址
- 阿里云 ACR:不直接支持镜像推送触发 Jenkins;它自身支持源码触发构建,但反向(ACR 推送 → Jenkins)需额外桥接
- Docker Hub:已弃用 Automated Builds,也不提供推送事件 Webhook 给外部系统
在 Jenkins 中安装并配置 Generic Webhook Trigger 插件
这是最通用、无需 Git 集成的方案,专为接收任意 JSON 格式 Webhook 设计:
- 进入 Jenkins → Manage Jenkins → Manage Plugins,搜索安装 Generic Webhook Trigger
- 重启 Jenkins 后,新建一个 Pipeline 任务,在 Configure → Build Triggers 中勾选 GenericTrigger
- 设置关键参数:
-
Token:设一个密钥(如
harbor-push-notify),后续填入 Harbor Webhook 配置中 -
Generic Variables:提取 Webhook 请求体中的字段,例如:
harbor_image→$.event_data.resources[0].resource_urlimage_tag→$.event_data.resources[0].tagrepo_name→$.event_data.repository.name -
Regexp Filter:加一层过滤,避免误触发,例如只响应
pushImage事件:regexpFilterText:$harbor_type#$repo_nameregexpFilterExpression:pushImage#myapp
-
Token:设一个密钥(如
在 Harbor/TCR 中配置 Webhook 并指向 Jenkins
以 Harbor 为例(TCR 类似,后台有“Webhook”或“事件通知”入口):
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
- 登录 Harbor 控制台 → 进入对应项目 → Webhooks → + 新建 Webhook
- 填写:
-
Name:如
jenkins-deploy-trigger -
Target URL:格式为
http://jenkins-host:8080/generic-webhook-trigger/invoke?token=harbor-push-notify(token 必须与 Jenkins 中一致) -
Event types:勾选
Push Image(可选是否包含Delete Image) -
Custom headers(可选):添加
Content-Type: application/json
-
Name:如
- 点击 Test 按钮验证是否收到触发(Jenkins 控制台会显示日志)
编写 Jenkins Pipeline 响应镜像推送
在 Pipeline 脚本中,直接使用上一步提取的变量做逻辑判断和操作:
- 拉取刚推送的镜像进行安全扫描或健康检查
- 部署到测试环境:
sh "docker run -d --name test-${image_tag} ${harbor_image}:${image_tag}" - 触发下游部署任务(如发布到生产):
build job: 'deploy-to-prod', parameters: [string(name: 'IMAGE_URL', value: "${harbor_image}"), string(name: 'TAG', value: "${image_tag}")] - 发送钉钉/企微通知:
sh "curl -X POST 'https://oapi.dingtalk.com/...' --data '{"msgtype":"text","text":{"content":"新镜像 ${repo_name}:${image_tag} 已就绪"}}'"
整个链路清晰可靠:镜像一推送 → Harbor 发 HTTP POST → Jenkins 解析 JSON → 执行预设流程。不需要代码仓库权限,也不依赖构建机器是否有 Docker 环境(只要 Jenkins 能访问目标镜像仓库即可)。










