Дженкинс удаляет задание, если оно не выполняется

В рамках действия после сборки в jenkins я хочу удалить задание, если оно не удалось с определенным кодом выхода. Логика здесь такая:

  • Моя текущая работа (скрипт perl) запрашивает базу данных MySQL, чтобы узнать, нужно ли ей запускать какое-либо подчиненное задание.
  • Если нет, я выхожу с определенным кодом.
  • Теперь, как часть шага после сборки, я хочу проверить, завершилось ли текущее задание с определенным кодом, а затем удалить и сбросить следующий номер сборки.

Причина в том, что у меня не было неудачных заданий каждые 5 минут (график сборки настроен на каждые 5 минут). Я искал способ сделать это. Итак, пока у меня есть два способа работы через Manage Jenkins -> Script Console. Но тот же код терпит неудачу, когда я добавляю его к текущей работе Дженкинса.

Работа под управлением 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 Job Configure:

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)

и ошибка в журнале Failed говорит:

No such file: /auto/system-dir/idevtest/jenkins/conf/jobs/renum_jenkins_test/builds/30/log

Любые указатели, как я могу избежать этой ошибки, а также определить статус/результат текущей работы?


person iDev    schedule 24.02.2019    source источник


Ответы (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.

person Sers    schedule 24.02.2019
comment
Не могли бы вы немного уточнить? Чтобы изменить статус сборки, мне нужно добавить действие после сборки? - person iDev; 16.03.2019
comment
Кроме того, не уверен, но читал об этом и могу запустить другое задание как часть пост-сборки: запустить параметризованную сборку в других проектах и ​​передать предопределенные параметры, такие как job_name и build_number. Я хотел посмотреть, смогу ли я, используя этот подход, удалить рабочую область и обновить номер следующей сборки? - person iDev; 17.03.2019
comment
@iDev для удаления рабочей области вы можете использовать метод deleteDir() - person Sers; 17.03.2019
comment
@Sers, чтобы я не открывал новый вопрос, могу ли я спросить, будет ли это работать для сборок, которые терпят неудачу до запуска конвейера? Используя декларативный конвейер, я иногда получаю ошибку проверки SCM. Это приводит к сбою сборки, но я бы хотел, чтобы они либо не отображались как неудачные, либо были удалены. Можно ли это сделать с помощью этой техники? - person M1ke; 20.03.2020