Трубопровод Дженкинс - пропустите следующий этап при условном отказе от пулинта - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть Jenkinsfile, который имеет два разных этапа: Pre-Build и Build. Pre-Build выполняет pylint и использует плагин warnings-ng, чтобы сообщить об этом Дженкинсу.

Примерно так:

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 решал, подходит ли он для go или нет, на основании отчета.

В настоящее время происходит сбой в общей сложности 30 проблем. Теперь у myProject есть 45 проблем, и я хочу предотвратить переход на следующий этап, Build. Но в настоящее время я не могу предотвратить такое поведение, поскольку оно всегда продолжается до стадии Build.

Сборка помечается как неудачная из-за результатов, определенных в recordIssues, но она не прерывает работу.

Я нашел билет на https://issues.jenkins-ci.org ( Ticket ), но мне кажется, что я не вижу смысла во всем этом.

1 Ответ

0 голосов
/ 23 апреля 2020
  1. Вы использовали post 2 раза, что является неправильной реализацией, поскольку пост предназначен для выполнения только один раз после выполнения всех этапов. Это должно быть написано после всех этапов непосредственно перед завершением конвейера.
  2. Чтобы остановить или пропустить выполнение 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()
                }
}

Кроме того, этапы спроектированы таким образом, что, если они не пройдут, следующий этап не будет выполнен, поэтому желательно, чтобы внутри был выполнен пилинт этап вместо почтового условия.

Примечание. Приведенный выше код является лишь примером. Пожалуйста, измените его в соответствии с вашими потребностями.

...