Azure DevOps Pipelinesを使ってAzure Container Registryにイメージをpushする(Linux VMSS編)

Azure仮想マシンスケールセットエージェント(Linux)を使って、ACRにコンテナイメージをpushするやり方を残します。
VMSSセルフホステッドエージェントを使っているので毎回Dockerエンジンをセットアップする手順になっています。

# 前提
* Azure DevOps OrganizationとProject作成済み
* Azure Repos作成済み

# Linux VMSS作成
* オーケストレーションモードは[均一]にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/73f8b2da-59b6-d866-4352-f70aced8f70d.png)

* イメージは[Ubuntu Server 20.04 LTS - x64 Gen2]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/64b545d8-0220-fc8a-fb68-160a5f700c9c.png)

* VMSS配置先の仮想ネットワークを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/83e194f2-ad24-c61e-61f1-63db4d868ed8.png)

* 配置先サブネットを変更したい場合は、下の図の編集ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/606e00d0-2e2c-1f8e-314c-f85ac0228385.png)

* 初期インスタンス数はここでは2にします。（あとでDevOps側で調整します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/15146b08-4a2e-c905-546f-77789035593e.png)

* スケーリングポリシーは[Manual scaling]にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6141e9ed-af94-a62a-1c49-810bd063e6dd.png)

* スケールインポリシーはデフォルトにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/13450534-2bc6-0a49-4e41-30aceeb56a6e.png)

* 管理項目、正常性項目、詳細項目はすべてデフォルトにして作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/98f7356f-ba22-2536-b0b3-7935a86e7a7e.png)

# Service Principal Service Connection作成
* [こちら](https://qiita.com/shingo_kawahara/items/6c7ca38ca7ec32d16a79#service-principal-service-connection%E4%BD%9C%E6%88%90) を参考に作成します。

# ACR Service Connection作成
* Azure DevOpsのProject Settingsから[Service connections]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/28c02bfb-7226-ff3d-1189-8f1700b931b8.png)

* [New service connection]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/699f4954-e33b-111a-70e8-469aab88f12d.png)

* [Docker Registry]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7d4e5d15-334d-41cd-9085-5b62e6c2da48.png)

* 対象のサブスクリプションとACRを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/171249d1-a16a-a0e7-3a56-11ab47a519d7.png)

* [Service Connection name]に任意の値を入力します。後ほどのパイプライン設定でこの値を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/470ecf08-3c31-242f-ade2-376b15a0efeb.png)

# Agent pools作成
* [こちら](https://qiita.com/shingo_kawahara/items/6c7ca38ca7ec32d16a79#agent-pools%E4%BD%9C%E6%88%90) を参考に作成します。
* 指定するVMSSは事前に作成したLinux用のものです。

# Library作成
* [こちら](https://qiita.com/shingo_kawahara/items/6c7ca38ca7ec32d16a79#library%E4%BD%9C%E6%88%90) を参考に作成します。
* 作成するVariable groupは以下の通りとします。
    * ACR_Valiables

        |Name |Value  |
        |---|---|
        |acrRepositoryFront |ACR上に作成されるリポジトリ名を指定します |

    * BACKEND_Valiables

        |Name |Value  |
        |---|---|
        |BACKEND_BASE_URL |ここはアプリケーション要件次第なので任意です |

# Pipelines作成
* azure-pipelines.ymlを以下のように構成します。

```yaml
trigger:
- main

variables:
  - group: ACR_Valiables
  - group: BACKEND_Valiables

pool:
  name: vmss-lin

steps:
- task: NodeTool@0
  inputs:
    versionSpec: '16.x'
  displayName: 'Install Node.js'

- script: |
    npm install --save nuxt
  displayName: 'npm install'

- script: |
    npm run generate
  env:
    BACKEND_BASE_URL: $(BACKEND_BASE_URL)
  displayName: 'npm generate'

- script: |
    sudo apt-get update -y
    sudo apt install docker.io -y
  displayName: "Docker Install"

- script: |
    sudo adduser AzDevOps docker
    sudo chown AzDevOps:docker /var/run/docker.sock
  displayName: "GroupAdd & Chown"

- script: |
    sudo systemctl restart docker
    sudo systemctl status docker
  displayName: "Docker Service Start"

- task: Docker@2
  displayName: Build and push an image to container registry
  inputs:
    command: buildAndPush
    repository: $(acrRepositoryFront)
    dockerfile: $(Build.SourcesDirectory)/Dockerfile
    containerRegistry: kwhr-test-acr
    tags: |
      $(Build.SourceVersion)
      latest
```

* ビルド部分はアプリケーションに応じて変更します（今回はサンプルでフロントエンドです）
* [Docker@2]タスクでは、コンテナイメージのタグにコミットIDとlatestの2つを指定してビルドしています。そのためACRには2つのイメージがpushされます。また、[containerRegistry]には事前に設定したACR Service connectionを指定します。
* この状態でパイプラインを実行し、ACRにコンテナイメージが格納されていれば完了です。

以上