JenkinsでSonarQubeのQualityGateがFailedの場合にビルドを失敗させたい
- 事情によりSonarQubeプラグインを使用することが困難だったため、SonarQubeプラグインを使わずにJenkinsからSonarQubeのQualityGateの状態を取得し、エラーだったらパイプラインをこけさせるように設定してみました。
バージョン
SonarQube
6.7.3
Jenkins
2.71
Jenkinsfile
QGSTATUS_WAITINTERVAL=5
QGSTATUS_TIMEOUT=60
@NonCPS
def jsonParse(text) {
return new groovy.json.JsonSlurperClassic().parseText(text);
}
pipeline {
stages {
stage('チェックアウト') {
steps {
git branch: 'develop', credentialsId: 'aaaaaaaaaaaaaaaaaaaaa', url: 'http://repository/project.git'
}
}
stage('Build/UT/Upload to SonarQube') {
steps {
dir("project-root/") {
// テスト実行
sh "mvn -DskipTests=false -B -Dmaven.test.failure.ignore=true clean install"
// SonarQube解析
sh "mvn -Dmaven.test.skip=true --quiet sonar:sonar -Dsonar.host.url=http://example.com:9000 -Dsonar.branch="develop"
}
script {
// API経由でプロジェクトのQualityGateの状態を取得
sh "curl http://example.com:9000/api/qualitygates/project_status?projectKey=your_project_key -o qualityGate.json"
// 評価対象ファイルが存在するか確認する
def timer = 0
def executeFlag = false
while(true){
sleep("${QGSTATUS_WAITINTERVAL}")
timer = timer + QGSTATUS_WAITINTERVAL
if(fileExists("qualityGate.json")){
executeFlag = true
break
}
if(timer > QGSTATUS_TIMEOUT){
break
}
}
if(executeFlag == true){
// Jsonオブジェクトに変換
def qualitygate = jsonParse(readFile('qualityGate.json'))
echo qualitygate.toString()
// Statusがエラーだったらビルドを失敗させる
if ("ERROR".equals(qualitygate["projectStatus"]["status"])) {
error "Quality Gate failure"
}
// 評価対象ファイルを削除する
sh "rm -f ./qualityGate.json"
}
}
}
post {
always {
// ...
}
}
}
}
post {
success {
// ...
}
unstable {
// ...
}
failure {
// ...
}
}
}
project_keyの取得方法
- 「Administration」→ プルダウンのUpdate Keyで取得可能