2016-11-09 3 views
3

В моей трубе Jenkins мне нужно отреагировать на качественные ворота SonarQube. Есть ли более простой способ достичь этого, но, глядя в журнал Sonar-Scanner для страницы результатов (например, https://mysonarserver/sonar/api/ce/task?id=xxxx) и проанализировать результаты JSON оттуда?Как реагировать на качественные ворота SonarQube в трубопроводе Jenkins

Я использую Дженкинс 2,30 и SonarQube 5.3

Заранее спасибо

ответ

5

На основании ответа Винсента, и с помощью Pipeline utility steps, вот моя обновленная версия, которая работала для меня (с помощью файла отчета sonarscanner):

withSonarQubeEnv('SONAR 6.4') { 
        sh "${scannerHome}/bin/sonar-scanner" 
        sh "cat .scannerwork/report-task.txt" 
        def props = readProperties file: '.scannerwork/report-task.txt' 
        echo "properties=${props}" 
        def sonarServerUrl=props['serverUrl'] 
        def ceTaskUrl= props['ceTaskUrl'] 
        def ceTask 
        timeout(time: 1, unit: 'MINUTES') { 
         waitUntil { 
          def response = httpRequest ceTaskUrl 
          ceTask = readJSON text: response.content 
          echo ceTask.toString() 
          return "SUCCESS".equals(ceTask["task"]["status"]) 
         } 
        } 
        def response2 = httpRequest url : sonarServerUrl + "/api/qualitygates/project_status?analysisId=" + ceTask["task"]["analysisId"], authentication: 'jenkins_scanner' 
        def qualitygate = readJSON text: response2.content 
        echo qualitygate.toString() 
        if ("ERROR".equals(qualitygate["projectStatus"]["status"])) { 
         error "Quality Gate failure" 
        } 
       } 

Пожалуйста, обратите внимание на использование Дженкинс учетных данных (аутентификации: «jenkins_scanner») в получить качественные ворота в Sonar, которые будут отправлены.

+1

Привет @tibo, Не могли бы вы сообщить мне, как вы прошли аутентификацию в sonarqube с помощью «jenkins_scanner»? –

+1

Я получил его, он исходит из http-запроса плагина. https://stackoverflow.com/questions/41571090/basic-auth-with-jenkins-http-request-plugin Большое спасибо, этот ответ помог мне внедрить уведомления о сбоях с качеством ворот. –

+0

Работы чудес. Спасибо, что поделились. –

1

я использовал «.sonar/отчет-task.txt», чтобы получить ceTaskUrl - Тогда я использовал Pipeline Shared Libraries и написал свою собственную функцию трубопроводов для получить качественные ворота.

http://mySonarQube.com:9001/api/ce/task?id= "ceTaskUrl"

Анализировать "task.analysisId"

Разбор качества-ворота от http://mySonarQube.com:9001/api/qualitygates/project_status?analysisId= "task.analysisId"

+0

У вас есть источник вашей библиотеки, доступный где-то в Github? Я новичок в Groovy и хотел бы узнать из примера. Спасибо. –

+0

Я только что создал репо для этой функции: https://github.com/chforster/JenkinsPipelineLibrary –

3

сканирования первой:

node("sonar") { 
     deleteDir() 
     unstash 'sources' 
     def scannerHome = tool 'sonar-scanner'; 
     withSonarQubeEnv('sonarqube-rec') { 
      withEnv(["JAVA_HOME=${ tool 'JDK_8.0' }", "PATH+MAVEN=${tool 'M325'}/bin:${env.JAVA_HOME}/bin"]) {   
      // requires SonarQube Scanner for Maven 3.2+ 
      sh ''' 
      mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar 
      echo "SONAR_AUTH_TOKEN=$SONAR_AUTH_TOKEN" >> target/sonar/report-task.txt 
      ''' 
      stash includes: "target/sonar/report-task.txt", name: 'sonar-report-task' 
      } 
     } 
    } 

затем проверьте качество:

stage("Quality Gate"){ 
    node("sonar") { 
     deleteDir() 
     unstash 'sonar-report-task' 
     def props = utils.getProperties("target/sonar/report-task.txt") 
     echo "properties=${props}" 
     def sonarServerUrl=props.getProperty('serverUrl') 
     def ceTaskUrl= props.getProperty('ceTaskUrl') 
     def ceTask 
     def URL url = new URL(ceTaskUrl) 
      timeout(time: 1, unit: 'MINUTES') { 
      waitUntil { 
       ceTask = utils.jsonParse(url) 
       echo ceTask.toString() 
       return "SUCCESS".equals(ceTask["task"]["status"]) 
      } 
      } 
      url = new URL(sonarServerUrl + "/api/qualitygates/project_status?analysisId=" + ceTask["task"]["analysisId"]) 
      def qualitygate = utils.jsonParse(url) 
      echo qualitygate.toString() 
      if ("ERROR".equals(qualitygate["projectStatus"]["status"])) { 
      error "Quality Gate failure" 
      } 
    } 
}