问题描述
在实施Jenkins bitbucket-build-status-notifier-plugin时遇到了问题。该插件的GitHub仓库在此处找到:https://github.com/jenkinsci/bitbucket-build-status-notifier-plugin。
用户的情况是这样的:他们使用了Jenkinsfile的共享流水线代码功能,以及多分支流水线。所有的Jenkinsfile代码都存在于一个仓库中,每个应用程序只对该仓库中的一个函数进行参数化调用。
问题出现在插件发送状态时 – 它将状态发送到了共享流水线代码的仓库,而不是正在构建的应用程序的仓库!插件在其他方面工作正常,可以进行身份验证并快速发送状态。
这个插件不能参数化以允许用户传递提交ID,这意味着提交ID是从环境变量中派生的,可能是以其他插件不使用的新颖方式。插件明确提到了对Jenkinsfile和多分支流水线的更改。用户怀疑在执行 scm checkout 命令之前,可能存在竞争条件,也许 bitbucket 插件是在任何 scm checkout 调用之前初始化的?
用户是否有关于调试这个问题的建议?jenkins.err文件不包含任何错误,因为没有抛出异常。是否有一个环境变量可以更改,以强制从共享流水线代码仓库切换到应用程序代码仓库的上下文?
解决方案
方案1 – 升级插件版本
根据回答1中提到的问题,这是一个已知的 bug。可以在 JENKINS-42878 和 JENKINS-41996 中找到相关内容。这个 bug 已经在上游得到解决,这意味着你可以通过将插件升级到最新版本来修复这个 bug。
方案2 – 使用 repoSlug 参数
根据回答2中的信息,插件的一个修复是添加了 repoSlug
参数,从而将状态发送到正确的仓库。在更新之前的情况下,构建状态的发送如下所示:
post {
success {
bitbucketStatusNotify(
buildState: 'SUCCESSFUL',
commitId: env.GIT_COMMIT
)
}
failure {
bitbucketStatusNotify(
buildState: 'FAILED',
commitId: env.GIT_COMMIT
)
}
}
现在,可以通过使用 repoSlug
参数来解决:
post {
success {
bitbucketStatusNotify(
buildState: 'SUCCESSFUL',
repoSlug: 'repoSlug,即 repositoryName,例如 some-app',
commitId: env.GIT_COMMIT
)
}
failure {
bitbucketStatusNotify(
buildState: 'FAILED',
repoSlug: 'repoSlug,即 repositoryName,例如 some-app',
commitId: env.GIT_COMMIT
)
}
}
需要注意的是,repoSlug
和 commitId
参数只有在同时指定时才起作用。
方案3 – 使用替代工具
回答3中提到,你还可以使用 bcbsn 作为替代工具。这个工具可以将构建状态与正确的提交关联,并将构建状态发送到正确的仓库。
这些方案应该能够帮助你解决问题,确保构建状态正确地发送到目标仓库。如果你仍然遇到问题,可以尝试组合这些方案或深入研究插件的文档,看是否有其他可行的解决方案。