web-dev-qa-db-ja.com

Sonarqube品質ゲートがWebhookをJenkinsに送信しない

Jenkinsをsonarqubeスキャナーで動作するように構成します。スキャンは正常に機能しています。 jenkinsパイプラインは機能しており、jenkinsログに問題はありません。

SonarQubeスキャナー3.0.3.778Jenkins:2.70 Jenkinsプラグイン用SonarQubeスキャナー: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}"
            }
        }
    }

私の問題はQualityGateから来ています。 POST jsonペイロードをjenkinsに送信します。jenkinsログ内にjsonエントリが表示されません。しかし、jenkinsとsonarqubeサーバー間の接続が機能していることはわかっています。 POST sonarqubeVMからのcurlを使用します。

ここにjenkinsジョブの出力があります:

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

これがjenkinsパイプラインに到達しないペイロードです: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}}

画像を挿入できませんが、品質ゲートは合格であり、分析タスクは成功しています。

さらに情報を含める必要がある場合はお知らせください。ありがとうございました

5
Marc

問題は、Jenkinsが自己署名証明書でhttpsを使用していることである可能性があります。次に、解決策は次のとおりです。

  1. SonarQubeのトラストストアを生成します。

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

    キーストアパスワード:パスワード

    Cert.crt-はjenkinsのsslに使用される証明書ですが、jenkins-Host-name-はDockerネットワーク(Webhookで使用される)内のjenkinsのホスト名です。

  2. SonarQubeDockerfileにトラストストアを追加します。

    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
    

次に、Webhook URLで提供されるJenkinsの正しいユーザーとパスワードがあれば、すべてが機能するはずです。

試した:Jenkins 2.107.2、SonarQube 7.1

3
heroin

この問題を解決するために行ったことの簡単な例を次に示します。

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
        }
    }
}
1
Katone Vi

@KatoneViの答えがとてもうまくいったことに驚いた。彼らの回答に基づいて、成功時にクイック出口を追加し、元の要求に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
              }
            }
          }
        }
      }
    }
1
Typhlosaurus

Stage( 'SonarQube analysis')とstage( "Quality Gate")の間にsh'sleep 10 'を追加すると、問題が修正されます。今ジェンキンスの仕事は受け取ります

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'
0
Marc

私は同様の問題に直面しましたが、Sonarサーバーの高品質のGateバックエンドアクティビティは分析を完了するのに20秒もかかりませんが、jenkinsジョブのsonar-webhookからの高品質のGateの失敗/成功の応答には時間がかかり、スタックします。

 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 /

または http:// locahlhost:port/sonarqube-webhook / のIPの代わりにlocalhostを使用すると、私の場合の問題が解決します。

0
VishyTheLegend

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;
                    }
                }
            }
        }
    }
0
user1722245