我的组织已经使用 Jenkins 2.0 和 Pipelines 好几个月了。我们已经到了一个关键点,我们需要一个全局库来整合功能并减少 Jenkinsfile 和脚本的配置偏差。我在我们的 Bitbucket 团队中创建了一个 git repo 来保存常用功能,其中第一个是用于将构建状态发送到 Hipchat 和 Bitbucket 的通知类(例如 src/com/team/notifications/Bitbucket.groovy):
package com.team.jenkins.notifications
class Bitbucket implements Serializable {
def script
Bitbucket(script) {
this.script = script
}
def started() {
this.script.bitbucketStatusNotify (
buildState: 'INPROGRESS'
)
}
def succeeded() {
this.script.bitbucketStatusNotify (
buildState: 'SUCCESSFUL'
)
}
def failed(stage, err) {
this.script.bitbucketStatusNotify (
buildState: 'FAILED',
buildDescription: "Build failed during ${stage}: ${err}"
)
}
}
我们的开发工作流程依赖于 Jenkins 使用 Bitbucket 构建状态通知插件构建拉取请求的批准。上面的类“有效”,因为它将构建状态通知发送到 bitbucket,但问题是它总是将这些通知发送到共享库 repo,而不是正在构建的 repo(例如,我们的 Java 库或 webapps 之一)。
我已经将上述库作为一个类和一个全局 var 实现进行了测试,显式和隐式加载到管道脚本中。我也确认了bitbucket-status-notifier插件正常的non-shared-library使用受到共享库git repo的影响,所以插件根本不能用,看来,如果有带共享库的话进入管道作业。这是它作为显式库的用法:
@Library('common-jenkins') import com.team.jenkins.notifications.Bitbucket
def bitbucketer
node() {
stage('init) {
git url: 'https://user@bitbucket.org/team/repo.git'
bitbucketer = new Bitbucket(this)
sh './gradlew clean'
bitbucketer.started()
}
stage('build') {
try {
sh './gradlew build'
} catch (Exception e) {
bitbucketer.failed('build', e)
}
bitbucketer.succeeded()
}
}
正如https://issues.jenkins-ci.org/browse/JENKINS-40150上已经报道的那样,共享库的 git repo 信息正在渗入管道作业的执行中。我们还有其他引用 Git 信息的管道操作,因此在这种干扰下,我无法将共享库的实际使用扩展到我们的其他项目。