Качественные ворота Sonarqube не посылают Дженкинсу

Я настраиваю Jenkins для работы со сканером sonarqube. Сканирование работает нормально. Трубопровод Дженкинса работает, и у меня нет никаких проблем в журнале Дженкинса.

SonarQube Scanner 3.0.3.778 Jenkins: 2.70 Плагин SonarQube Scanner для Jenkins: 2.6.1

Я использую этот код:

    stage('SonarQube analysis') {
        sh 'sed -ie "s|_PROJECT_|${PROJECT_CODE}|g" $WORKSPACE/_pipeline/sonar-project.properties'
        // requires SonarQube Scanner 3.0+
        def scannerHome = '/opt/sonar/bin/sonar-scanner';
        withSonarQubeEnv('mscodeanalysis') {
            sh "${scannerHome}/bin/sonar-scanner -Dproject.settings=$WORKSPACE/_pipeline/sonar-project.properties"
        }
    }
    }
    }
}
    }
    // No need to occupy a node
    stage("Quality Gate"){
        timeout(time: 15, unit: 'MINUTES') { // Just in case something goes wrong, pipeline will be killed after a timeout
        def qg = waitForQualityGate() // Reuse taskId previously collected by withSonarQubeEnv
            if (qg.status != 'OK') {
                error "Pipeline aborted due to quality gate failure: ${qg.status}"
            }
        }
    }

Моя проблема связана с качеством ворот. Это никогда НЕ ПОСТАВЛЯЕТ Json полезную нагрузку. Я не вижу записи json внутри журнала Дженкинса. Но я знаю, что соединение между jenkins и сервером sonarqube работает, потому что я смог отправить POST с помощью curl с виртуальной машины sonarqube.

Вот вывод работы Дженкинса:

Timeout set to expire in 15 min
[Pipeline] {
[Pipeline] waitForQualityGate
Checking status of SonarQube task 'AV3irVJXpvBxXXNJYZkd' on server 'mscodeanalysis'
SonarQube task 'AV3irVJXpvBxXXNJYZkd' status is 'PENDING'
Cancelling nested steps due to timeout

Вот мои полезные данные, которые никогда не доходят до конвейера Дженкинса: url: http://sonar-server:9000/api/ce/task?id=AV3irVJXpvBxXXNJYZkd

{"task":{"organization":"default-organization","id":"AV3irVJXpvBxXXNJYZkd","type":"REPORT","componentId":"AV3hrJeCfL_nrF2072FH","componentKey":"POOL-003","componentName":"POOL-003","componentQualifier":"TRK","analysisId":"AV3irVkZszLEB6PsCK9X","status":"SUCCESS","submittedAt":"2017-08-14T21:36:35+0000","submitterLogin":"jenkins","startedAt":"2017-08-14T21:36:37+0000","executedAt":"2017-08-14T21:36:38+0000","executionTimeMs":650,"logs":false,"hasScannerContext":true}}

Я не могу вставить изображение, но ворота качества - Проход, и задача анализа - успех.

Дайте мне знать, если мне нужно включить больше информации. Спасибо

8 ответов

Проблема может заключаться в том, что Jenkins использует https с самозаверяющим сертификатом. Тогда решение:

  1. Создать склад доверенных сертификатов для SonarQube:

    keytool -import -trustcacerts -alias jenkins-host-name -file cert.crt -keystore sonarqube.jks
    

    пароль хранилища ключей: пароль

    Где cert.crt - это сертификат, используемый для ssl для jenkins, jenkins-host-name - это имя хоста jenkins в сети докеров (используется в webhook)

  2. Добавить склад доверенных сертификатов в файл Dockerfile SonarQube:

    FROM sonarqube
    COPY sonarqube.jks /var/sonar_cert/
    COPY sonar.properties /opt/sonarqube/conf/sonar.properties
    
  3. Обновление sonar.properties

    sonar.ce.javaAdditionalOpts=-Djavax.net.ssl.trustStore=/var/sonar_cert/sonarqube.jks -Djavax.net.ssl.trustStorePassword=password
    

Тогда, если у вас есть правильный пользователь и пароль для Jenkins, указанные в URL-адресе webhook, все должно работать.

Пробовал: Jenkins 2.107.2, SonarQube 7.1

Вот краткий пример того, что мы сделали, чтобы решить эту проблему:

SonarQube случайно зависает в состоянии ожидания. Сказать, чтобы повторить, обновляет его. Мы установили его на 10 секунд в этом примере

maxRetry = 200
forloop (i=0; i<maxRetry; i++){
    try {
        timeout(time: 10, unit: 'SECONDS') {
            waitForQualityGate()
        }
    } catch(Exception e) {
        if (i == maxRetry-1) {
            throw e
        }
    }
}

Если вы настроили SonarQube для использования прокси-сервера HTTP(S), убедитесь, что ваш jenkins либо доступен через прокси-сервер, либо настроен как «хост без прокси-сервера». Это можно сделать с помощью http.nonProxyHostsсобственность или HTTP_NONPROXYHOSTSпеременная окружения. См. также документацию для получения дополнительной информации и синтаксиса.

Был удивлен, обнаружив, что ответ @Katone Vi работал так хорошо. Основываясь на их ответе, мы добавили быстрый выход в случае успеха и использовали DSL для исходного запроса:

    stage('SonarQube') {
      steps {
        withSonarQubeEnv('SonarQube') {
          sh """
            ${scannerHome}/bin/sonar-scanner -Dsonar.projectKey=XXX_${env.STAGE}_lambda
          """
        }

        script {
          Integer waitSeconds = 10
          Integer timeOutMinutes = 10
          Integer maxRetry = (timeOutMinutes * 60) / waitSeconds as Integer
          for (Integer i = 0; i < maxRetry; i++) {
            try {
              timeout(time: waitSeconds, unit: 'SECONDS') {
                def qg = waitForQualityGate()
                if (qg.status != 'OK') {
                  error "Sonar quality gate status: ${qg.status}"
                } else {
                  i = maxRetry
                }
              }
            } catch (Throwable e) {
              if (i == maxRetry - 1) {
                throw e
              }
            }
          }
        }
      }
    }

Я сталкивался с подобной проблемой, в то время как выполнение качественных внутренних операций Gate на сервере Sonar занимает менее 20 секунд для завершения анализа. Но качественное реагирование на ошибку / успех шлюза от sonar-webhook в работе jenkins отнимает много времени и застревает.

 stage('Sonar:QG') {
            steps {
                **sleep(10)  /* Added 10 sec sleep that was suggested in few places*/**
                script{
                    timeout(time: 10, unit: 'MINUTES') {
                        def qg = waitForQualityGate abortPipeline: true
                        if (qg.status != 'OK') {
                            echo "Status: ${qg.status}"
                            error "Pipeline aborted due to quality gate failure: ${qg.status}"
                        }
                    }
                }
            }
        }

По сути, проверьте ниже вещь:- Webhook настроен в сонар или нет:- SonarQube -> Администрирование -> Webhooks http://:/sonarqube-webhook/

или Используйте localhost вместо IP в http://locahlhost:port/sonarqube-webhook/ решает проблему в моем случае.

Если вы используете Jenkinsfile, это обходной путь:

определить учетные данные:

 environment { 
  CRED = credentials('jenkins_user_pass') 
 }

затем используйте:

stage("Quality Gate") {
    steps {
         script {
                while(true){
                    sh "sleep 2"
                    def url="http://jenkinsURL/job/${env.JOB_NAME.replaceAll('/','/job/')}/lastBuild/consoleText";
                    def sonarId = sh script: "wget -qO- --content-on-error --no-proxy --auth-no-challenge --http-user=${CRED_USR} --http-password=${CRED_PSW} '${url}'  | grep 'More about the report processing' | head -n1 ",returnStdout:true
                    sonarId = sonarId.substring(sonarId.indexOf("=")+1)
                    echo "sonarId ${sonarId}"
                    def sonarUrl = "http://jenkinsURL/sonar/api/ce/task?id=${sonarId}"
                    def sonarStatus = sh script: "wget -qO- '${sonarUrl}' --no-proxy --content-on-error | jq -r '.task' | jq -r '.status' ",returnStdout:true
                    echo "Sonar status ... ${sonarStatus}"
                    if(sonarStatus.trim() == "SUCCESS"){
                        echo "BREAK";
                        break;
                    }
                    if(sonarStatus.trim() == "FAILED "){
                        echo "FAILED"
                        currentBuild.result = 'FAILED'
                        break;
                    }
                }
            }
        }
    }

Я принял более простое решение, но оно работает так же

      stage("Quality gate") {
      steps {
        retry(3){
            waitForQualityGate abortPipeline: true
          }

      }
    }

Добавление sh 'sleep 10' между этапом ("Анализ SonarQube") и этапом ("Ворота качества") решает проблему. Теперь работу Дженкинс получают

Checking status of SonarQube task 'AV3rHxhp3io6giaQF_OA' on server 'sonarserver'
SonarQube task 'AV3rHxhp3io6giaQF_OA' status is 'SUCCESS'
SonarQube task 'AV3rHxhp3io6giaQF_OA' completed. Quality gate is 'OK'
Другие вопросы по тегам