如何在Jenkins运行shell脚本时将构建标记为不稳定

103
在我正在处理的一个项目中,我们使用shell脚本来执行不同的任务。一些是运行rsync的sh/bash脚本,另一些则是PHP脚本。其中一个PHP脚本正在运行一些集成测试,输出JUnit XML、代码覆盖率报告等。

Jenkins能够根据退出状态将作业标记为成功/失败。在PHP中,如果检测到测试在运行期间失败,则该脚本以1的状态退出。其他shell脚本运行命令并使用这些命令的退出码来标记构建失败。

// :: End of PHP script:
// If any tests have failed, fail the build
if ($build_error) exit(1);

Jenkins术语中,不稳定的构建被定义为:

如果构建成功并且一个或多个发布者报告它不稳定,则构建是不稳定的。例如,如果配置了JUnit发布者并且测试失败,则构建将被标记为不稳定。

当运行shell脚本时,如何让Jenkins将构建标记为不稳定而不仅仅是成功/失败?

我通过运行不同的作业步骤和使用Jenkins插件来实现它。 - Fantastory
16个回答

3
除了其他答案之外,Jenkins还允许使用unstable()方法(在我看来更清晰)。 该方法可与消息参数一起使用,描述为何构建不稳定。
此外,您可以使用您的shell脚本(bat或sh)的returnStatus来启用此功能。
例如:
def status = bat(script: "<your command here>", returnStatus: true)
if (status != 0) {
    unstable("unstable build because script failed")
}

当然,根据您的需求和返回状态,您可以更加细致地制作一些内容。


此外,如果您想要引发错误,您也可以使用warnError()替代unstable()。它会将您的构建标记为失败而不是不稳定,但语法相同。


2

如果任务状态从SUCCESS更改为FAILED或ABORTED,则TextFinder不再起作用。 对于这种情况,请在PostBuild步骤中使用groovy脚本:

errpattern = ~/TEXT-TO-LOOK-FOR-IN-JENKINS-BUILD-OUTPUT.*/;
manager.build.logFile.eachLine{ line ->
    errmatcher=errpattern.matcher(line)
    if (errmatcher.find()) {
        manager.build.@result = hudson.model.Result.NEW-STATUS-TO-SET
    }
 }

我在一篇文章中详细介绍了此内容,请查看: http://www.tikalk.com/devops/JenkinsJobStatusChange/


1
作为现有答案的轻量级替代方案,您可以通过对 Groovy 脚本控制台 REST API 发送一个简单的 HTTP POST 请求来设置构建结果:
    curl -X POST \
     --silent \
     --user "$YOUR_CREDENTIALS" \
     --data-urlencode "script=Jenkins.instance.getItemByFullName( '$JOB_NAME' ).getBuildByNumber( $BUILD_NUMBER ).setResult( hudson.model.Result.UNSTABLE )" $JENKINS_URL/scriptText

优势:

  • 无需下载和运行庞大的jar文件
  • 不需要在设置和读取一些全局状态(控制台文本、工作区文件)时进行丑陋的处理
  • 除了Groovy之外,不需要任何插件
  • 无需配置额外的构建步骤,在PASSED或FAILURE情况下是多余的。

对于这个解决方案,您的环境必须满足以下条件:

  • Jenkins REST API可以从从节点访问
  • 从节点必须具有访问Jenkins Groovy脚本REST API所需的凭据。

1
如果您想使用声明式方法,我建议您使用以下代码。
pipeline {
    stages {
        // create separate stage only for problematic command
        stage("build") {
            steps {
                sh "command"
            }
            post {
                failure {
                    // set status
                    unstable 'rsync was unsuccessful'
                }
                always {
                    echo "Do something at the end of stage"
                }
            }
        }
    }

    post {
        always {
            echo "Do something at the end of pipeline"
        }
    }
}

如果您想将所有内容保留在一个阶段中,请使用catchError

pipeline {
    stages {
        // create separate stage only for problematic command
        stage("build") {
            steps {
                catchError(stageResult: 'UNSTABLE') {
                    sh "command"
                }
                sh "other command"
            }
        }
    }
}

-1

将构建设置为不稳定的一种简单方法是在您的“执行 shell”块中运行exit 13


据我所知,让sh运行一个以状态码13退出的程序只会导致构建失败。 - ArtOfWarfare

-4
你可以直接调用 "exit 1",构建将在那一点失败而不会继续进行。我最终编写了一个中间函数来处理它,并在构建时调用 safemake 而不是 make:
function safemake {
  make "$@"
  if [ "$?" -ne 0 ]; then
    echo "ERROR: BUILD FAILED"
    exit 1
  else
    echo "BUILD SUCCEEDED"
  fi
}

13
据我所知,exit 1 只会导致构建失败。我不想构建失败,我希望它被标记为不稳定。 - HNygard
1
请参阅https://dev59.com/w1oV5IYBdhLWcg3wY9_6 -- 简单的解决方案只是 if make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接