【发布时间】:2018-02-05 17:05:33
【问题描述】:
我们使用 Bitbucket 服务器并希望在将某些内容推送到 Bitbucket 时触发 Jenkins 构建。
我尝试根据此页面设置所有内容: https://wiki.jenkins.io/display/JENKINS/BitBucket+Plugin
所以我在 Bitbucket 中创建了一个 Post Webhook,指向 Jenkins Bitbucket 插件的端点。
当推送发生时,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插件中对应的代码在com.cloudbees.jenkins.plugins.BitbucketPayloadProcessor类中:
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 页面的链接。插件中的上述方法似乎是通过删除包括项目/之后的所有内容并添加存储库的“全名”来从该 URL 构造结帐 URL,从而导致上述错误 URL。
来自 Atlassian 的官方信息是 Bitbucket 无法阻止将“scm”部分添加到结帐 URL。
这是 Jenkins 插件中的错误吗?如果是这样,该插件如何为任何人工作?
【问题讨论】:
-
它是否适用于 SSH?我已经使用 Bit Bucket 和 Jenkins 设置了网络挂钩,它们运行良好。