作为jenkins中的后期构建操作的一部分,我想删除一个作业,如果它失败了特定的退出代码。这里的逻辑是:
原因是每5分钟没有失败的工作(建立时间表设置为每5分钟)我一直在寻找一种方法来做到这一点。所以,我通过Manage Jenkins - > Script Console获得了以下两种方式。但是当我将它添加到当前的jenkins作业时,相同的代码失败了。
在Manage Jenkins - > Script Console下工作
import jenkins.model.Jenkins
import hudson.model.*
def jobName = "renum_jenkins_test"
def job = Jenkins.instance.getItem(jobName)
job.getBuilds().each { it.delete() }
job.nextBuildNumber = 26
job.save()
以及:
import jenkins.model.Jenkins
def jobName = 'renum_jenkins_test'
Jenkins.instance.getItemByFullName(jobName).builds.findAll { it.result
== Result.FAILURE}.each { it.delete() }
在Jenkins作业配置中作为Post Build Step运行时出现错误消息:
java.nio.file.FileSystemException: /auto/system-dir/idevtest/jenkins/conf/jobs/renum_jenkins_test/builds/.30/.nfs000000000d587f2900000049: Device or resource busy
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:243)
at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
at java.nio.file.Files.delete(Files.java:1077)
at sun.reflect.GeneratedMethodAccessor1449.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at hudson.Util.deleteFile(Util.java:247)
at hudson.Util.deleteRecursive(Util.java:310)
并且失败日志中的错误说:
No such file: /auto/system-dir/idevtest/jenkins/conf/jobs/renum_jenkins_test/builds/30/log
任何指针如何解决此错误并确定当前作业的状态/结果?
简单的方法是在后期构建步骤中更改构建状态:
pipeline {
agent any
environment {
skip = "false"
}
stages {
stage('MySQL') {
steps {
script{
echo currentBuild.currentResult
skip = "true"
echo "skip: " + skip
}
}
}
stage('Set Build Status') {
when {
equals expected: "true", actual: skip
}
steps {
script{
echo currentBuild.currentResult
currentBuild.result = 'ABORTED'
currentBuild.displayName = "#${env.BUILD_NUMBER} skipped"
currentBuild.description = "any description"
}
}
}
}
post {
aborted {
deleteDir()
}
}
}
如果要删除,则必须使用buildNumber参数创建另一个作业,该作业将在后构建步骤中由失败的MySQL作业触发并删除最后一个构建。这不会导致Device or resource busy
错误。