04. CI/CD |
您所在的位置:网站首页 › jenkins加gitlab › 04. CI/CD |
Webhook
Jenkins 一般是企业选择比较多的 CI/CD 构建工具,虽然 GitLab CI/CD 本身的功能也很强。但是在于管理和隔离上更倾向于 Jenkins。 使用 GitLab 触发 Jenkins 构建一般采用的都是 Webhook 的方式。为此需要给 Jenkins 安装一个比较专业的用于配置 Webhook 的插件: Generic Webhook Trigger还需要安装一个解析 JSON 的插件,该插件会提供 readJSON 语法,方便解析 JSON: Pipeline Utility Steps如图所示: 安装完成之后会在 Job 的配置页面多出下面选项: 新建一个流水线任务: 配置 Webhook: 配置一个测试流水线: 保存之后命令行测试: curl http://192.168.2.100:38080/generic-webhook-trigger/invoke?token=gitlab-pipeline-demo-I0rKRhikePecy58e我这里对 Jenkins 配置了 NodePort Service,方便后面外网端口转发访问,所以访问地址是这个。 请求成功后会返回一个 JSON 数据: {"jobs":{"gitlab-pipeline-demo":{"regexpFilterExpression":"","triggered":true,"resolvedVariables":{},"regexpFilterText":"","id":149,"url":"queue/item/149/"}},"message":"Triggered jobs."}可以看到任务已经触发构建: 这里使用的是外网的 GitLab 服务,所有想要触发 Jenkins,那么 Jenkins 必须能够被外网访问到。 当然,如果本地有配置安装 GitLab,可以使用本地的 GitLab 进行配置即可。 新建一个 demo 项目: 配置 Webhook: 保存后可以手动触发一次: 测试提交代码触发: 查看触发: 获取 POST 传递过来的所有数据: 在 Pipeline 中使用它: 此时再次使用 GitLab 触发构建: 可以看到具体相关的 Git POST 的信息,可以使用: https://www.json.cn 将这个 JSON 格式化一下,其中比较有用一点的数据包含以下: { "ref":"refs/heads/main", "checkout_sha":"bae6ece9bbfba3a7c8d049846b17a7f54449215f", "user_name":"不知名换皮工程师", "user_username":"goer31", "user_email":"[email protected]", "user_avatar":"https://gitlab.com/uploads/-/system/user/avatar/14222477/avatar.png", "project":{ "name":"demo", "web_url":"https://gitlab.com/ezopscn/demo", "path_with_namespace":"ezopscn/demo", }, "commits":[ { "message":"Add new file", "title":"Add new file", "author":{ "name":"不知名换皮工程师", "email":"[email protected]" }, }, { "message":"Initial commit", "title":"Initial commit", "author":{ "name":"不知名换皮工程师", "email":"[email protected]" }, } ], "total_commits_count":2, }在 Pipeline 中获取想要的数据: // 获取 GitLab 传入的数据并解析 WebhookData = readJSON text: "${webhook_data}" //分支名称 env.branchName = WebhookData.ref - "refs/heads/" // 优化构建显示 // 构建描述 currentBuild.description = "提交次数:" + WebhookData.total_commits_count // 构建标题 currentBuild.displayName = env.branchName + " pushed by " + WebhookData.user_username pipeline { agent any stages { stage('Hello') { steps { echo '获取 POST 数据的方式:' echo "方式1:映射的方式" echo WebhookData["user_name"] echo WebhookData["project"]["name"] echo "方式2:. 的方式" echo WebhookData.user_name echo WebhookData.project.name } } } }触发构建后效果: 之前因为在配置 Webhook 的时候指定了只有当 main 分支有 push 行为的时候才会触发接口,但日常使用中可能会有不能指定分支的情况。这时候就会出现当用户创建分支的时候也会触发构建。显然这种情况应该忽略掉。 此时将 GitLab Webhook 调整为 All branchs 状态: 新建一个分支: 可以看到触发了一次构建: 此时就需要去剔除创建分支这种情况,通过 JSON 可以看到明显的特征: "before":"0000000000000000000000000000000000000000",befor 或者 after 字段是 40 个 0 只要过滤这种情况即可,但是先要拿到这些数据,建议直接在 post content 中变量获取: object_kind: before: after: 在插件的 GitHub 仓库中有提到相关的配置: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd/gitlab 如图所示: 配置方式: Jenkins 中配置过滤规则: 此时再次创建分支测试: 可以发现 Jenkins 并未触发构建。 当然,如果想忽略空提交,也可以使用类似的方法: Given filter is configured with text: $object_kind $after $total_commits_count Given filter is configured with expression: ^push\s.{40}\s[^0].* 重新构建 GitLab 触发的任务如果想在 Jenkins 重新触发上次构建,就会出现因为不是 GitLab 触发而没有 POST 数据的问题。这可能导致 Pipeline 出现问题。 为此,需要安装一个插件用于解决这个问题: Rebuilder安装完成后打开已经构建的任务: 集成配置阶段差不多就这样,具体应用需要根据实际情况编写对应的 Pipeline。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |