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

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

jenkins能够将工作标记为成功/失败的退出状态 。 在PHP中,如果脚本在运行期间检测到失败的testing,则脚本将退出 。 其他shell脚本运行命令,并使用这些脚本的退出代码将构build标记为失败。

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

在Jenkins术语中 ,不稳定的构build被定义为

如果构build成功并且一个或多个发布者报告它不稳定,则构build不稳定。 例如,如果configuration了JUnit发布者并且testing失败,则构build将标记为unstable。

我怎么能让jenkins标记为不稳定,而不是运行shell脚本时成功/失败?

使用文本查找器插件。

而不是退出状态1(这会失败的构build),做:

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

比在生成后动作启用文本search,设置正则expression式来匹配您打印的信息(testingTESTS FAILED! ),并检查该条目下的“不稳定如果find”checkbox。

可以在不打印魔术string的情况下使用TextFinder来完成。 这里有一些信息。

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

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

要标记构build不稳定的错误,您可以使用:

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

问题是jenkins-cli.jar必须从shell脚本中可用。 你可以把它放在易于访问的path,或通过作业的shell脚本下载:

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

你也应该能够使用groovy,并做文本search

使用groovy post-build插件将构build标记为不稳定

 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插件

在我的工作脚本中,我有以下陈述(这个工作只能在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上看到更多关于设置构build状态的信息: https : //wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  1. configurationPHP构build生成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的构build脚本

     ... exit 0; 
  3. 添加构build后操作发布testing报告XML的JUnittesting结果报告 。 当testing失败时,这个插件将把稳定版本更改为不稳定版本。

     **/build/junit.xml 
  4. 添加Jenkins文本search插件与控制台输出扫描和未经检查的选项。 这个插件在致命错误上失败了。

     PHP Fatal error: 

如果shell以失败的命令结束,那么一切正常(构build失败:)如果shell脚本内的命令失败,执行check after命令:

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

我发现最灵活的方法是通过阅读groovy post build插件中的文件。 在这里输入图像说明

 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() } 

如果文件内容为“真”,则版本将被设置为不稳定。 这将在本地主服务器上以及在任何从属服务器上运行的任何从属服务器上运行,以及任何可以写入磁盘的脚本。

只有在作业状态没有从成功更改为失败或中止的情况下,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/

您应该使用Jenkinsfile来包装您的构build脚本,并使用currentBuild.result = "UNSTABLE"将当前构build标记为UNSTABLE。

   阶段{
      状态= / *你的构build命令去这里* /
       if(status ===“MARK-AS-UNSTABLE”){
         currentBuild.result =“UNSTABLE”
       }
    }

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

现在可以在新版本的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}") } } } 

pipe道语法生成器在高级选项卡中向您显示:

流水线语法示例

你可以直接调用“exit 1”,这个版本在那个时候会失败,不会继续。 为了处理这个问题,我做了一个直通function来处理它,并且调用safemake来代替make:

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