Jenkins管道-在pylint发生条件故障时跳过下一阶段

问题描述 投票:0回答:1

我有一个Jenkinsfile,它具有两个不同的阶段:Pre-BuildBuildPre-Build正在执行pylint,并使用warnings-ng插件将其报告给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-ng插件是否适合使用。

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

由于recordIssues中确定的结果,该构建被标记为失败,但不会中止该作业。

我在https://issues.jenkins-ci.orgTicket)上找到了一张票,但是我似乎无法理解所有这些。

jenkins jenkins-pipeline jenkins-plugins pylint
1个回答
0
投票
  1. 您已使用post 2次,这是错误的实现,因为post设计为在所有阶段完成后仅执行一次。它应该在流水线结束之前的所有阶段之后编写。
  2. 要停止或跳过第二个Build stage的执行,可以在顶部创建全局变量,捕获其中的pylint输出,并在阶段开始时使用if或when条件。类似于-
pipeline {
def result

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
                            """
                   }
                }
            }
        }
        stage('Pylint result') {   // Not sure how recordIssue works. This just an example.
         result =  recordIssues(
                            enabledForFailure: true,
                            tool: pyLint(pattern: '**/pylint.log'),
                            unstableTotalAll: 20,
                            failedTotalAll: 30,
                    )
        }
        stage('Build') {
          if ( result == "pass") {
            steps {
                script {
                    sh """#!/usr/bin/env bash
                            set -e
                            echo 'I AM STAGE TWO AND I SHOULD NOT BE EXECUTED'
                            """
                }
            }
         } 
       }
    }
   post {   // this should be used after stages
                always {
                    cleanWs()
                }   
            failure {
                    cleanWs()
                }
}

而且,阶段的设计方式是,如果它们失败,则将不执行下一阶段,因此,最好在阶段内部而不是在后置条件下执行pylint。

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

© www.soinside.com 2019 - 2024. All rights reserved.