我们使用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页面的链接。插件中的上述方法似乎是通过删除项目之后的所有内容并添加repo的“全名”来构造该URL的结帐URL,从而导致上述错误的URL。
Atlassian的官方信息是Bitbucket无法阻止将“scm”部分添加到结帐网址。
这是Jenkins插件中的错误吗?如果是这样,该插件如何为任何人工作?
答案 0 :(得分:0)
我找到了失败的原因。
问题是,Jenkins的Bitbucket插件确实占路径中/scm
部分,但前提是它是第一部分主持人名称之后。
如果您的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