繁体   English   中英

从 Jenkins 中的 gitlab webhook 读取 json 负载

[英]Read json payload from gitlab webhook in Jenkins

我按照本教程设置了一个 Jenkins 作业,以便在推送到 gitlab 存储库时运行。 我测试了 webhook,我可以看到作业被触发。 但是,我在有效负载中没有看到任何内容。

只是想知道,是否有人曾尝试读取从 gitlab webhook 收到的有效负载?

每当 Gitlab 存储库中发生任何事件时, Jenkins Gitlab 插件都会将这些 POST 参数发送给 Jenkins。

您可以在 Jenkins 控制台中添加env以获取所有 Gitlab 参数导出到 Jenkins 环境的内容。 然后您可以打印或使用所需的变量。

例如

echo $gitlabSourceRepoURL
echo $gitlabAfter
echo $gitlabTargetBranch
echo $gitlabSourceRepoHttpUrl
echo $gitlabMergeRequestLastCommit
echo $gitlabSourceRepoSshUrl
echo $gitlabSourceRepoHomepage
echo $gitlabBranch
echo $gitlabSourceBranch
echo $gitlabUserEmail
echo $gitlabBefore
echo $gitlabSourceRepoName
echo $gitlabSourceNamespace
echo $gitlabUserName

您提到的教程讨论了 GitHub webhooks。 GitLab 和 GitHub 是两个独立的产品。 因此,GitHub webhooks 的文档或链接不适用于 GitLab webhooks。

GitLab 使用请求正文中的 JSON 有效负载调用 Webhook URL,该有效负载包含有关导致 Webhook 调用的 GitLab 事件的大量信息。 例如, GitLab webhook 推送事件负载中携带以下信息:

{
  "object_kind": "push",
  "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
  "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
  "ref": "refs/heads/master",
  "checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
  "user_id": 4,
  "user_name": "John Smith",
  "user_username": "jsmith",
  "user_email": "john@example.com",
  "user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
  "project_id": 15,
  "project":{
    "id": 15,
    "name":"Diaspora",
    "description":"",
    "web_url":"http://example.com/mike/diaspora",
    "avatar_url":null,
    "git_ssh_url":"git@example.com:mike/diaspora.git",
    "git_http_url":"http://example.com/mike/diaspora.git",
    "namespace":"Mike",
    "visibility_level":0,
    "path_with_namespace":"mike/diaspora",
    "default_branch":"master",
    "homepage":"http://example.com/mike/diaspora",
    "url":"git@example.com:mike/diaspora.git",
    "ssh_url":"git@example.com:mike/diaspora.git",
    "http_url":"http://example.com/mike/diaspora.git"
  },
  "repository":{
    "name": "Diaspora",
    "url": "git@example.com:mike/diaspora.git",
    "description": "",
    "homepage": "http://example.com/mike/diaspora",
    "git_http_url":"http://example.com/mike/diaspora.git",
    "git_ssh_url":"git@example.com:mike/diaspora.git",
    "visibility_level":0
  },
  "commits": [
    {
      "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
      "message": "Update Catalan translation to e38cb41.",
      "timestamp": "2011-12-12T14:27:31+02:00",
      "url": "http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
      "author": {
        "name": "Jordi Mallach",
        "email": "jordi@softcatala.org"
      },
      "added": ["CHANGELOG"],
      "modified": ["app/controller/application.rb"],
      "removed": []
    },
    {
      "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
      "message": "fixed readme",
      "timestamp": "2012-01-03T23:36:29+02:00",
      "url": "http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
      "author": {
        "name": "GitLab dev user",
        "email": "gitlabdev@dv6700.(none)"
      },
      "added": ["CHANGELOG"],
      "modified": ["app/controller/application.rb"],
      "removed": []
    }
  ],
  "total_commits_count": 4
}

Jenkins GitLab 插件使这个 webhook 有效负载信息在Jenkins 全局变量env 中可用。 可用的ENV变量如下:

gitlabBranch
gitlabSourceBranch
gitlabActionType
gitlabUserName
gitlabUserEmail
gitlabSourceRepoHomepage
gitlabSourceRepoName
gitlabSourceNamespace
gitlabSourceRepoURL
gitlabSourceRepoSshUrl
gitlabSourceRepoHttpUrl
gitlabMergeRequestTitle
gitlabMergeRequestDescription
gitlabMergeRequestId
gitlabMergeRequestIid
gitlabMergeRequestState
gitlabMergedByUser
gitlabMergeRequestAssignee
gitlabMergeRequestLastCommit
gitlabMergeRequestTargetProjectId
gitlabTargetBranch
gitlabTargetRepoName
gitlabTargetNamespace
gitlabTargetRepoSshUrl
gitlabTargetRepoHttpUrl
gitlabBefore
gitlabAfter
gitlabTriggerPhrase

就像您从作业管道脚本中的Jenkins 全局变量参数读取 Jenkins 作业参数一样,您可以从Jenkins 全局变量env读取 webhook 有效负载字段:

echo "My Jenkins job parameter is ${params.MY_PARAM_NAME}"
echo "One of Jenkins job webhook payload field is ${env.gitlabTargetBranch}"

希望以上信息能帮助您解决问题。

我做到了。 它适用于某些场景。

如果您使用 /gitlab/buildnow,则可以访问有效负载对象。 他们都。 但是您必须将它们命名为“此构建已参数化”。 然后您可以按名称访问它们,例如 ${AUTHOR_NAME}。

文档: https : //github.com/elvanja/jenkins-gitlab-hook-plugin#parameterized-projects

但请注意,如果您使用 /gitlab/notifycommit,它将不起作用,因为在触发 jenkins 和实际开始工作之间存在差距(轮询)。 这种情况下的所有有效载荷数据都是空的。

但是要小心使用/gitlab/buildnow,因为您无法控制是否要构建,例如Maven何时提交回一些文件,并且不应触发构建。

我所做的是用 Python 编写一个小工具来接收所有 gitlab 通知,这个工具会与 GitLab 和 Jenkins 对话,以触发(或不触发)作业,并收集回状态。

我的起点: 我如何在 Python 中接收 Github Webhooks (最后一个答案,而不是选择的答案)。

我两天前开始开发它。 它已经完成,但我仍在验证它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM