[Microsoft] Azure Pipelines (VSTS) AgentをDockerあるいはAzure Container Instanceで動かす

[Azure Pipelines](https://azure.microsoft.com/en-us/services/devops/pipelines/)エージェントをDockerで動かします。

# Azure Pipelinesとは

Jenkinsのようなビルド/デプロイを行うサービスです。

# Azure Pipelinesエージェントとは

Azure Pipelinesから指示を受け、実際にビルドやデプロイの処理が動くデーモンです。

Azure Pipelinesに無料版が付いてきますが、毎月の実行時間に上限があります。
自前でエージェントを用意することで、上限時間なく利用できます。


# あらかじめ必要なもの

## 組織名

Azure DevOpsのURLを見てください。`https://dev.azure.com/hogehoge` のようになっていると思います。この `hogehoge` の部分です。

## Personal Access Token

エージェントがAzure DevOpsへ接続するときに必要なものです。

こちらに[Personal Access Tokenの取得方法](https://docs.microsoft.com/ja-jp/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=preview-page)があります。

スコープとしては、以下を設定します。

* Agent Pools
    * Read & manage
* Code
    * Read
* Connected server
    * Connected server
* Deployment Groupos
    * Read & manage


# Dockerで動かす

Micorosoft公式イメージはDeprecatedになっているので、拙いながらも作成しました。
[sengokyu/azure-pipelines-agent:latest](https://hub.docker.com/r/sengokyu/azure-pipelines-agent)
いつものようにpullしてください。

```
docker pull sengokyu/azure-pipelines-agent
```

実行時に、あらかじめ用意しておいた組織名とPersonal Access Tokenを環境変数として与えてください。

| 変数名 | 値 |
|:-:|:-:|
| ORG  | 組織名  |
| TOKEN  | Personal Access Token  |

```
docker run -d -e TOKEN=${PAT} -e ORG=${ORG} sengokyu/azure-pipelines-agent
```

# Azure Container Instanceで動かす

ARMテンプレートを使用してデプロイします。

ARMテンプレートのリソース定義部分です。全体は[GitHubに置いて](https://github.com/sengokyu/docker-azure-pipelines-agent/blob/main/azure-template/template.json)ます。

```json:template.json
  "resources": [
    {
      "name": "[parameters('containerGroupName')]",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "containers": [
          {
            "name": "[parameters('agent')]",
            "properties": {
              "image": "[variables('containerImage')]",
              "resources": {
                "requests": {
                  "cpu": "[parameters('cpu')]",
                  "memoryInGb": "[parameters('memoryInGb')]"
                }
              },
              "environmentVariables": [
                { "name": "TOKEN", "secureValue": "[parameters('token')]" },
                { "name": "ORG", "value": "[parameters('org')]" },
                { "name": "POOL", "value": "[parameters('pool')]" },
                { "name": "AGENT", "value": "[parameters('agent')]" }
              ]
            }
          }
        ],
        "osType": "Linux",
        "restartPolicy": "Never"
      }
    }
  ]
```

各パラメータを記載したファイルを作成します。

```json:parameters.json
{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerGroupName": { "value": "vsts-agent" },
    "pool": { "value": "Default" },
    "agent": { "value": "vsts-agent-on-aci" },
    "token": { "value": "YourPersonalAccessToken" },
    "org": { "value": "YourOrganizationName" },
    "cpu": { "value": 4 },
    "memoryInGb": { "value": 8 }
  }
}
```

azコマンドを実行します。

```console
az deployment group create -f template.json -p @parameters.json -g ResourceGroupName
```