Azure DevOpsのPipelinesでCIをまわす

# やること

GitHub上にあるソースコードを、Azure DevOpsのPipelinesでCIをまわす。  

GitHubへのpushをトリガーとして、CIが回り始め、ジョブの中でソースのビルドを実行し、Dockerイメージを作成し、作成したイメージをDocker HubにPUSHする。

# 前提

Azureにアカウントを作っている。

# pipelineを作る手順

まず、Azure DevOpsにログインし、以下の画面に遷移して、pipelineを押下。

![welcome_to_project.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/b6eb1040-7eef-4001-680a-b51aca5cc8d5.jpeg)

以下のような画面がでたら、New pipelineを押下。

![create_pipeline.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/8403f13f-e732-2684-7abf-d17095145617.jpeg)

以下の画面で、GitHubを押下。

![select_source.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/2593b1e8-5ca1-efd0-b01e-9efe1c198115.jpeg)

以下の画面で、Authorizeを押下。

![oauth.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/67a0afa4-e0bb-c6c2-e4ef-a62d9f281fcc.jpeg)

以下の画面で、Authorize AzurePipelinesを押下。

![oauth2.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/6f3e3125-697e-9f1d-025e-b6c43af113aa.jpeg)

以下の画面で、GitHubのパスワードを入力。

![confirm_password.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/ddb2b509-0c7d-4184-3fae-8e21fc0220f1.jpeg)

以下のような画面から、連携したいリポジトリを選択。

![select_repo.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/274a03f5-88ce-1671-88f9-faaec4264c65.jpeg)

以下の画面で、Docker imageを選択。

![configure_pipeline.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/ffccfa65-b31c-384e-7a85-da1f14a8a97f.jpeg)

デフォルトで以下のようなYAMLの生成が促されるので、Save and run押下。

![default.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/a17f4e58-77b9-1479-db3b-9d6cb0af091f.jpeg)

Save and run押下。

![save_and_run.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/b1a8bb15-cd08-2c15-9bef-77a0925f6cf6.jpeg)

ジョブが走る。成功したら以下のような画面になる。

![success.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/bdb8fa76-30d5-c00a-6361-bd97014171f6.jpeg)

以上の手順を実行すると、連携したGitHubリポジトリ上にazure-pipelines.ymlが生成される。
デフォルトだと以下のようなazure-pipelines.ymlが生成される。

```Dockerfile
# Docker image
# Build a Docker image to deploy, run, or push to a container registry.
# Add steps that use Docker Compose, tag images, push to a registry, run an image, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- master

pool:
  vmImage: 'Ubuntu-16.04'

variables:
  imageName: 'your-container-image-name:$(build.buildId)'

steps:
- script: docker build -f Dockerfile -t $(imageName) .
  displayName: 'docker build'
```

---

```Dockerfile
trigger:
- master
```
の部分で、masterへの変更が生じた際にジョブが流れますよ、と言っている。

```Dockerfile
pool:
  vmImage: 'Ubuntu-16.04'
```
の部分で、Azureのクラウド上でジョブを実行する際に使用するOSイメージを選択できる。

```Dockerfile
variables:
  imageName: 'your-container-image-name:$(build.buildId)'
```
の部分で、imageNameという変数に、your-container-image-name:$(build.buildId)を入れている。
build.buildIdはAzure DevOps側で事前に定義されている値。

事前定義されている値は以下参照。
https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops

```Dockerfile
steps:
- script: docker build -f Dockerfile -t $(imageName) .
  displayName: 'docker build'
```
の部分で、ここでは`docker build -f Dockerfile -t $(imageName) .`というコマンドを流しますよ、このジョブはコンソールやログに`docker build`という名前で表示させますよ、と言っている。

# azure-pipelines.ymlを編集

現状だと、作成されたイメージのDocker HubへのPUSHはないので、azure-pipelines.ymlを編集する。
下記資料のPush an imageの部分を参考にして、以下のように変更する。

https://docs.microsoft.com/en-us/azure/devops/pipelines/languages/docker?view=azure-devops&tabs=yaml#push-an-image

```Dockerfile
# Docker image
# Build a Docker image to deploy, run, or push to a container registry.
# Add steps that use Docker Compose, tag images, push to a registry, run an image, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- master

pool:
  vmImage: 'Ubuntu-16.04'

variables:
- group: nannany_secret
- name: imageName
  value: 'simple-application-azure:$(build.buildId)'

steps:
- script: |
    docker build -f Dockerfile.maven -t nannany/$(imageName) .
    docker login -u nannany -p $(DOCKER_HUB_PWD)
    docker push nannany/$(imageName)
  displayName: 'docker build'
```

Docker Hubのパスワードはそのまま記述せずに、PipelinesのLibrary機能を用いて変数に格納された値を使用している。

![library.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/42a6e9b2-ca3a-baa3-b0b8-361b3898f576.jpeg)

# 結果確認

設定した通り、masterブランチに変更が入るたびにパイプラインが流れる。
結果の確認は、PipelinesのBuildsからみることができる。

![build_result.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/212f7b62-a791-8fbe-4072-989391348578.jpeg)

また、Docker Hubにも登録されていることが確認できた。

![dockerhub.jpg](https://qiita-image-store.s3.amazonaws.com/0/105281/462053ba-c0b0-aa09-9bf3-dc8afff82f92.jpeg)