如何在Jenkins中处理github webhook负载?

我目前正在通过GitHub webhook触发我的Jenkins构建。如何解析JSON负载?如果我尝试参数化构建并使用$payload变量,GitHub webhook将失败,并出现以下错误:

<html>
<头>
<meta http equiv=“Content Type”Content=“text/html;charset=ISO-8859-1”/>
<标题>错误400此页面需要提交表单&lt/标题>
&lt/头>
<车身&gt&书信电报;h2>HTTP错误400&lt/h2>
<p>访问/作业/跳转周期测试/生成时出现问题。原因:
<预处理>此页面需要提交表单&lt/预处理&gt&lt/p&gt&书信电报;hr/&gt&书信电报;i&gt&书信电报;小型>由码头供电://&lt/小型&gt&lt/i&gt&书信电报;br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
&lt/车身>
&lt/html>

如何让我的GitHub webhook使用参数化的Jenkins构建,然后如何解析webhook负载以使用特定行(例如提交者的用户名)作为构建中的条件

有一些技巧可以让它发挥作用,我发现(现在已经不存在的)chloky.com博客文章对大部分内容都很有帮助。因为听起来您至少已经让webhook与Jenkins实例进行了通信,所以现在我将跳过这些步骤。但是,如果您想了解更多详细信息,只需滚动到我的答案的末尾,查看我能够从chloky.com中修复的内容-我不知道原始作者,信息可能已经过时,但我确实觉得它很有帮助

总之,您可以执行以下操作来处理有效负载:

  1. 在Jenkins作业中设置名为“payload”的字符串参数。如果您计划手动运行构建,那么在某个时候给它一个默认的JSON文档可能是一个好主意,但您现在不需要。这个参数名似乎区分大小写(我使用的是Linux,所以这并不奇怪…)
  2. 在github中设置webhook以使用buildWithParameters端点,而不是build端点,即。
    http://&lt&书信电报;您的服务器&gt&燃气轮机/工作/&lt&书信电报;你的工作&gt&燃气轮机/buildWithParameters?令牌=&lt&书信电报;yourtoken&gt&燃气轮机

  3. 将webhook配置为使用应用程序/x-www-form-encoded而不是应用程序/json。前一种方法将JSON数据打包成一个名为“payload”的形式变量,这大概就是Jenkins将其分配给环境变量的方式。应用程序/json方法只是发布原始json,它似乎无法映射到任何东西(我无法让它工作)。通过将webhook指向requestbin之类的对象并检查结果,可以看到不同之处

  4. 此时,您应该在开始构建时获得$payload变量。要解析JSON,我强烈建议在Jenkins服务器上安装jq,并在这里尝试一些解析语法。JQ特别好,因为它是跨平台的
  5. 从这里开始,只需将您需要的JSON解析为其他环境变量。结合有条件的构建步骤,这可以给您很大的灵活性

希望这有帮助


编辑以下是我可以从http://chloky.com/tag/jenkins/,它已经死了一段时间了。
希望这些内容对某些人也有用


2012年7月1日之后

Github提供了一种很好的方法,可以在对存储库进行提交时向jenkins这样的CI系统发送通知。这对于在jenkins中启动构建作业以测试刚刚在回购协议上进行的提交非常有用。您只需转到存储库的管理部分,单击左侧的服务钩子,单击列表顶部的“webhook URL”,然后输入jenkins期望的webhook的URL(查看这个jenkins插件,它用于设置jenkins从github接收这些钩子)

不过,最近我在寻找一种方法,在针对回购协议发出拉取请求时,而不是在对回购协议作出承诺时,触发webhook。这样,我们就可以让jenkins在决定是否合并pull请求之前对pull请求运行一系列测试,这对于有很多开发人员在自己的fork上工作并定期向主repo提交pull请求非常有用

事实证明,这并不像人们希望的那么明显,需要对github API进行一些修改

默认情况下,配置github webhook时,它被配置为仅在针对repo进行提交时触发。设置webhook时,在github web界面中没有简单的方法可以查看或更改这一点。为了以任何方式操纵webhook,您需要使用API

要通过github API对回购协议进行更改,我们需要自行授权。我们将使用curl,因此如果我们想,每次都可以传递用户名和密码,如下所示:

#curlhttps://api.github.com/users/mancdaz --用户“mancdaz”
输入用户“mancdaz”的主机密码:

或者,如果您想编写这些东西的脚本,这是一个更好的选择,我们可以获取一个oauth令牌,并在后续请求中使用它,以避免继续输入密码。这就是我们在示例中要做的。首先,我们需要创建oauth授权并获取令牌:

curlhttps://api.github.com/authorizations --用户“mancdaz”\
--数据“{”作用域“:[“repo”]}'-X POST

您将返回如下内容:

{
“应用程序”:{
“名称”:“GitHub API”,
“url”:”http://developer.github.com/v3/oauth/#oauth-授权api“
},
“令牌”:“b2067d190ab94698a592878075d59bb13e4f5e96”,
“范围”:[
“回购”
],
“创建时间”:“2012-07-12T12:55:26Z”,
“更新时间”:“2012-07-12T12:55:26Z”,
“note_url”:空,
“注意”:空,
“id”:498182,
“url”:”https://api.github.com/authorizations/498182"
}

现在,我们可以在后续请求中使用此令牌,通过API操纵我们的github帐户。因此,让我们查询我们的回购协议,并找到我们之前在web界面中设置的webhook:

#curlhttps://api.github.com/repos/mancdaz/mygithubrepo/hooks?access_token=b2067d190ab94698592878075d59bb13e4f5e96
[
{
“创建时间”:“2012-07-12T11:18:16Z”,
“更新时间”:“2012-07-12T11:18:16Z”,
“事件”:[
“推”
],
“最后的答复”:{
“状态”:“未使用”,
“消息”:空,
“代码”:空
},
“名称”:“网络”,
“配置”:{
“不安全的ssl”:“1”,
“内容类型”:“形式”,
“url”:”http://jenkins-server.chloky.com/post-hook"
},
“id”:341673,
“主动”:正确,
“url”:”https://api.github.com/repos/mancdaz/mygithubrepo/hooks/341673"
}
]

请注意json输出中的重要部分:

“事件”:[
“推”
]

这基本上是说这个webhook只会在提交(推送)repo时触发。github API文档描述了许多可以添加到此列表中的不同事件类型——出于我们的目的,我们希望添加pull_请求,我们就是这样做的(请注意,我们从上面的json输出中获取webhook的id。如果您定义了多个钩子,那么您的输出将包含所有这些钩子,因此请确保获取正确的id):

#curlhttps://api.github.com/repos/mancdaz/mygithubrepo/hooks/341673?access_token=b2067d190ab94698592878075d59bb13e4f5e96 -X补丁--数据“{”事件“:[“推”、“拉请求”]}
{
“创建时间”:“2012-07-12T11:18:16Z”,
“更新时间”:“2012-07-12T16:03:21Z”,
“最后的答复”:{
“状态”:“未使用”,
“消息”:空,
“代码”:空
},
“事件”:[
“推”,
“pull_请求”
],
“名称”:“网络”,
“配置”:{
“不安全的ssl”:“1”,
“内容类型”:“形式”,
“url”:”http://jenkins-server.chloky.com/post-hook"
},
“id”:341673,
“主动”:正确,
“url”:”https://api.github.com/repos/mancdaz/mygithubrepo/hooks/341673"
}

“事件”:[
“推”,
“pull_请求”
],

现在,每当针对我们的repo发出提交或拉取请求时,就会触发此webhook。您在jenkins/中使用此webhook的具体操作取决于您。我们使用它在jenkins中启动一系列集成测试,以测试建议的补丁,然后实际合并并关闭(再次使用API)自动拉取请求。非常甜蜜

2012年9月2日之后

在前面的一篇文章中,我谈到了配置github webhook以在请求时触发,而不仅仅是提交。如前所述,github repo上会发生许多事件,根据github文档,其中很多事件都可以用来触发webhook

不管发生什么事

发表评论