GitLabのマージリクエストをSonarQube Scannerで静的コード解析し結果をマージリクエストのコメントとして投稿するためのメモ。
マージリクエストの作成から解析結果のコメント投稿までの動作概要は以下。
- 開発者がGitLab上でマージリクエストを作成
- GitLabのWebhookでJenkinsの自動レビュージョブを起動
- 自動レビュージョブがSonarQubeサーバから必要な情報を取得する
- 自動レビュージョブが静的コード解析を実施
- 自動レビュージョブが解析結果をGitLabへ投稿
設定作業の流れ
- Jenkinsの設定
- GitLab Plugのインストール
- 自動レビュージョブの作成
- GitLabの設定
- ユーザの作成とグループへの追加
- Webhookの追加
- SonarQubeの設定
- GitLab Pluginのイントールと設定
Jenkins プラグインの追加
GitLab側からのWebhookをトリガーにジョブを起動できるよう GitLabプラグインをインストールする。
Jenkinsの管理 プラグインの管理 利用可能 から GitLan Plugin
をインストール。
インストール後、システム設定 から GitLabのURLや認証情報が設定できるようになるが特に設定は不要。今回作成する自動レビュージョブはSonarQube側のGitLab設定を参照するため。
Jenkins ジョブの作成
GitLabマージリクエスト作成時のWebhookをトリガーに起動する自動レビュージョブを作成する。
新規ジョブ作成 から フリースタイル・プロジェクトのビルド を選んでジョブを作成。
ソースコード管理
ソースコード管理に git
を選択
リポジトリ に以下を設定。
- リポジトリURL
${gitlabSourceRepoURL}
- Credentials
- CIユーザ用のクレデンシャルを指定。
ビルドするブランチ に以下を設定。
- ブランチ指定子
*/${gitlabSourceBranch}
このジョブを複数のGitLabプロジェクトから使用する場合は、 追加処理 に以下を設定。
- Check out to a sub-directory
${gitlabSourceRepoName}
ビルド・トリガ
Build when a change is pushed to GitLab を選択。
GitLab CI Service URL:
以降のURLはWebhookでこのジョブを起動するためのエンドポイント。
GitLab側の設定で必要になるのでメモしておく。
- Push Events
- なし
- Opened Merge Request Events
- ✓
- Accepted Merge Request Events
- なし
- Closed Merge Request Events
Never
- Comments
- なし
- Comment (regex) for triggering a build
Jenkins please retry a build
さらに 高度な設定 から
- Ignore WIP Merge Requests
- なし
WIPなマージリクエストも対象にする。 - Secret token
- Generate でトークンを生成。
ジョブをWebhook経由で実行する際に必要となる。GitLab側の設定で必要となるのでメモしておく。
ビルド
今回はSonarQube ScannerをJenkinsのプラグインではなくGradleのプラグインとして動かすため、 ビルド手順の追加 シェルの実行 から gradleコマンド経由でSonarQube Scannerを実行する。
# Check out to a sub-directoryを指定した場合はcdする
cd ${gitlabSourceRepoName}
# マージ元、先の差分コミットID一覧をカンマ区切りで取得
COMMIT_SHA=$(git log --pretty='format:%H' origin/${gitlabTargetBranch}..origin/${gitlabSourceBranch} | tr '\n' ',')
# gradle経由でSonarQube Runnerを実行
./gradlew --stacktrace sonarqube \
-Dsonar.analysis.mode=preview \
-Dsonar.gitlab.commit_sha=${COMMIT_SHA} \
-Dsonar.gitlab.ref_name=${gitlabSourceBranch} \
-Dsonar.gitlab.project_id=${gitlabSourceNamespace}/${gitlabSourceRepoName} \
-Dunique_issue_per_inline=true \
-Dsonar.gitlab.disable_global_comment=true \
-Dsonar.host.url=http://<SonarQubeのホスト>:9000
好みの問題であるがsonar.gitlab.disable_global_comment=true
でglobal commentを無効化、
コミットの変更行対してのみインラインでレポートするようにした。
またGitLabプラグインで利用できる環境変数一覧については以下を参照。 https://github.com/jenkinsci/gitlab-plugin#parameterized-builds
GitLabの設定
ユーザの作成
自動レビュージョブが解析結果のコメントつける際に利用するレビュー用ユーザを作成。
既存のCI用ユーザを利用しても良いが今回は sonar
というユーザを作成する。
作成したユーザでログインし Settings Access Tokens から Sonarが利用するアクセストークンを払い出す。
- Name
- sonar
- Expires at
- なし
- Scopes (api)
- ✓
- Scope (read_user)
- なし
Create Personal Access Token で作成。
払い出したトークンをメモしておく。
グループのメンバーに追加
作成したレビューユーザ sonar
を対象グループに Developer
ロールで追加する。
Webhookの設定
対象プロジェクトの設定から Integrations で新規Webhookを登録。
- URL
- Jenkins自動レビュージョブのWebhook URL
- Secret Token
- Jenkins自動レビュージョブのSecret Token
- Trigger
Merge Request Events
Add Webhook で登録。
SonarQubeの設定
SonarQube Scannerの解析結果をGitLabへ投稿できるようsonar-gitlab-pluginをインストール、設定する。
インストール
adminユーザでログインし、
Administration System Available から GitLab
で検索。
GitLab
を Install
設定
Administration Configuration GitLab から設定。
- GitLab url
- GitLabのURL
- GitLab User Token
- GitLab側で作成したレビュー用ユーザのパーソナルアクセストークン
Save Repoting Settigs で保存。
以上で設定は完了。
マージリクエストを作成すると自動レビュージョブが動き、指摘箇所はマージリクエストのコメントに投稿されるようになる。