Skip to content

Commit

Permalink
Merge pull request sakura-editor#674 from m-tmatma/feature/SonarQube
Browse files Browse the repository at this point in the history
SonarQube (SonarCloud) 対応
  • Loading branch information
m-tmatma committed Apr 29, 2019
2 parents 413d8f6 + 18da532 commit b009ce4
Show file tree
Hide file tree
Showing 16 changed files with 403 additions and 3 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ msbuild-*.log
msbuild-*.log.csv
msbuild-*.log.xlsx
sha256.txt
*.bak
*.pyc
/tests/build
/cppcheck-install.log
Expand All @@ -20,3 +21,6 @@ tags
testData_*.txt
html
doxygen*.log
.sonarqube
build-wrapper-win-x86*
bw-output
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
[![License: Zlib](https://img.shields.io/badge/License-Zlib-lightgrey.svg)](https://opensource.org/licenses/Zlib)
[![CodeFactor](https://www.codefactor.io/repository/github/sakura-editor/sakura/badge)](https://www.codefactor.io/repository/github/sakura-editor/sakura)
[![Build Status](https://dev.azure.com/sakuraeditor/sakura/_apis/build/status/sakura-editor.sakura?branchName=master)](https://dev.azure.com/sakuraeditor/sakura/_build/latest?definitionId=3&branchName=master)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=sakura-editor_sakura&metric=alert_status)](https://sonarcloud.io/dashboard?id=sakura-editor_sakura)

<!-- TOC -->

Expand Down
236 changes: 236 additions & 0 deletions SonarQube.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
# SonarQube

<!-- 以下は Markdownの参照形式によるリンク の定義です。 -->
<!-- 参照 https://hail2u.net/blog/coding/markdown-reference-style-links.html -->

[sonarsource]: https://www.sonarsource.com/ "SonarSource"
[SonarQube]: https://www.sonarsource.com/products/sonarqube/ "SonarQube"
[SonarCloud]: https://sonarcloud.io/about "SonarCloud"
[SonarScanner for MSBuild (SonarScanner.MSBuild.exe)]: https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+MSBuild "SonarScanner for MSBuild (SonarScanner.MSBuild.exe)"
[chocolatey]: https://chocolatey.org/ "chocolatey"
[build-wrapper-win-x86.zip]: https://sonarcloud.io/static/cpp/build-wrapper-win-x86.zip "https://sonarcloud.io/static/cpp/build-wrapper-win-x86.zip"
[Git for Windows]: https://gitforwindows.org/ "Git for Windows"
[curl]: https://curl.haxx.se/download.html "curl"
[build-sln.bat]: build-sln.bat "build-sln.bat"
[build-sonar-qube-env.bat]: build-sonar-qube-env.bat "build-sonar-qube-env.bat"
[build-sonar-qube-start.bat]: build-sonar-qube-start.bat "build-sonar-qube-start.bat"
[build-sonar-qube-finish.bat]: build-sonar-qube-finish.bat "build-sonar-qube-finish.bat"
[azure pipelines の sakura editor のプロジェクト]: https://dev.azure.com/sakuraeditor/sakura "https://dev.azure.com/sakuraeditor/sakura"
[Azure Pipelines の Secret Variable]: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch&viewFallbackFrom=vsts#secret-variables
[Azure Pipelines の variables]: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch
[Azure Pipelines の timeoutInMinutes]: https://docs.microsoft.com/ja-jp/azure/devops/pipelines/process/phases?view=azure-devops&tabs=yaml#timeouts
[Azure Pipelines の Predefined build variables]: https://docs.microsoft.com/ja-jp/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml
[Azure Pipelines の conditon]: https://docs.microsoft.com/ja-jp/azure/devops/pipelines/process/conditions?view=azure-devops&viewFallbackFrom=vsts&tabs=yaml
[appveyor の Secure Variables]: https://www.appveyor.com/docs/build-configuration/#secure-variables


<!-- Markdownの参照形式によるリンク の定義終わり -->

## SonarQube および SonarCloud

### SonarQube

[SonarQube][SonarQube]
[sonarsource][sonarsource] が提供する静的解析サービス。


### SonarCloud

[SonarCloud][SonarCloud][SonarQube][SonarQube] のクラウド版。
いつものごとく、オープンソースに対してはタダです。

サクラエディタのソースコード解析には 1時間半ほどかかるので、並列実行が可能な Azure Pipelines で夜間の定期タスクのみで解析を実施します。
(Appveyor では実施しない。定期タスク以外でも実施しない。)

## SonarQube のローカルでの使用方法

### SonarQube のアカウント設定

https://sonarcloud.io/sessions/new にアクセスして GitHub アカウントでログインします。

### プロジェクトの作成

https://sonarcloud.io/projects/create にアクセスしてプロジェクトを作成します。

- Organization 名をメモしておきます。
- Project 名をメモしておきます。
- Access Token をメモしておきます。
**この情報はパスワードと同じ意味を持つので漏れないように注意します。**

### ローカルで実行する場合の環境設定 (事前準備)

1. https://www.java.com/ja/download/ から JAVA のランタイムをダウンロードしてインストールする
1. `JAVA_HOME` の環境変数を設定する


`set JAVA_HOME=C:\Program Files (x86)\Java\jre1.8.0_201`

1. https://chocolatey.org/install#install-with-cmdexe を参考に chocolatey をインストールする。

### 解析手順の流れ (一般論)

1. [chocolatey][SonarScanner for MSBuild (SonarScanner.MSBuild.exe)][SonarScanner for MSBuild (SonarScanner.MSBuild.exe)] をダウンロードする
1. curl で [build-wrapper-win-x86.zip] をダウンロードして解凍する
1. `C:\ProgramData\chocolatey\bin\SonarScanner.MSBuild.exe begin` を呼ぶ。
1. `build-wrapper-win-x86.zip` の中の `build-wrapper-win-x86-64.exe` を使って msbuild.exe を起動する。
1. `C:\ProgramData\chocolatey\bin\SonarScanner.MSBuild.exe end` を呼ぶ。

メモ: [curl][Git for Windows] をインストールすると `C:\Program Files\Git\mingw64\bin\curl.exe` にインストールされて、自動的にパスも通されます。

### 解析手順の流れ (サクラエディタ)

1. [chocolatey][SonarScanner for MSBuild (SonarScanner.MSBuild.exe)] をダウンロードする
1. `choco install "msbuild-sonarqube-runner" -y`
1. [build-sln.bat] でソリューションをビルドする
1. [build-sonar-qube-start.bat] で SonarQube の準備を行う。
1. [build-sonar-qube-env.bat] を呼び出し必要な環境変数の設定を行う。
1. curl で [build-wrapper-win-x86.zip] をダウンロードして解凍する。
1. `C:\ProgramData\chocolatey\bin\SonarScanner.MSBuild.exe begin` を呼んで SonarQube の解析を開始する。
1. [build-wrapper-win-x86.zip] の中の `build-wrapper-win-x86-64.exe` 経由で `msbuild.exe` を起動する。
1. [build-sonar-qube-finish.bat] で SonarQube の解析結果を [SonarCloud] のサーバーに結果を送る。
1. `C:\ProgramData\chocolatey\bin\SonarScanner.MSBuild.exe end` を呼ぶ。

## サクラエディタを SonarQube でビルドする手順

`SONAR_QUBE_TOKEN` の値は SonarQube のサイトにログインして確認できます。

`SONAR_QUBE_ORG``SONAR_QUBE_PROJECT``SONAR_QUBE_TOKEN` の値はそれぞれ自分が作成したものに読み替えてください。

```
set SONAR_QUBE=Yes
set SONAR_QUBE_ORG=sakura-editor
set SONAR_QUBE_PROJECT=sakura-editor_sakura
set SONAR_QUBE_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
build-sln.bat Win32 Release
```

## SonarQube に関する情報

### SonarQube の使用方法に関するサイト

- https://www.appveyor.com/blog/2016/12/23/sonarqube/
- https://docs.sonarqube.org/7.4/analysis/analysis-parameters/

### SonarScanner の使用方法

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+MSBuild#AnalyzingwithSonarQubeScannerforMSBuild-Usage

## CI でのビルド

### azure pipelines の設定

#### 環境変数

1. [azure pipelines の sakura editor のプロジェクト] にアクセスします。
2. `Pipelines` を選ぶ
3. `Edit` ボタンを押す
4. `Run` の右隣りのアイコンをクリックする
5. `Variables` のボタンを押す
6. `Pipelines Variables``Add` を押す
7. `SONAR_QUBE_ORG``SONAR_QUBE_PROJECT` を追加してそれぞれ値を設定する
8. `SONAR_QUBE_TOKEN` を追加して値を設定し、 鍵のアイコンをクリックする (重要)
9. `Save & Queue``Save` を選ぶ

![環境変数の設定画面](azure-SonarQube.png)

#### スケジュール設定

1. [azure pipelines の sakura editor のプロジェクト] にアクセスします。
2. `Pipelines` を選ぶ
3. `Edit` ボタンを押す
4. `Run` の右隣りのアイコンをクリックする
5. `Triggers` のボタンを押す
6. `Scheduled``Add` をクリックする
![スケジュール設定1](azure-SonarQube-schedule1.png)
7. 実行させたいスケジュールを設定して、実行させる対象ブランチを設定する
![スケジュール設定2](azure-SonarQube-schedule2.png)
8. 設定を保存する
![スケジュール設定3](azure-SonarQube-schedule3.png)

#### azure-pipelines.yml の設定

##### Job の設定

```
- job: SonarQube
timeoutInMinutes: 120
variables:
SONAR_QUBE: Yes
condition:
eq(variables['Build.Reason'], 'Schedule')
```

1. SonarQube の実行には時間がかかるので [Azure Pipelines の timeoutInMinutes] の設定を行いタイムアウト時間を延ばす
1. [Azure Pipelines の variables] の設定で `SONAR_QUBE` の環境変数を定義して、[build-sln.bat][SonarQube] を有効にしたビルドであると伝える
1. [Azure Pipelines の Predefined build variables] のうち `Build.Reason` を参照して、どういうトリガーでビルドが行われたかを yaml の中からあるいはビルド用のバッチファイル等から参照することができる。
- `Build.Reason` を yaml の中で参照するとき `variables['Build.Reason']`
- `Build.Reason` を バッチファイル の中で参照するとき `BUILD_REASON`
1. [Azure Pipelines の conditon] でビルドトリガーの条件を設定する。条件指定では and や or の条件を指定することができる。

`Build.Reason` としてどういう値を設定できるかは [Azure Pipelines の variables] の `Build.Reason` に説明がある。


例: ビルドトリガーが定期実行のとき

```
condition:
eq(variables['Build.Reason'], 'Schedule')
```


例: ビルドトリガーが定期実行でも PullRequest でもないとき

```
condition:
and
(
ne(variables['Build.Reason'], 'Schedule'),
ne(variables['Build.Reason'], 'PullRequest')
)
```

##### Steps の設定


```
steps:
- script: choco install "msbuild-sonarqube-runner" -y
displayName: install msbuild-sonarqube-runner
# Build solution with SonarQube
- script: build-sln.bat $(BuildPlatform) $(Configuration)
displayName: Build solution with SonarQube
env:
SONAR_QUBE_ORG: $(SONAR_QUBE_ORG)
SONAR_QUBE_PROJECT: $(SONAR_QUBE_PROJECT)
SONAR_QUBE_TOKEN: $(SONAR_QUBE_TOKEN)
```

1. `choco install "msbuild-sonarqube-runner" -y` を実行して `SonarScanner.MSBuild.exe` をインストールする
2. `script``build-sln.bat` を実行する
3. `env``環境変数` のところで設定した環境変数が有効になるように設定する。

[Azure Pipelines の Secret Variable] の項目を参照

### Appveyor の設定

**appveyor で実施する場合、タイムアウトになってビルドに成功しないので現状で使用していない **

Appveyor のプロジェクトで Settings の Environment にアクセスして `Add variable` を押して環境変数を追加する。

|変数名|意味|注意|
|--|--|--|
|SONAR_QUBE_ORG|Sonar Qube のOrganization 識別子||
|SONAR_QUBE_PROJECT|Sonar Qube のプロジェクト識別子||
|SONAR_QUBE_TOKEN|Sonar Qube のアクセスキー (API キー)|追加するとき右の鍵マークを押して秘密の環境変数に設定する|

![環境変数の設定画面](appveyor-SonarQube.png)


#### Secure the GitHub Authentication token

SonarQube で使用するアクセストークンを暗号化するために使用する

[appveyor の Secure Variables]
Binary file added appveyor-SonarQube.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added azure-SonarQube-schedule1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added azure-SonarQube-schedule2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added azure-SonarQube-schedule3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added azure-SonarQube.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 3 additions & 1 deletion azure-pipelines.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,15 @@ https://azure.microsoft.com/ja-jp/services/devops/pipelines/ にアクセスし
- [azure-pipelines.yml](azure-pipelines.yml) 最上位の設定ファイル
- [ci/azure-pipelines/template.job.build-unittest.yml](ci/azure-pipelines/template.job.build-unittest.yml) sakura editor 本体のビルド、HTML ヘルプのビルド、インストーラのビルド、単体テストのビルド、実行
- [ci/azure-pipelines/template.steps.install-python-modules.yml](ci/azure-pipelines/template.steps.install-python-modules.yml) 必要な python モジュールのインストール
- [ci/azure-pipelines/template.job.SonarQube.yml](ci/azure-pipelines/template.job.SonarQube.yml) SonarQube での解析
- [ci/azure-pipelines/template.job.checkEncoding.yml](ci/azure-pipelines/template.job.checkEncoding.yml) 文字コードの確認
- [ci/azure-pipelines/template.job.cppcheck.yml](ci/azure-pipelines/template.job.cppcheck.yml) cppcheck の実行
- [ci/azure-pipelines/template.job.doxygen.yml](ci/azure-pipelines/template.job.doxygen.yml) doxygen の実行
- [ci/azure-pipelines/template.steps.install-python-modules.yml](ci/azure-pipelines/template.steps.install-python-modules.yml) 必要な python モジュールのインストール

## Azure Pipelines の template ファイルの命名規則

| JOB 名 | 説明 | job を定義する template |
| JOB 名 | 説明 | ドキュメント |
----|----|----
|template.job.***.yml | job を定義する template | [Job reuse](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops#job-reuse) |
|template.steps.***.yml | steps を定義する template | [Step re-use](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops#step-re-use) |
Expand All @@ -70,6 +71,7 @@ https://azure.microsoft.com/ja-jp/services/devops/pipelines/ にアクセスし
| JOB 名 | 説明 | job を定義する template |
----|----|----
|VS2017 | サクラエディタのビルドを行う | [ci/azure-pipelines/template.job.build-unittest.yml](ci/azure-pipelines/template.job.build-unittest.yml) |
|SonarQube | SonarQube での解析を行う | [ci/azure-pipelines/template.job.SonarQube.yml](ci/azure-pipelines/template.job.SonarQube.yml) |
|cppcheck | cppcheck を行う | [ci/azure-pipelines/template.job.cppcheck.yml](ci/azure-pipelines/template.job.cppcheck.yml) |
|doxygen | doxygen を行う | [ci/azure-pipelines/template.job.doxygen.yml](ci/azure-pipelines/template.job.doxygen.yml) |
|checkEncoding | 文字コードのチェックを行う | [ci/azure-pipelines/template.job.checkEncoding.yml](ci/azure-pipelines/template.job.checkEncoding.yml) |
Expand Down
7 changes: 7 additions & 0 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,13 @@ jobs:
vmImage: 'VS2017-Win2016'
displayName: VS2017

# SonarQube で解析を行う JOB
- template: ci/azure-pipelines/template.job.SonarQube.yml
parameters:
name: SonarQube
vmImage: 'VS2017-Win2016'
displayName: SonarQube

# Cppcheck を行う JOB
- template: ci/azure-pipelines/template.job.cppcheck.yml
parameters:
Expand Down
21 changes: 19 additions & 2 deletions build-sln.bat
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,30 @@ set LOG_FILE=msbuild-%platform%-%configuration%.log
@rem https://msdn.microsoft.com/ja-jp/library/ms171470.aspx
set LOG_OPTION=/flp:logfile=%LOG_FILE%

@echo "%CMD_MSBUILD%" %SLN_FILE% /p:Platform=%platform% /p:Configuration=%configuration% /t:"Build" %EXTRA_CMD% %LOG_OPTION%
"%CMD_MSBUILD%" %SLN_FILE% /p:Platform=%platform% /p:Configuration=%configuration% /t:"Build" %EXTRA_CMD% %LOG_OPTION%
call %~dp0build-sonar-qube-start.bat
if errorlevel 1 (
echo ERROR build %errorlevel%
exit /b 1
)

if "%SONAR_QUBE_TOKEN%" == "" (
@echo "%CMD_MSBUILD%" %SLN_FILE% /p:Platform=%platform% /p:Configuration=%configuration% /t:"Build" %EXTRA_CMD% %LOG_OPTION%
"%CMD_MSBUILD%" %SLN_FILE% /p:Platform=%platform% /p:Configuration=%configuration% /t:"Build" %EXTRA_CMD% %LOG_OPTION%
) else (
@echo "%BUILDWRAPPER_EXE%" --out-dir %~dp0bw-output "%CMD_MSBUILD%" %SLN_FILE% /p:Platform=%platform% /p:Configuration=%configuration% /t:"Rebuild" %LOG_OPTION%
"%BUILDWRAPPER_EXE%" --out-dir %~dp0bw-output "%CMD_MSBUILD%" %SLN_FILE% /p:Platform=%platform% /p:Configuration=%configuration% /t:"Rebuild" %LOG_OPTION%
)
if errorlevel 1 (
echo ERROR in msbuild.exe errorlevel %errorlevel%
exit /b 1
)

call %~dp0build-sonar-qube-finish.bat
if errorlevel 1 (
echo ERROR build %errorlevel%
exit /b 1
)

@echo call parse-buildlog.bat %LOG_FILE%
call parse-buildlog.bat %LOG_FILE%
if errorlevel 1 (
Expand Down
23 changes: 23 additions & 0 deletions build-sonar-qube-env.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
@rem to ensure hide variable SONAR_QUBE_TOKEN
@echo off
if "%SONAR_QUBE_TOKEN%" == "" (
@echo SONAR_QUBE_TOKEN is not defined. Abort without building.
exit /b 0
)

if "%SONAR_QUBE_ORG%" == "" (
@echo SONAR_QUBE_ORG is not defined. Abort without building.
exit /b 0
)

if "%SONAR_QUBE_PROJECT%" == "" (
@echo SONAR_QUBE_PROJECT is not defined. Abort without building.
exit /b 0
)

set URL_BUILDWRAPPER_ZIP=https://sonarcloud.io/static/cpp/build-wrapper-win-x86.zip
set BUILDWRAPPER_ZIP=.\build-wrapper-win-x86.zip
set BUILDWRAPPER_DIR=build-wrapper-win-x86
set BUILDWRAPPER_EXE=%BUILDWRAPPER_DIR%\build-wrapper-win-x86\build-wrapper-win-x86-64.exe
set SonarScanner_MSBUILD=C:\ProgramData\chocolatey\bin\SonarScanner.MSBuild.exe
exit /b 0
18 changes: 18 additions & 0 deletions build-sonar-qube-finish.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
call %~dp0build-sonar-qube-env.bat
if "%SonarScanner_MSBUILD%" == "" (
echo do nothing
exit /b 0
)
if "%SONAR_QUBE_TOKEN%" == "" (
echo do nothing
exit /b 0
)

@rem to ensure hide variable SONAR_QUBE_TOKEN
@echo off
"%SonarScanner_MSBUILD%" end /d:sonar.login="%SONAR_QUBE_TOKEN%"
if errorlevel 1 (
echo ERROR in %SonarScanner_MSBUILD% end errorlevel %errorlevel%
exit /b 1
)
exit /b 0
Loading

0 comments on commit b009ce4

Please sign in to comment.