3

我对 Jenkins 管道相对较新,但是已经实现了一些,我意识到在我发疯之前我需要开始使用 jenkins 共享库。

已经想出了如何在库中定义一些重复的步骤,并从 Jenkinsfile 中以更少的混乱来调用它们,但不确定是否可以为整个后期构建部分做同样的事情(以为我已经阅读了如何定义lib和类似的整个管道),因为这几乎是每个管道代码的静态结束:

@Library('jenkins-shared-library')_
pipeline {
    agent none
    stages {
        stage ('System Info') { agent any
            steps { printSysInfo() }
        }

        stage ('Init'){ agent {label 'WinZipSE'}
            steps { init('SCMroot') }
        }
        stage('Build') { agent any 
            steps { doMagic() }
        }
    }

    // This entire 'post {}' section needs to go to a shared lib
    // and be called just with a simple methed call, e.g.
    // doPostBuild()
    post {
        always {
            node ('master') {
                googlechatnotification (
                message: '[$BUILD_STATUS] Build $JOB_NAME $BUILD_NUMBER has finished',
                url: 'id:credential_id_for_Ubuntu')

                step (
                    [$class: 'Mailer',
                    recipients: 'sysadmins@example.com me@example.com',
                    notifyEveryUnstableBuild: true,
                    sendToIndividuals: true]
                )
            }
        }
        success {
            node ('master') {
                echo 'This will run only if successful'
            }
        }
        failure {
            node ('master') {
                echo 'This will run only if failed'
            }
        }
        // and so on
    }
}

我只是不知道如何在语法上实现这一点。当然,我可以将整个后期构建部分定义为一个 lib/var,例如:doPotBuild.groovy

def call () {
  post {...}
}

post {}但是我最终将如何从定义的构建块部分(AKA 阶段)之外的 Jenkinsfile 中调用它。

我可以在 some 中调用它stage('post build){doPostBuild()},但它不会满足真实post {}部分的工作方式,例如,如果前一个阶段出现故障,它不会被执行。

对此有何想法,主要是工作示例?

4

1 回答 1

1

由于我不使用声明性管道,因此我不完全知道这是否可行,因此不确定顶层结构的刚性。但我会恢复到脚本块。

@Library('jenkins-shared-library')_
pipeline {
    agent none
    stages {
        stage ('System Info') { agent any
            steps { printSysInfo() }
        }

        stage ('Init'){ agent {label 'WinZipSE'}
            steps { init('SCMroot') }
        }
        stage('Build') { agent any 
            steps { doMagic() }
        }
    }

    // This entire 'post {}' section needs to go to a shared lib
    // and be called just with a simple methed call, e.g.
    // doPostBuild()
    script {
        doPostBuild()
    }
}
于 2019-04-28T01:00:26.240 回答