首页 > 解决方案 > 为什么生成 DSL 时 Jenkins.get().getRootUrl() 不可用?

问题描述

我正在调试atlassian-bitbucket-server-integration-plugin的问题。生成需要 Bitbucket webhook 的多分支管道作业时会发生该行为。从 Jenkins UI 创建管道作业时,该插件工作正常。但是,当使用 DSL 创建等效作业时,插件会在尝试创建 webhook 时出错。

我已经追踪到这一行RetryingWebhookHandler

String jenkinsUrl = jenkinsProvider.get().getRootUrl();
if (isBlank(jenkinsUrl)) {
   throw new IllegalArgumentException("Invalid Jenkins base url. Actual - " + jenkinsUrl);
}

jenkinsUrl用作 webhook 的目标。从 UI 创建管道作业时,jenkinsUrl将按预期设置。当我的 DSL 在自由格式作业中创建管道作业时,jenkinsUrl始终是null. 结果,无法创建 webhook,作业失败。

我尝试了各种替代方法来获取 Jenkins 根 URL,例如静态引用Jenkins.get().getRootUrl()JenkinsLocationConfiguration.get().getUrl(). 但是,所有值都为空。此时似乎 Jenkins 上下文不可用。

我想提交一个 PR 来修复插件中的这种行为,但我想不出任何可行的方法。我正在寻找有关根本原因和潜在解决方法的建议。例如:

如果需要,我可以分享我用来生成作业的 DSL,但我认为这无关紧要。通过注释掉失败的 webhook 代码,我确认 DSL 生成了一个正确的作业config.xml。因此,唯一的问题是如何为插件获取正确的配置,以便它可以设置 webhook。

标签: jenkins-pipelinebitbucketjenkins-pluginsjenkins-job-dsl

解决方案


事实证明,这种行为是由 Jenkins 的部分错误配置引起的。

在调试 Bitbucket 中损坏的构建链接的问题时(指向我unconfigured-jenkins-location而不是真正的 Jenkins URL),我在 Jenkins 的首页上发现了一条我之前错过的黄色警告消息,告诉我没有设置根服务器 URL:

Jenkins root URL is empty but is required for the proper operation of many Jenkins features like email notifications, PR status update, and environment variables such as BUILD_URL.
Please provide an accurate value in Jenkins configuration.

此错误消息包含指向Manage Jenkins > Configure System > Jenkins Location的链接。实际上在那里设置了正确的 Jenkins URL (我已经仔细检查过),但是没有设置同一部分中的系统管理员电子邮件地址。当我添加一个有效的电子邮件地址时,黄色警告消失了。

此更改修复了 BitBucket 中损坏的构建 URL,以及我的 DSL 的问题。因此,即使它没有多大意义,似乎缺少系统管理员电子邮件地址是这种行为的根本原因。


推荐阅读