【问题标题】:Conditional post section in Jenkins pipeline詹金斯管道中的条件帖子部分
【发布时间】:2019-12-19 10:55:45
【问题描述】:

假设我有一个简单的 Jenkins 管道文件,如下所示:

pipeline {
    agent any

    stages {
        stage('Test') {
            steps {
                sh ...
            }
        }

        stage('Build') {
            steps {
                sh ...
            }
        }

        stage('Publish') {
            when {
                buildingTag()
            }

            steps {
                sh ...
                send_slack_message("Built tag")
            }
        }
    }

    post {
        failure {
            send_slack_message("Error building tag")
        }
    }
}

由于每天都有很多非标签构建,我不想发送任何关于非标签构建的松弛消息。但是对于标签构建,我想发送一条成功消息或一条失败消息,不管它在哪个阶段失败。

所以对于上面的例子,我想要:

  1. 如果是标签构建,并且阶段“测试”失败,我将看到“构建标签时出错”消息。 (在示例中为“是”)
  2. 当它是一个标签构建并且所有阶段都成功时,我会看到一个“构建标签”消息。 (在示例中这也是一个是)
  3. 如果不是标签构建,则不会发送松弛消息。 (示例中并非如此,例如,当 'Test' 阶段失败时,会出现“Error building tag”消息)

据我所知,Jenkins 管道语法中没有“条件发布部分”之类的东西,这真的可以帮助我。所以我的问题是,有没有其他方法可以做到这一点?

【问题讨论】:

    标签: jenkins


    【解决方案1】:
        post {
            failure {
                script {
                    if (isTagBuild) {
                        send_slack_message("Error building tag")
                    }
                }
            }
        }
    

    isTagBuild 是您区分标签或无标签构建的任何方式。

    您也可以应用相同的逻辑,将send_slack_message("Built tag") 向下移动到success 后期阶段。

    【讨论】:

      【解决方案2】:

      在后期构建步骤中,您还可以在内部使用脚本步骤并使用 if。在这个 if 步骤中,您可以添加 emailext 插件。

      【讨论】:

        【解决方案3】:

        好吧,对于那些只想要一些可复制粘贴代码的人来说,这就是我根据 @eez0 的回答得出的结论。

        pipeline {
            agent any
        
            environment {
                BUILDING_TAG = 'no'
            }
        
            stages {
                stage('Setup') {
                    when {
                        buildingTag()
                    }
        
                    steps {
                        script {
                            BUILDING_TAG = 'yes'
                        }
                    }
                }
        
                stage('Test') {
                    steps {
                        sh ...
                    }
                }
        
                stage('Build') {
                    steps {
                        sh ...
                    }
                }
        
                stage('Publish') {
                    when {
                        buildingTag()
                    }
        
                    steps {
                        sh ...
                    }
                }
            }
        
            post {
                failure {
                    script {
                        if (BUILDING_TAG == 'yes') {
                            slackSend(color: '#dc3545', message: "Error publishing")
                        }
                    }
                }
        
                success {
                    script {
                        if (BUILDING_TAG == 'yes') {
                            slackSend(color: '#28a745', message: "Published")
                        }
                    }
                }
            }
        }
        

        如您所见,我真的依靠 Jenkins 内置的 buidingTag() 函数来帮助我解决问题,通过使用 env-var 作为“桥梁”。我真的不擅长 Jenkins 流水线,所以如果您有任何建议,请留下 cmets。

        【讨论】:

          猜你喜欢
          • 2019-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-08
          • 2019-01-09
          • 2018-11-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多