如果失败,Jenkins会删除作业

问题描述 投票:0回答:1

作为jenkins中的后期构建操作的一部分,我想删除一个作业,如果它失败了特定的退出代码。这里的逻辑是:

  • 我当前的工作(perl脚本)查询MySQL Db以查看是否需要触发任何下游作业。
  • 如果没有,我退出一个特定的代码。
  • 现在,作为构建后步骤的一部分,我想检查当前作业是否已退出特定代码,然后删除并重置下一个构建号。

原因是每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

任何指针如何解决此错误并确定当前作业的状态/结果?

jenkins groovy jenkins-plugins hudson jenkins-groovy
1个回答
1
投票

简单的方法是在后期构建步骤中更改构建状态:

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错误。

© www.soinside.com 2019 - 2024. All rights reserved.