VisualStudioでビルドしてメール通知するJenkinsの環境をDockerで楽に作る

# 目的など

- 普段はTeamCityを使っていてJenkinsがどんなものか知りたかったというモチベーションです。
- ビルド → テストとコードチェック → メール配信をします。
- 自分のwindowsでひとまずやって、後できれいに消したいです。
- C++用です。CppUTest, ReSharper。
- ここに晒すことで諸先輩方の指摘を頂けたら嬉しいです。

関連する記事はこちら↓です。

https://qiita.com/h1day/items/d7af1240d71a853c965a

https://qiita.com/h1day/items/3f837dc807f24baba1f5

# システムの構成
- windows(の中のwsl2)がDockerのホストです。
- DockerコンテナとしてJenkinsを構築します。
- DockerのホストであるwindowsはJenkinsのエージェントを兼任します。
- レポジトリもある。[以前の記事](https://qiita.com/h1day/items/b4d80fc4b6c29e3d9bc8)の↓を使います。テストコードがあるので。

https://github.com/h1day/AgileSD_Payroll

# Dockerのホスト（そしてJenkinsのエージェント）になるwindowsの前提

* Docker Desktop WSL2 バックエンドをインストールしてある。

https://docs.docker.jp/docker-for-windows/wsl.html#wsl-rerequisites

* Visual Studio（使いたいビルド環境）がインストールしてある。

# Jenkinsの起動

[公式のdocker image](https://hub.docker.com/r/jenkins/jenkins/)を使います。

[ドキュメント](https://www.jenkins.io/doc/book/installing/docker/)を見るとBlue Oceanプラグインを入れたくなりますが、罠なので避けます。

https://qiita.com/h1day/items/851b9b4c27cae12b9c1b

powershellで以下を実行します。

``` powershell 
docker pull jenkins/jenkins:lts-jdk11
```

dockerコンテナを起動します。データはホスト側に持つようにマウント(-v)します。
ブラウザーからのアクセスとエージェントとの接続のためにポートフォワード(-p)します。

``` powershell 
docker run -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11
```

こんなのが出てくるのでパスワードをとっておきます。

``` powershell 
*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

「本当はここにパスワードの文字列が入っています。後で使います。」

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************
```

ブラウザでコンテナにアクセスします。↓のアドレスをアドレスバーに入力します。

``` 
http://localhost:8080
```

下の画面になるので先ほどのパスワードを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/ab99ebdb-7a40-1ae8-8c98-aa41a5668b45.png)


Install suggested plugins を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/2b408712-39a6-70ce-a0b4-01edcf23be1a.png)


あとは指示通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/7424965e-f94f-4524-05ff-6c30af7a99a1.png)

そのまま。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/0f874cfc-0667-2b2a-0f79-deca7874a87d.png)


# (脱線)JDKについて


dockerimageは無印(docker pull jenkins/jenkins)だとサポート期限切れのjdk8になり、jenkins上でも警告が出るのでjdk11を選びました。
ちなみにJDKというとライセンスが気になりますが、このイメージに入っていたのはAdoptOpenJDKだった商用利用も無償で可能です。

https://qiita.com/mamono210/items/1774016dbcd4048ff7b8

バージョン確認の結果です。

``` sh
$ java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 (build 11.0.11+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)
```

# エージェントの準備

本題に戻ります。

処理を実行するのがエージェントです。
この画面から始まるのでエージェントを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/39aa3533-eac2-1b52-c702-4a99bca6b307.png)

Permanent Agentを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/d7e32a49-917c-9106-94fa-91bcb6e168a6.png)

executorsはコアのスレッド数に増やして、作業用のフォルダを指定しました。後はデフォルトにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/7e7ac134-69f2-5f38-5038-b76e53cb5b1c.png)

まだこんな感じなので、さっき作ったwindows11を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/3d6d5948-9f09-dbfb-fe42-3681860f18b6.png)

agent.jarをエージェントでダウンロードします。
ダウンロードしたフォルダに移動し。赤丸のコマンドを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/f72cb00f-cc38-c676-9b45-ae99cd6953f4.png)

こんな風に待機中が並びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/707fa8e1-df2d-ea74-0aee-a0f237210627.png)

今度はmasterのほうを選び、Number of executersを0（つまりエージェントとして動かない）にします。
すると右上にあった警告マークが消えます。

# SMTPサーバーの準備

gmailのsmtpを使う手もメジャーですが、

https://www.thefunky-monkey.com/page/googlesmtp/

Dockerを使える状況なら[catatnight/postfix](https://hub.docker.com/r/catatnight/postfix/)を利用するのも楽です。

https://qiita.com/South_/items/a4041f6e393de6ff556b

Windowsに戻りpowershellで以下を実行します。

``` powershell
docker pull catatnight/postfix
```
PowerShellの場合はLinuxと違い、改行のエスケープが「`」なのが注意点です。
パラメータはこの例のまま行きます。あとで使います。

``` powershell
docker run -d -p 25:25 `
  --name mailserver `
  -e maildomain=example.com `
  -e smtp_user=username:password `
  catatnight/postfix
```

https://qiita.com/yumura_s/items/2760de1ff5807695fbba


# システムの設定

Jenkinsの管理 > システムの設定

「Jenkinsの位置」で、URLは「ホストのIPアドレス:8080」にします。
システム管理者のメールアドレスは通知が来たときに見てわかるように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/464c5b05-1eef-fefd-719e-64eb9228164b.png)

https://k6i.hateblo.jp/entry/2017/08/02/162850

設定保存後に↓のように「リバースプロキシがおかしいようです。」と警告が出るようになると思います。
先ほど設定した「ホストのIPアドレス:8080」でJenkinsにアクセスしなおしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/d8669b84-21ac-048f-7a14-c891d170312e.png)


拡張E-mail通知で、「ホストのIPアドレス」、SMTPサーバーに設定したユーザー名、パスワード、ポート(25)を設定します。
高度な設定を開く必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/fc0fb072-fe04-0bdf-a51d-fd537dfcf6da.png)

他の設定はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017728/e9ceb4c6-e2ef-52be-94f7-9c894f3557d7.png)

宛先がgmailだと迷惑メールに届きます。


続きはこちら↓です。


https://qiita.com/h1day/items/d7af1240d71a853c965a

https://qiita.com/h1day/items/3f837dc807f24baba1f5