我有一个Jenkinsfile
,它具有两个不同的阶段:Pre-Build
和Build
。 Pre-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.org(Ticket)上找到了一张票,但是我似乎无法理解所有这些。
post
2次,这是错误的实现,因为post设计为在所有阶段完成后仅执行一次。它应该在流水线结束之前的所有阶段之后编写。 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。
注意:上面的代码仅是示例。请根据需要进行修改。