我们使用Bitbucket服务器,并希望每当有东西被推送到Bitbucket时触发Jenkins构建 .
我尝试根据此页面设置所有内容:https://wiki.jenkins.io/display/JENKINS/BitBucket+Plugin
所以我在Bitbucket中创建了一个Post Webhook,指向Jenkins Bitbucket插件的 endpoints .
当推送发生时,Bitbucket成功通知插件 . 根据Jenkins日志,插件然后遍历所有“检查更改被推送到BitBucket时构建”的作业,并尝试将该作业的repo URL与发生的推送的URL匹配 .
因此,如果repo URL为 https://jira.mycompany.com/stash/scm/PROJ/project.git
,则插件会尝试将其与 https://jira.mycompany.com/stash/PROJ/project
匹配,这显然会失败 .
根据Atlassian的官方信息,不能阻止Bitbucket在路径中插入“/ scm /”部分 .
Bitbucket Jenkins插件中的相应代码在类_1545995中:
private void processWebhookPayloadBitBucketServer(JSONObject payload) {
JSONObject repo = payload.getJSONObject("repository");
String user = payload.getJSONObject("actor").getString("username");
String url = "";
if (repo.getJSONObject("links").getJSONArray("self").size() != 0) {
try {
URL pushHref = new URL(repo.getJSONObject("links").getJSONArray("self").getJSONObject(0).getString("href"));
url = pushHref.toString().replaceFirst(new String("projects.*"), new String(repo.getString("fullName").toLowerCase()));
String scm = repo.has("scmId") ? repo.getString("scmId") : "git";
probe.triggerMatchingJobs(user, url, scm, payload.toString());
} catch (MalformedURLException e) {
LOGGER.log(Level.WARNING, String.format("URL %s is malformed", url), e);
}
}
}
在Bitbucket发送到插件的JSON有效负载中,实际的结账URL不会出现,只有链接到存储库的Bitbucket页面 . 插件中的上述方法似乎通过删除项目/之后的所有内容并添加repo的“全名”来构造该URL的结帐URL,从而导致上述错误的URL .
Atlassian的官方信息是Bitbucket无法阻止将“scm”部分添加到结帐URL .
这是Jenkins插件中的错误吗?如果是这样,该插件如何适用于任何人?
1 回答
我找到了失败的原因 .
问题是,Jenkins的Bitbucket插件 does 占据路径
/scm
部分,主机名后面是 but only if it's the first part .如果您的Bitbucket服务器实例不是在其自己的域下配置,而是在另一个服务的路径下,则匹配结帐URL将失败 .
例:
https://bitbucket.foobar.com/scm/PROJ/myproject.git
会工作,https://jira.foobar.com/stash/scm/PROJ/myproject.git
无效 .也有此问题的人已经为插件创建了一个修复程序,其挂起请求正在等待处理:JENKINS-49177: Now removing first occurrence of /scm