Azure DevOpsでDocker imageのBuildからPushまでを自動化してみよう！

Azure DevOpsには様々なtaskが用意されています。
その中の一つにDockerがあるのですが、宣言的に記述できるのでオススメで、今回紹介したいと思います。

公式サイトはこちら👇
[Docker task - Azure Pipelines](https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/build/docker?view=azure-devops)

# 下準備
まずは、Docker imageのPush先（今回はDocker Hub）を設定します。

そのために、まずはDocker Hubにimageのpush先リポジトリを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/0f81a222-b02a-bd94-0cca-fd74d2522524.png)

Azure DevOpsでは、アカウントの管理をService Connectionで行いますので、それを設定していきます。

<img width="1679" alt="Screen Shot 2019-12-06 at 21.36.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/ab490b48-71b3-0167-30c8-5598ac8a1310.png">

<img width="481" alt="Screen Shot 2019-12-06 at 21.38.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/925454bc-cbd5-0cf1-60c3-809f08f7436a.png">

Service connection nameは後々使用しますのでメモっておいてください。

次にAzure DevOpsのプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/c36a5728-5cde-fbfc-8af2-c337caa8a663.png)

コードは今回はAzure Repos Gitに配置することにしますので、設定からAzure Repos Gitをオンにします。
<img width="1616" alt="Screen Shot 2019-12-06 at 21.20.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/d5bcf61d-a368-2374-98e2-258cd94c50f1.png">

次に「Hello, Azure DevOps!」を出力するDockerfileを作成していきます。

```Dockerfile
FROM alpine:3.4
CMD echo "Hello, Azure DevOps!"
```

# Azure Pipelinesのコードを記述

Dockerfileを作成を作成したら、Azure Pipelinesのコードを記述していきます。

```azure-pipelines.yml
jobs:
- job: docker build and push job
  pool:
    vmImage: 'ubuntu-16.04'
  steps:
    - task: Docker@2
      displayName: Login to Docker Hub
      inputs:
        command: login
        containerRegistry: dockerRegistryServiceConnection
    - task: Docker@2
      displayName: 'Build and Push'
      inputs:
        command: buildAndPush
        containerRegistry: dockerRegistryServiceConnection
        repository: <あなたのDocker Hubのアカウント>/azure-dev-ops-docker-sample
        tags: latest
        Dockerfile: Dockerfile
        buildContext: .
```

Azure DevOpsが用意しているDocker TaskにはloginやBuildAndPushが用意されているので、今回はそれを利用します。

containerRegistryには、先ほど設定したService connection nameを設定します。
BuildAndPushでは、repositoryには、はじめに作成したdokerhubのrepositoryを指定します。
tagはlatestとしておきます。
Dockerfileには、Dockerfileの場所を記述します。
buildContextは、その名の通り、imageをbuildする際のコンテキストを指定します。

たった数十行で、DockerのBuildとPushを記述でき、とても読みやすいコードになりました。

では、コミットして、Azure Repos GitにPushしましょう。

<img width="1677" alt="Screen Shot 2019-12-06 at 21.55.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/15d49bb5-6166-7866-56de-454bb243fee5.png">


```sh
git init
git add .
git commit -m 'Add hello'
git remote add origin https://path/to/your/azure/repos
git push -u origin --all
```

# Pipelinesを実行する
Azure Repos GitにPushしたら、Pipelinesの初期設定を行なっていきます。

<img width="1680" alt="Screen Shot 2019-12-06 at 22.03.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/e1f400fe-f0fe-5cc7-88f8-eebfdb072f0e.png">

最後のReviewのところのRunを押すことで、初回のPipelinesが実行されます。数分待つことで、Docker HubにPushされます。

<img width="1261" alt="Screen Shot 2019-12-06 at 22.17.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/f48377eb-9951-91e4-2a49-3732e0809e81.png">


次回からは、Git Pushすることで、毎回Pipelineが回ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213538/d176307f-a377-eba6-736e-c446868646ba.png)

これであなたも良きDevOpsライフを送りましょう。以上！