在我正在开发的项目中,我们使用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将构建标记为不稳定而不是仅成功/失败?
答案 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构建步骤的高级选项!
您可以选择并设置任意退出值;如果匹配,则构建将不稳定。只需选择一个不太可能由构建中的实际进程启动的值。
答案 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()
}
答案 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)
配置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>
完成状态为0的构建脚本
...
exit 0;
为测试报告XML添加构建后操作发布JUnit测试结果报告。当测试失败时,此插件会将Stable构建更改为Unstable。
**/build/junit.xml
使用控制台输出扫描和未选中的选项添加 Jenkins Text Finder 插件。这个插件在致命错误的基础上失败。
PHP Fatal error:
答案 7 :(得分:3)
我发现最灵活的方法是通过在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()
}
如果文件内容是真的&#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生成器在高级选项卡中显示:
答案 10 :(得分:1)
我想我会为可能正在寻找类似事物的人发布另一个答案。
在我们的构建工作中,我们有一些情况,我们希望构建继续,但标记为不稳定。对于我们来说,它与版本号有关。
所以,我想在构建上设置一个条件,并在满足条件时将构建设置为unstable。
我使用条件步骤(单个)选项作为构建步骤。
然后我使用执行系统Groovy脚本作为满足该条件时运行的构建步骤。
我使用 Groovy命令并将脚本设置为以下
import hudson.model.*
def build = Thread.currentThread().executable
build.@result = hudson.model.Result.UNSTABLE
return
这看起来效果很好。
我在这里偶然发现了解决方案
答案 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
优点:
对于此解决方案,您的环境必须满足以下条件:
答案 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
}