Is there a way to move the entire post {} build section in Jenkinsfile to the global pipeline library?

蹲街弑〆低调 提交于 2019-12-07 14:44:03

问题


I'm relatively new to Jenkins pipelines, but having implemented already a few, I've realised I need to start using jenkins shared library before I go mad.

Have already figured out how to define some repetitive steps in the library and call them with less clutter from Jenkinsfile, but not sure if the same thing can be done for the entire post build section (thought I've read about to how to define the entire pipeline in the lib and similar), as this is pretty much static end of every single pipeline code:

@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
    }
}

I just dunno how to syntactically achieve that. For sure, I can define the entire post build section an a lib/var like: doPotBuild.groovy

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

but how I will eventually call it from within my Jenkinsfile outside of that defined post {} build block section (AKA stages).

I can call it within some stage('post build){doPostBuild()}, but it won't serve the way how the true post {} section is supposed to work, e.g. it won't get executed it there was failure in one of the previous stages.

Any thoughts on that and mainly working examples?


回答1:


I am not entirely if this will work as I don't use declarative pipelines, so am unsure how rigid the top level structure is. But I would revert to a script block.

@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()
    }
}


来源:https://stackoverflow.com/questions/55602956/is-there-a-way-to-move-the-entire-post-build-section-in-jenkinsfile-to-the-gl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!