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

时间:2011-11-16 07:31:10

标签: shell jenkins build status

在我正在开发的项目中,我们使用shell脚本来执行不同的任务。有些脚本是运行Rsync的SH / Bash,有些是PHP脚本。其中一个PHP脚本正在运行一些集成测试,这些测试输出到JUnit XML,代码覆盖率报告等。

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

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

Jenkins Terminology中,不稳定版本被定义为

  

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

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

15 个答案:

答案 0 :(得分:55)

可以在不打印魔术字符串和使用TextFinder的情况下完成。 Here's有一些信息。

基本上你需要在shell脚本中提供http:// yourserver.com / cli的.jar文件,然后你可以使用以下命令来标记构建不稳定:

java -jar jenkins-cli.jar set-build-result unstable

要在出错时标记构建不稳定,您可以使用:

failing_cmd cmd_args || java -jar jenkins-cli.jar set-build-result unstable

问题是jenkins-cli.jar必须可以从shell脚本中获得。您可以将其放在易于访问的路径中,也可以通过job的shell脚本下载:

wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar

答案 1 :(得分:53)

使用Text-finder插件。

不要退出状态1(这会使构建失败),而是执行:

if ($build_error) print("TESTS FAILED!");

在后置构建操作中启用文本查找器,设置正则表达式以匹配您打印的消息(TESTS FAILED!),并选中该条目下的“找不到,如果找不到”复选框。

答案 2 :(得分:33)

现代Jenkins版本(自2016年10月2。2日起)解决了这个问题:它只是Execute shell构建步骤的高级选项!

exit code for build

您可以选择并设置任意退出值;如果匹配,则构建将不稳定。只需选择一个不太可能由构建中的实际进程启动的值。

答案 3 :(得分:11)

您应该使用Jenkinsfile打包构建脚本,并使用currentBuild.result = "UNSTABLE"将当前构建标记为不稳定。

   stage {
      status = /* your build command goes here */
      if (status === "MARK-AS-UNSTABLE") {
        currentBuild.result = "UNSTABLE"
      }
   }

答案 4 :(得分:8)

您还应该能够使用groovy并执行textfinder所做的事情

marking a build as un-stable with groovy post-build plugin

if(manager.logContains("Could not login to FTP server")) {
    manager.addWarningBadge("FTP Login Failure")
    manager.createSummary("warning.gif").appendText("<h1>Failed to login to remote FTP Server!</h1>", false, false, false, "red")
    manager.buildUnstable()
}

另见Groovy Postbuild Plugin

答案 5 :(得分:6)

在我的工作脚本中,我有以下语句(此作业仅在Jenkins主服务器上运行):

# This is the condition test I use to set the build status as UNSTABLE
if [ ${PERCENTAGE} -gt 80 -a ${PERCENTAGE} -lt 90 ]; then
  echo WARNING: disc usage percentage above 80%

  # Download the Jenkins CLI JAR:
  curl -o jenkins-cli.jar ${JENKINS_URL}/jnlpJars/jenkins-cli.jar

  # Set build status to unstable
  java -jar jenkins-cli.jar -s ${JENKINS_URL}/ set-build-result unstable

fi

您可以在Jenkins wiki上看到这个以及有关设置构建状态的更多信息:https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

答案 6 :(得分:4)

  1. 配置PHP构建以生成xml junit报告

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. 完成状态为0的构建脚本

    ...
    exit 0;
    
  3. 为测试报告XML添加构建后操作发布JUnit测试结果报告。当测试失败时,此插件会将Stable构建更改为Unstable。

    **/build/junit.xml
    
  4. 使用控制台输出扫描和未选中的选项添加 Jenkins Text Finder 插件。这个插件在致命错误的基础上失败。

    PHP Fatal error:
    

答案 7 :(得分:3)

我发现最灵活的方法是通过在groovy post build插件中读取文件。 enter image description here

import hudson.FilePath
import java.io.InputStream

def build = Thread.currentThread().executable

String unstable = null
if(build.workspace.isRemote()) {
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/build.properties")
    InputStream is = fp.read()
    unstable = is.text.trim()
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/build.properties"))
    InputStream is = fp.read()
    unstable = is.text.trim()
}

manager.listener.logger.println("Build status file: " + unstable)
if (unstable.equalsIgnoreCase('true')) {
    manager.listener.logger.println('setting build to unstable')
    manager.buildUnstable()
}

如果文件内容是真的&#39;构建将设置为不稳定。这将适用于本地主服务器以及运行该作业的任何从服务器,以及可写入磁盘的任何类型的脚本。

答案 8 :(得分:1)

仅当作业状态尚未从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/

答案 9 :(得分:1)

here复制我的答案,因为我花了一些时间来寻找这个:

现在可以在较新版本的Jenkins中使用,你可以这样做:

#!/usr/bin/env groovy

properties([
  parameters([string(name: 'foo', defaultValue: 'bar', description: 'Fails job if not bar (unstable if bar)')]),
])


stage('Stage 1') {
  node('parent'){
    def ret = sh(
      returnStatus: true, // This is the key bit!
      script: '''if [ "$foo" = bar ]; then exit 2; else exit 1; fi'''
    )
    // ret can be any number/range, does not have to be 2.
    if (ret == 2) {
      currentBuild.result = 'UNSTABLE'
    } else if (ret != 0) {
      currentBuild.result = 'FAILURE'
      // If you do not manually error the status will be set to "failed", but the
      // pipeline will still run the next stage.
      error("Stage 1 failed with exit code ${ret}")
    }
  }
}

Pipeline Syntax生成器在高级选项卡中显示:

Pipeline Syntax Example

答案 10 :(得分:1)

我想我会为可能正在寻找类似事物的人发布另一个答案。

在我们的构建工作中,我们有一些情况,我们希望构建继续,但标记为不稳定。对于我们来说,它与版本号有关。

所以,我想在构建上设置一个条件,并在满足条件时将构建设置为unstable。

我使用条件步骤(单个)选项作为构建步骤。

然后我使用执行系统Groovy脚本作为满足该条件时运行的构建步骤。

我使用 Groovy命令并将脚本设置为以下

import hudson.model.*

def build = Thread.currentThread().executable
build.@result = hudson.model.Result.UNSTABLE

return

这看起来效果很好。

我在这里偶然发现了解决方案

http://tech.akom.net/archives/112-Marking-Jenkins-build-UNSTABLE-from-environment-inject-groovy-script.html

答案 11 :(得分:1)

作为现有答案的替代品,您可以使用简单的 HTTP POST设置构建结果,以访问Groovy脚本控制台REST API

    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文件
  • 没有用于设置和读取某些全局状态(控制台文本,工作区中的文件)的kludges
  • 不需要插件(除了Groovy)
  • 无需在PASSED或FAILURE情况下配置多余的构建步骤。

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

  • 可以从slave
  • 访问Jenkins REST API
  • Slave必须能够访问允许访问Jenkins Groovy脚本REST API的凭据。

答案 12 :(得分:0)

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

答案 13 :(得分:-1)

如果shell以失败的命令结束,那么OK(构建失败:) 如果shell脚本中的命令失败,请执行check after命令:

 if [ "$?" -ne 0 ]; then
    exit 1
 fi 

来自@zrajm的更正:它可以简化为

... || exit 1

答案 14 :(得分:-4)

您只需调用“退出1”,构建将在此时失败,而不是继续。我最后制作了一个直通功能来处理它,并打电话给safemake而不是make for building:

function safemake {
  make "$@"
  if [ "$?" -ne 0 ]; then
    echo "ERROR: BUILD FAILED"
    exit 1
  else
    echo "BUILD SUCCEEDED"
  fi
}