Jenkins: Schedule Particular Stage with single pipeline

六月ゝ 毕业季﹏ 提交于 2021-01-29 15:24:57

问题


I have a single pipeline where it' declarative and I've several stages such as below triggers via webhook.

I would like to execute and scheduled Stage B at a certain time which can also run without trigger via webhook. Clearly it needs to run when triggers via webhook and also run when it will be schedule. Can I handle this without creating seperate job or pipeline in Jenkins ?

           stage('A'){
                when{
                    beforeAgent true
                    expression{return env.GIT_BRANCH == "origin/development"}
                }
                steps{
                    script{
                         //Do something
            }  


            stage ('B'){
                when {
                    beforeAgent true
                    expression{return env.GIT_BRANCH == "origin/development"}
                steps {
                    script {
                        //Run Tests
                    }
                }
            }


            stage('C'){
                when{
                    beforeAgent true
                    expression{return env.GIT_BRANCH == "origin/development"}
                }
                steps{
                    script{
                       //Do something
            }

回答1:


Not in a clean or first-class manner, but yes you can do it effectively.

For any job which has been run at least once, you can click "replay" for the previous run.

You will then be presented with the Jenkinsfile in a text edit box. At this point you can perform any edit you want to the Jenkinsfile (including pasting in a completely unrelated Jenkinsfile if you wanted) and Jenkins will execute the modified version. For your specific case, you can delete all the stages you don't want to re-run and just leave behind the one (or two, etc) you want.




回答2:


You can discover what caused your pipeline to run. This may be cron trigger, manual trigger, code commit trigger, webhook trigger, comment on GitHub, upstream job, etc. (depending on plugins installed, the list may be long.)

Here's and example of code to understand what the trigger was. This example sets the environment variable TRIGGERED_BY.

def checkForTrigger() {
    def timerCause = currentBuild.rawBuild.getCause(hudson.triggers.TimerTrigger.TimerTriggerCause)
    if (timerCause) {
        echo "Build reason: Build was started by timer"
        env.TRIGGERED_BY = 'timer'
        return
    }

    def userCause = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause)
    if (userCause) {
        echo "Build reason: Build was started by user"
        env.TRIGGERED_BY = 'user'
        return
    }

    def remoteCause = currentBuild.rawBuild.getCause(hudson.model.Cause$RemoteCause)
    if (remoteCause) {
        echo "Build reason: Build was started by remote script"
        env.TRIGGERED_BY = 'webhook'
        return
    }
    // etc.
    println "We haven't caught any of triggers, might be a new one, here is the dump"
    def causes = currentBuild.rawBuild.getCauses()
    println causes.dump()
}

I think that a build might have more than one trigger, if so the order of your clauses is important.

Once you have this figured out, you can run your stages only when the trigger fits your definition.

            stage ('B'){
                when {
                    beforeAgent true
                    anyOf {
                       expression{return env.GIT_BRANCH == "origin/development"}
                       environment name: 'TRIGGERED_BY', value: 'timer'
                       environment name: 'TRIGGERED_BY', value: 'webhook'
                    }


来源:https://stackoverflow.com/questions/61930192/jenkins-schedule-particular-stage-with-single-pipeline

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