LoginSignup
3

More than 3 years have passed since last update.

JenkinsでSonarQubeのQualityGateがFailedの場合にビルドを失敗させたい (プラグインを使わない場合)

Last updated at Posted at 2018-11-21

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で取得可能

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3