Jenkins管道-跳过pylint条件故障的下一阶段

Jenkins管道-跳过pylint条件故障的下一阶段,jenkins,jenkins-pipeline,jenkins-plugins,pylint,Jenkins,Jenkins Pipeline,Jenkins Plugins,Pylint,我有一个Jenkinsfile,它有两个不同的阶段:Pre-Build和Build。Pre-Build正在执行pylint,并使用warningng-插件向Jenkins报告 诸如此类: stages { stage('Pre-build') { steps { script { sh """#!/usr/bin/env bash

我有一个
Jenkinsfile
,它有两个不同的阶段:
Pre-Build
Build
Pre-Build
正在执行
pylint
,并使用
warningng
-插件向Jenkins报告

诸如此类:

stages {
        stage('Pre-build') {
            steps {
                script {
                    sh """#!/usr/bin/env bash
                            pip install .
                            pylint --exit-zero --output-format=parseable --reports=n myProject > reports/pylint.log
                            """
                }
            }

            post {
                always {
                    recordIssues(
                            enabledForFailure: true,
                            tool: pyLint(pattern: '**/pylint.log'),
                            unstableTotalAll: 20,
                            failedTotalAll: 30,
                    )
                }
                failure {
                    cleanWs()
                }
            }
        }

        stage('Build') {
            steps {
                script {
                    sh """#!/usr/bin/env bash
                            set -e
                            echo 'I AM STAGE TWO AND I SHOULD NOT BE EXECUTED'
                            """
                }
            }
            post {
                always {
                    cleanWs()
                }
            }
        }
    }
我在这里遇到了几个问题。目前,我正在将
pylint
设置为
--exit zero
,因为我希望
warnings
插件根据报告决定是否继续

目前,共有30个问题设置为失败。现在,
myProject
有45个问题,我想阻止进入下一阶段,
Build
。但目前我似乎无法阻止这种行为,因为它总是持续到
构建
阶段

由于在
recordIssues
中确定的结果,生成被标记为失败,但它不会中止作业

我在()上找到了一张票,但我似乎无法理解这一切

  • 您使用了
    post
    2次,这是错误的实现,因为post被设计为在所有阶段完成后只执行一次。它应该在管道结束之前的所有阶段之后编写
  • 要停止或跳过第二个
    构建阶段的执行
    ,您可以在顶部创建全局变量,在其中捕获pylint的输出,并在阶段开始时使用if或when条件。类似于--
  • 此外,阶段的设计方式是,如果失败,下一个阶段将不会执行,因此最好在阶段内而不是在后期条件中执行pylint

    注意:上面的代码只是一个示例。请根据您的需要进行修改

  • 您使用了
    post
    2次,这是错误的实现,因为post被设计为在所有阶段完成后只执行一次。它应该在管道结束之前的所有阶段之后编写
  • 要停止或跳过第二个
    构建阶段的执行
    ,您可以在顶部创建全局变量,在其中捕获pylint的输出,并在阶段开始时使用if或when条件。类似于--
  • 此外,阶段的设计方式是,如果失败,下一个阶段将不会执行,因此最好在阶段内而不是在后期条件中执行pylint


    注意:上面的代码只是一个示例。请根据您的需要进行修改。

    我已经找到了解决您问题的方法,我认为这是管道工作流中的一个错误。
    warnings
    正确地将生成状态设置为failed,但是,尽管在
    ${currentBuild.currentResult}
    变量中存在该状态,下一阶段仍将启动

    当{expression{return currentBuild.currentResult==“SUCCESS”}跳过后面的阶段或抛出错误时,可以使用
    。但我认为这应该是默认行为。然后,您的文件应该是:

    stages {
            stage('Pre-build') {
                steps {
                    script {
                        sh """#!/usr/bin/env bash
                                pip install .
                                pylint --exit-zero --output-format=parseable --reports=n myProject > reports/pylint.log
                                """
                    }
                }
    
                post {
                    always {
                        recordIssues(
                                enabledForFailure: true,
                                tool: pyLint(pattern: '**/pylint.log'),
                                unstableTotalAll: 20,
                                failedTotalAll: 30,
                        )
                    }
                }
            }
    
            stage('Build') {
                when { expression { return currentBuild.currentResult == "SUCCESS" } }
    
                steps {
                    script {
                        echo "currentResult: ${currentBuild.currentResult}"
                        sh """#!/usr/bin/env bash
                                set -e
                                echo 'I AM STAGE TWO AND I SHOULD NOT BE EXECUTED'
                                """
                    }
                }
    
            }
            post {
                always {
                    cleanWs()
                }
            }
        }
    
    我在他们的Jira中创造了一个

    我的环境:

    詹金斯版本:2.222.1

    警告ng
    版本:8.1

    worfklow api
    ver.:2.40


    我已经找到了您问题的解决方案,我认为这是管道工作流中的一个缺陷。
    warnings
    正确地将生成状态设置为failed,但是,尽管在
    ${currentBuild.currentResult}
    变量中存在该状态,下一阶段仍将启动

    当{expression{return currentBuild.currentResult==“SUCCESS”}
    跳过后面的阶段或抛出错误时,可以使用
    。但我认为这应该是默认行为。然后,您的文件应该是:

    stages {
            stage('Pre-build') {
                steps {
                    script {
                        sh """#!/usr/bin/env bash
                                pip install .
                                pylint --exit-zero --output-format=parseable --reports=n myProject > reports/pylint.log
                                """
                    }
                }
    
                post {
                    always {
                        recordIssues(
                                enabledForFailure: true,
                                tool: pyLint(pattern: '**/pylint.log'),
                                unstableTotalAll: 20,
                                failedTotalAll: 30,
                        )
                    }
                }
            }
    
            stage('Build') {
                when { expression { return currentBuild.currentResult == "SUCCESS" } }
    
                steps {
                    script {
                        echo "currentResult: ${currentBuild.currentResult}"
                        sh """#!/usr/bin/env bash
                                set -e
                                echo 'I AM STAGE TWO AND I SHOULD NOT BE EXECUTED'
                                """
                    }
                }
    
            }
            post {
                always {
                    cleanWs()
                }
            }
        }
    
    我在他们的Jira中创造了一个

    我的环境:

    詹金斯版本:2.222.1

    警告ng
    版本:8.1

    worfklow api
    ver.:2.40


    您可以考虑的一个选项是用下面的代码显式地失败构建:

    post {
        always {
            recordIssues(
                enabledForFailure: true,
                tool: pyLint(pattern: '**/pylint.log'),
                unstableTotalAll: 20,
                failedTotalAll: 30
            )
    
            script {
                if (currentBuild.currentResult == 'FAILURE') {
                    error('Ensure that the build fails if the quality gates fail')
                }
            }
        }
    }
    

    这里,在记录问题之后,您还检查“代码”> CurruthBudio.CurrnRead < /COD>的值是“代码>失败<代码>,在这种情况下,您明确地调用了<代码>错误()>代码>函数,它正确地生成了错误。

    < P>您可以考虑的一个选项是用下面的代码显式地失败构建:

    post {
        always {
            recordIssues(
                enabledForFailure: true,
                tool: pyLint(pattern: '**/pylint.log'),
                unstableTotalAll: 20,
                failedTotalAll: 30
            )
    
            script {
                if (currentBuild.currentResult == 'FAILURE') {
                    error('Ensure that the build fails if the quality gates fail')
                }
            }
        }
    }
    

    在这里,在记录问题之后,还要检查
    currentBuild.currentResult
    的值是否为
    FAILURE
    ,在这种情况下,您显式调用
    error()
    函数,使生成正确失败。

    我也遇到了同样的问题。前面提到的Jira罚单是关于这样一个事实,即警告ng插件没有将stage result设置为“FAILED”,也没有将整个构建设置为FAILED。现在它正正确地将其设置为失败,但它不会停止下一阶段的执行。我也有同样的问题。前面提到的Jira罚单是关于这样一个事实,即警告ng插件没有将stage result设置为“FAILED”,也没有将整个构建设置为FAILED。现在它正在将其正确设置为失败,但它不会停止下一个阶段的执行。等等,因此post条件不是阶段post条件,而是全局post条件?这取决于您在哪里定义它。在我的回答中,我对阶段“预构建”有一个后条件,对整个构建有一个后条件。阅读有用信息:等等,所以post条件不是阶段post条件,而是全局post条件?这取决于定义它的位置。在我的回答中,我对阶段“预构建”有一个后条件,对整个构建有一个后条件。有用阅读:感谢您的解决方案,它非常有用。当{expression{return currentBuild.result==“SUCCESS”}
    时,我可以使用
    跳过部署阶段,但由于某种原因,在这之后,构建被标记为成功。你有过这样的经历吗?是的,我有过。但我无法找到根本原因。有两个类似的变量: