1

我的组织已经使用 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 信息的管道操作,因此在这种干扰下,我无法将共享库的实际使用扩展到我们的其他项目。

我也创建了https://issues.jenkins-ci.org/browse/JENKINS-41602

4

0 回答 0