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}}
画像を挿入できませんが、品質ゲートは合格であり、分析タスクは成功しています。
さらに情報を含める必要がある場合はお知らせください。ありがとうございました
問題は、Jenkinsが自己署名証明書でhttpsを使用していることである可能性があります。次に、解決策は次のとおりです。
SonarQubeのトラストストアを生成します。
keytool -import -trustcacerts -alias jenkins-Host-name -file cert.crt -keystore sonarqube.jks
キーストアパスワード:パスワード
Cert.crt-はjenkinsのsslに使用される証明書ですが、jenkins-Host-name-はDockerネットワーク(Webhookで使用される)内のjenkinsのホスト名です。
SonarQubeDockerfileにトラストストアを追加します。
FROM sonarqube
COPY sonarqube.jks /var/sonar_cert/
COPY sonar.properties /opt/sonarqube/conf/sonar.properties
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
この問題を解決するために行ったことの簡単な例を次に示します。
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
}
}
}
@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
}
}
}
}
}
}
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'
私は同様の問題に直面しましたが、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を使用すると、私の場合の問題が解決します。
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;
}
}
}
}
}