【TIPS】Azure DevOps(VSTS)からAzureのPrivate Network上のSonarQube Serverと連携したい

> **Note:** 本記事は、2018年11月時点の内容です。

# 【Q】Azure DevOps(VSTS)から、Private Network上のSonarQube Serverと連携したい。どうやったらできるの？

* `SonarCloud使えばいいじゃん`、`SonarQube ServerにPublic IPでインターネット接続させちゃうよ` という方はこの記事スキップしてください。


# 【A】ビルドサーバをPrivate Agentで立てれば、Private Network上で連携できるよ。

* Agent Poolを`Hosted`のエージェントではなく、`Private`のエージェントを使えばできる。

* 仮想マシン上に、Private Agentをセットアップする必要あり。

* .Net以外のアプリケーションの場合は、docker imagesが提供されているので、さくっと立てることが可能。

> **Docker Hub : microsoft/vsts-agent**

> * https://hub.docker.com/r/microsoft/vsts-agent/

> **Configure a private Java build agent with Azure DevOps Services**

> * https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/v2-windows?view=vsts


* 以降の手順は、.Netアプリケーション向けのPrivate Agentを作成する手順を紹介する。

> **Deploy an agent on Windows**

> * https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/v2-windows?view=vsts

## 作業の手順
1. 仮想マシンの作成 
2. Build Tools for Visual Studioのインストール
3. PATの発行
4. Build Agentのインストール
5. Service connectionsの設定
6. Agent Poolの変更
7. SonarQubeタスクの追加
8. Buildする

### 【手順1】仮想マシンの作成
* Windowsの仮想マシンを作成

### 【手順2】Build Tools for Visual Studioのインストール
* Private Agentの仮想マシンにログイン

* 以下URLの`Tool for Visual Studio` > `Build Tools for Visual Studio 2017`からダウンロード

> **Microsoft : Downloads**

> * https://visualstudio.microsoft.com/downloads/

* インストール手順は、以下URLを参考に。

> **Windows 10 で Build Tools for Visual Studio 2017 のインストール**

> * https://www.kunihikokaneko.com/dblab/toolchain/vc15buildtool.html

### 【手順3】PATの発行
* Azure DevOps(VSTS)にログインして、以下URLを参考にPAT(Personal Access Token)を発行する
    * `Authenticate with a personal access token (PAT)`あたりを参考に。
    * Private Agentを構成する際にこのTokenを使うのでメモしておく。

> **Deploy an agent on Windows**

> * https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/v2-windows?view=vsts

### 【手順4】Build Agentのインストール
* Private Agentの仮想マシンにログインして、以下URLを参考にBuild Agentをインストールする


* 以下URLからAgentをダウンロード
    * `Download Agent`をクリック。Windowsタブで、`Download`ボタンをクリック。

> **Azure DevOps**

> * https://dev.azure.com/{your_organization}/_admin/_AgentPool

* Cドライブ直下に`agent`というフォルダを作成。

* ダウンロードして解凍した内容を`agent`フォルダにコピー

![agent-folder.PNG](https://qiita-image-store.s3.amazonaws.com/0/265386/331e159b-db64-1446-86d0-38007d4a43a8.png)

* 以下コマンドにて初期設定を行う

```powershell
C:\agent> .\config.cmd
```

* Enter server URL : AzureDevOps(vsts)の`サイト名`を入力
* Enter authentication type : PATで認証するので、`ENTER`
* Enter personal access token : 事前にメモしておいた`PAT`を貼り付け

```powershell
>> Connect:

Enter server URL > https://<your-hostname>
Enter authentication type (press enter for PAT) >
Enter personal access token > ****************************************************
Connecting to server ...
```

* Enter agent pool : defaultのままでよいので、`ENTER`
* Enter agent name : defaultのままでよいので、`ENTER`
* Enter work folder : defaultのままでよいので、`ENTER` 

```powershell
>> Register Agent:

Enter agent pool (press enter for default) >
Enter agent name (press enter for <your-agent-name>) >
Scanning for tool capabilities.
Connecting to the server.
Successfully added the agent
Testing agent connection.
Enter work folder (press enter for _work) >
2018-11-22 04:49:12Z: Settings Saved.
```

* Enter run agent as service : サービスとして動かしたいので`Y`
* Enter User account to use for the service : OSの`Adminユーザ`を入力
* Enter Password for the account : OSの`Adminユーザのパスワード`を入力

```powershell
Enter run agent as service? (Y/N) (press enter for N) > Y
Enter User account to use for the service (press enter for NT AUTHORITY\NETWORK SERVICE) > <your-account>
Enter Password for the account <your-computer-name>\<your-account> > ************
Granting file permissions to '<your-computer-name>\<your-account>'.
Service vstsagent.<your-domain>.<your-agent-name> successfully installed
Service vstsagent.<your-domain>.<your-agent-name> successfully set recovery option
Service vstsagent.<your-domain>.<your-agent-name> successfully set to delayed auto start
Service vstsagent.<your-domain>.<your-agent-name> successfully configured
Service vstsagent.<your-domain>.<your-agent-name> started successfully

```


#### 再設定したい場合
* もし再設定したい場合は、以下コマンドにて一度設定を削除する。その後上記の手順を行う。

```powershell
C:\agent> .\config.cmd remove

Removing service
Waiting for service to stop...
Succeeded: Removing service
Removing agent from the server
```

* Enter authentication type : PATで認証するので、`ENTER`
* Enter personal access token : 事前にメモしておいた`PAT`を貼り付け

```powershell
Enter authentication type (press enter for PAT) >
Enter personal access token > ****************************************************
Connecting to server ...
Succeeded: Removing agent from the server
Removing .credentials
Succeeded: Removing .credentials
Removing .agent
Succeeded: Removing .agent
```

### 【手順5】Service connectionsの設定
* Azure DevOps(VSTS)にログイン
* `Project Settings` > `Service Connections`に移動
* `+ New Service Connections`をクリックし、`SonarQube`を選択
* ダイアログにて以下情報を入力
    * Connection Name : 分かりやすい名前を入力
    * Server Url : SonarQube Serverの`Private IP`を入力
    * token : SonarQubeのSecurityタブで発行した`token`を入力

> **Note:**
> SonarQubeを初めて使う方は、Azure DevOpsのMarketplaceからExtensionをインストールしておく

> * https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarqube

### 【手順6】Agent Poolの変更
* Azure DevOps(VSTS)にログイン
* メニューから`Pipelines` > `Builds` に移動
* 使用しているpipelineのAgent PoolをPrivate配下の`Default`に変更

### 【手順7】SonarQubeタスクの追加
* Azure DevOps(VSTS)にログイン
* 以下URLを参考に、`Prepare Analysis Configuration`と`Run Code Analysis`のタスクを追加
    * `Analysing a .NET solution`のあたりを参照
    * Gate Controlしたい方は、`Publish Quality Gate Result`も追加

> **Analyzing with SonarQube Extension for VSTS/TFS**

> * https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Extension+for+VSTS-TFS


### 【手順8】Buildする
* Azure DevOps(VSTS)にログイン
* メニューから`Pipelines` > `Builds` に移動
* 対象のpipelineをビルドする
* うまくいけば、pipelineが正常終了する。sonarqubeサイトにログインすると解析結果が表示される

#### ビルド時にvstest関連のエラーが出た場合
* ↓こんな感じのエラーが出た場合

```bash
No agent found in pool Default which satisfies the specified demands:
     msbuild
     visualstudio
     vstest
     Agent.Version -gtVersion 2.115.0 
```


* 以下URLの対応を実施してください。

> **【FAQ】Azure DevOpsのprivate agentでvstestがないエラー**

> * https://qiita.com/ttoori-ttoori/items/f7d6f1151146bcdde3a3