詹金斯:通过单一管道安排特定阶段

时间:2020-05-21 08:19:13

标签: jenkins jenkins-pipeline jenkins-declarative-pipeline

我有一个声明性的管道,并且有多个阶段,例如下面通过webhook触发的事件。

我想在某个时间执行并安排阶段B,该阶段也可以通过webhook触发而无需运行。显然,它需要在通过webhook触发时运行,并且还需要在预定时间运行。我可以在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
            }

2 个答案:

答案 0 :(得分:0)

不是以一种干净或一流的方式,但是是的,您可以有效地做到这一点。

对于至少已运行一次的任何作业,您可以单击上一次运行的“重播”。

然后将在文本编辑框中显示Jenkinsfile。此时,您可以对Jenkinsfile进行任何编辑(如果需要,可以粘贴到完全不相关的Jenkinsfile中),Jenkins将执行修改后的版本。对于您的特定情况,您可以删除所有不想重新运行的阶段,而只留下想要的一个(或两个,等等)。

答案 1 :(得分:0)

您可以找到导致管道运行的原因。这可能是cron触发器,手动触发器,代码提交触发器,webhook触发器,对GitHub的注释,上游作业等(取决于安装的插件,列表可能很长。)

这里是代码示例,用以了解触发器是什么。本示例设置环境变量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()
}

我认为一个构建可能有多个触发器,如果​​这样的话,子句的顺序很重要。

一旦弄清了这个问题,就只能在触发器符合您的定义的情况下运行阶段。

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