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条件。类似于--post
2次,这是错误的实现,因为post被设计为在所有阶段完成后只执行一次。它应该在管道结束之前的所有阶段之后编写李>
构建阶段的执行
,您可以在顶部创建全局变量,在其中捕获pylint的输出,并在阶段开始时使用if或when条件。类似于--注意:上面的代码只是一个示例。请根据您的需要进行修改。我已经找到了解决您问题的方法,我认为这是管道工作流中的一个错误。
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”}
时,我可以使用跳过部署阶段,但由于某种原因,在这之后,构建被标记为成功。你有过这样的经历吗?是的,我有过。但我无法找到根本原因。有两个类似的变量: