Jenkins管道中的条件发布部分

时间:2019-12-16 03:57:37

标签: jenkins

说我有一个简单的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. 当它是标记构建,并且所有阶段都成功时,我将看到“ Built tag”消息。 (在示例中也是“是”)
  3. 当它不是标签构建时,将不会发送任何松弛消息。 (在示例中情况并非如此,例如,当“测试”阶段失败时,将出现“错误构建标记”消息)

据我所知,Jenkins管道语法中没有“条件发布区”之类的东西,它确实可以在这里帮助我。所以我的问题是,还有其他方法可以做到吗?

3 个答案:

答案 0 :(得分:3)

    post {
        failure {
            script {
                if (isTagBuild) {
                    send_slack_message("Error building tag")
                }
            }
        }
    }

其中isTagBuild是区分标签或不构建标签的任何方式。

您还可以应用相同的逻辑,并将send_slack_message("Built tag")下移到success后期。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

好吧,对于那些只想要一些可复制复制代码的人,这就是我根据@ 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管道,因此,如果您有任何建议,请发表评论。