Azure Pipelinesでローカル環境をAgentにする方法(Mac)

## はじめに

Azure Pipelinesでローカル環境をAgentにする方法を紹介します。

## 環境

- OS：macOS

## ローカル環境をAgentにすることのメリデメ

### メリット

__ワークフォルダがローカルに残る__
これはかなり大きなメリットです。
パイプラインの実行中に生成されたファイルを全て確認できるので、失敗時の調査がしやすいです。

Xcodeプロジェクトの場合、Carthageでビルドしたライブラリなども残るので、 __2回目以降のビルド時間を大幅に短縮できます__ 。

### デメリット

__個人の環境に依存する__
他のローカルCI/CD環境と同様のデメリットです。
個人の環境に依存してしまうため、本番で運用するにはCI/CD用のマシンを用意すべきです。

__ローカル環境のCPUやメモリを圧迫する__
当たり前ですがCPUやメモリを圧迫します。
そのため、開発用のマシンを本番用のAgentにするのは避けるべきです。

## Agentのセットアップ

### Agent Poolの作成(任意)

まずAgent Poolを作成します。
「Default」のAgent PoolにAgentを作成することもできるので、作成は任意です。
しかし、複数チームで使う場合はどのチームが何の目的で作成したAgentかわからなくなるため、作成すべきです。

1つのAgent Poolに複数のAgentがあるとランダムに使われるようなので、そういった意味でも作成すべきです。

__Azure DevOps > Project Settings > Pipelines > Agent pools__
[Add pool]をクリックします。
<img width="1680" alt="スクリーンショット_2019-09-04_16_33_03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/82a8438a-a59d-5f6a-ad0d-a77abb2e63e1.jpeg">

適当な名前を入力し、[Create]をクリックします。
<img width="492" alt="スクリーンショット_2019-09-04_16_37_12.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/90704b34-6805-55c5-7717-b0ed7584f3e3.jpeg">

これでAgent Poolの作成は完了です。
<img width="1361" alt="スクリーンショット_2019-09-04_17_29_19.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/e2e6474c-9857-0188-444e-4a64b3c006bc.jpeg">

### Agentのダウンロードと設定

__Agent Poolを選択 > [Agents]タブ__
[New agent]をクリックします。
<img width="1375" alt="スクリーンショット_2019-09-04_16_38_18.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/81db3b7d-6125-7deb-9eba-da20ee29b2b5.jpeg">

[macOS]タブが選択されていることを確認し、[Download]をクリックします。
<img width="816" alt="スクリーンショット_2019-09-04_16_41_45.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/283289c1-1a22-d8a8-798b-0007e7a452af.jpeg">

ローカル環境のターミナルで以下のコマンドを実行します。

```bash
# Agent用の適当なフォルダを作成して移動する
$ mkdir myagent && cd myagent

# ダウンロードしたAgentを解凍する
# 自動で解凍されてゴミ箱に移動されていることもある
$ tar zxvf ~/Downloads/vsts-agent-osx-x64-2.155.1.tar.gz

# Agentを設定する
$ ./config.sh
```

ライセンス契約の同意
→y

サーバーURL
→https://dev.azure.com/{your-organization}
参考：https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/v2-osx?view=azure-devops#server-url

認証の種類
→PAT

個人用アクセストークン(Personal Access Token, PAT)
→以下を参考にPATを生成
参考：https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/v2-osx?view=azure-devops#permissions

エージェントプール
→任意のエージェントプール

エージェント名
→任意

作業フォルダー
→そのままEnter( `_work` フォルダ)

Agentの設定に成功すると、一覧に表示されます。
<img width="1350" alt="スクリーンショット 2019-09-04 17.02.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/ea912aee-32e1-3c64-1520-4f0b8db1f5f0.png">

## Azupre Pipelinesで対象Agentを使う

Azure Pipelines側で、[Agent pool]に対象Agentが含まれているAgent Poolを指定します。
<img width="941" alt="スクリーンショット_2019-09-04_17_08_21.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/59ac538c-41cf-4d92-a3e6-6444542c0f00.jpeg">

## Agentの実行

ローカル環境のターミナルで以下のコマンドを実行します。

```shell-session
$ ./run.sh
ツール機能をスキャンしています。
サーバーに接続しています。
2019-09-04 08:03:20Z: ジョブをリッスンしています
```

一覧のステータスが「Online」になっていればAgentの起動に成功しています。
<img width="1353" alt="スクリーンショット_2019-09-04_17_05_17.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/ea1afdd9-8461-0954-926f-b3800243395d.jpeg">

この状態で対象Agent poolを指定したAzure Pipelinesを実行すると、ローカル環境のAgentが使われます。

```shell-session
2019-09-04 08:18:34Z: 実行中のジョブ: Xcode xcode102
Password:2019-09-04 08:21:19Z: ジョブ Xcode xcode102 が完了しました。結果: Canceled
2019-09-04 08:22:03Z: 実行中のジョブ: Xcode xcode102
2019-09-04 08:28:19Z: ジョブ Xcode xcode102 が完了しました。結果: Failed
2019-09-04 08:32:02Z: 実行中のジョブ: Xcode xcode102
```

## おわりに

これでローカル環境をAzure PipelinesのAgentにすることができました！

ローカル環境をAgentにすることはパイプライン構築のトライアンドエラーにうってつけです。