Как получить количество неудачных сборок по причине с помощью Jenkins

#jenkins #jenkins-plugins

#дженкинс #jenkins-плагины

Вопрос:

У меня установлен плагин Build Failure Analyzer в моем экземпляре Jenkins, и у меня есть несколько различных сбоев, введенных в плагин. Кто-нибудь знает, возможно ли получить общее количество сбоев по всем заданиям, имеющим одну и ту же причину?

Например, я иногда получаю сбои «ChannelClosedException», если узел сборки неожиданно отключается во время сборки или тестирования, и я хотел бы определить, как часто это происходит во всех моих заданиях. Есть ли какой-нибудь способ агрегировать это значение? Я полагаю, это можно было бы сделать с помощью groovy, если вы можете перебирать каждую сборку для каждого задания и собирать причину сбоя сборки, если таковая обнаружена.

Кто-нибудь еще делал что-то подобное раньше?

Ответ №1:

Не точный ответ… но должна быть возможность изменять, чтобы получить то, что вы ищете:

 Jenkins.instance.getAllItems(Job).each{

      def jobBuilds=it.getBuilds()

        //for each job get the things (you can limit at your convenience)
        jobBuilds.each { build ->
          def runningSince = groovy.time.TimeCategory.minus( new Date(), build.getTime() )
          def currentStatus = build.buildStatusSummary.message
          def cause = build.getCauses()[0] //we keep the first cause
          def user = cause instanceof Cause.UserIdCause? cause.getUserId():""
          println "Build: ${build} | Since: ${runningSince} | Status: ${currentStatus} | Cause: ${cause} | User: ${user}"
          def parameters = build.getAction(ParametersAction)?.parameters
          parameters.each {
            println "Type: ${it.class} Name: ${it.name}, Value: ${it.dump()}" 

            }
        }
    }
  

Ответ №2:

Используя некоторые google-fu и некоторую информацию из VinDev, я придумал это решение:

 // get all jobs in Jenkins
Jenkins.instance.getAllItems(Job).each {
    // get all builds for each job
    def jobBuilds=it.getBuilds()
    //for each build, get the name and status   and failure messages
    jobBuilds.each { build ->
      // get the build status
      def currentStatus = build.buildStatusSummary.message
      // we only care about the broken builds because we want failure messages
      if (currentStatus.contains("broken")) {
        println "Build: ${build} | Status: ${currentStatus}"
        def BFA = build.actions.find{ it instanceof com.sonyericsson.jenkins.plugins.bfa.model.FailureCauseBuildAction };
          if (BFA != null) {
            for (failureCause in BFA.getFoundFailureCauses()) {
              println("name: "   failureCause.getName()   ", description: "   failureCause.getDescription())
              }
          }
      }
    }
  }