Ошибка при удалении истории сборки Jenkins - PullRequest
0 голосов
/ 22 января 2020

Здравствуйте, все, что я получаю ниже ошибка при удалении истории сборки заданий jenkins

No build logs found in  calcmanager-pull-request and build history count is : 0
[Pipeline] End of Pipeline
java.lang.NullPointerException: Cannot invoke method getLastBuild() on null object

Ниже приведен сценарий конвейера, который я использую. Задание calcmanager-pull-request содержит историю сборки, но отображается как ноль

pipeline {
    agent { label 'master' }
    stages {
        stage('delete all jobs build history'){

        steps {
            script {
               def buildLogCount=10
Jenkins.instance.getAllItems(Job.class).each { jobitem ->
           def jobName = jobitem.name
           def jobInfo = Jenkins.instance.getItem(jobName)

          if(jobInfo.getLastBuild()){

                def lastBuildNum=jobInfo.getLastBuild().getNumber()

              if(lastBuildNum>=buildLogCount){
                 def deletedBuildNum=lastBuildNum - buildLogCount
                    def deletedNumRange = Fingerprint.RangeSet.fromString("0-${deletedBuildNum}",false);

                    def buildCount=jobInfo.getBuilds(deletedNumRange).size()

                    if(buildCount==0){
                        println "No build logs found in  ${jobName} and build history count is : ${buildCount}"
                    }
                    else{

                        jobInfo.getBuilds(deletedNumRange).each { item ->
                             item.delete()
                        }
                    }
                }
                else{
                  println "No build logs to delete in ${jobName}"
                }
            }
          else{

            println "No build logs found in ${jobName}"
            }
}
            }
            }
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вы получили эту ошибку из-за того, что некоторые задания никогда не выполнялись. У него нет истории.

Таким образом, вы можете создать список с заданиями с историей:

Jenkins.instance.getAllItems(Job.class)
.findAll { it.getLastBuild()?.getNumber() } // if job doesn't not history it will return null == false
.each { job ->
   def lastBuildNum=job.getLastBuild().getNumber()
   /// you code is here
}
0 голосов
/ 22 января 2020

Приведенный выше код работает нормально, если у вас нет заданий с несколькими ветвями конвейера. Если у вас есть многоотраслевые конвейерные задания, используйте приведенный ниже код в файле jenkins.

       properties(
        [
    buildDiscarder(logRotator(daysToKeepStr: '60', numToKeepStr: '7')),
        ]
                  )

...