Azure Pipelineで自分のMacでセルフホステッド してみる

色々と実験していくために、自前のADO(Azure DevOps)を用意しました。

業務でよく使うようになったので、今回はPipelinesで自分のMacをセルフホステッドする実験をしていきたいと思います。
こちらを参考にやっていきます。

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/agents/osx-agent?view=azure-devops

今回はシェルコマンドを実行したりするくらいにします。
具体的には、Hello Worldとファイル作成ができるかを検証します。

ADOでPATを作る

Self-hostedで実行するにあたり、必要となるPersonal access tokensを作成します。
右上の設定画面より、[Personal access tokens] (個人用アクセス トークン) を選択します。

New Tokenを押します。

今回の設定必要なのはこれ。
念の為最小権限でやっていきます。(2~3日したら消すと思うけど)

作成されたらこのトークンを忘れないように記録しておきましょう。
このトークンは、エージェントを構成するときに使用します。

ユーザーにアクセス許可があることを確認する

というステップがありますが、権限を持っていることがわかっているのでスキップします。
必要であればこちらを参考に進めてください。

エージェントのダウンロードと構成

エージェントを構成していきます。
ADOに入ってOrganization settingsを押します。

Agent poolsを選択してDefaultを選択します。
もちろん、新しくAgentを作成してもいいです。

New agentを選びます。

macOSのタブを選んでやっていきます。
この後、私のMacではconfig.shを実行した際に信頼できないソフトウェアとかいう内容で警告がたくさん出ました。ADO経由だったので安全だとは思いますが、それらの警告を許可するのがなかなかめんどくさかったです。

ダウンロードが終わったらそのままコマンドをコピペしてターミナルで実行していけばいいです。
最後にサービスを起動するというステップがありますが、これはオプションです。

上記が終わったら、実行します。

./config.shを実行

実行して入力した内容などを記録しておきます。

./config.sh

(base) takumi@ ~/myagent$ ./config.sh

  ___                      ______ _            _ _
 / _ \                     | ___ (_)          | (_)
/ /_\ \_____   _ _ __ ___  | |_/ /_ _ __   ___| |_ _ __   ___  ___
|  _  |_  / | | | '__/ _ \ |  __/| | '_ \ / _ \ | | '_ \ / _ \/ __|
| | | |/ /| |_| | | |  __/ | |   | | |_) |  __/ | | | | |  __/\__ \
\_| |_/___|\__,_|_|  \___| \_|   |_| .__/ \___|_|_|_| |_|\___||___/
                                   | |
        agent v3.225.0             |_|          (commit ef0cd4d)


>> エンドユーザー ライセンス契約:

TFVC リポジトリからソースをビルドするには、Team Explorer Everywhere エンド ユーザー ライセンス契約に同意する必要があります。この手順は、Git リポジトリからソースをビルドする場合には必要ありません。

Team Explorer Everywhere ライセンス契約のコピーは次の場所にあります:
  /Users/takumi/myagent/license.html

(Y/N) Team Explorer Everywhere 使用許諾契約書に今すぐ同意しますか? を入力します (N の場合は Enter キーを押します) > 

Team Explorer Everywhereへの同意が求められますが、今回は使わないのでNにします。

サーバー URL の入力 

Azure Pipelines: https://dev.azure.com/{your-organization}
ということなので、https://dev.azure.com/xiaotiantakumiとなります。

認証の種類 を入力します (PAT の場合は Enter キーを押します) >

先ほどPATを取得したのは、PATで認証するからです。なのでEnterします。

認証の種類 を入力します (PAT の場合は Enter キーを押します) > 

先ほど取得したPATを入力します。

個人用アクセス トークン の入力 > ****************************************************
エージェント プール を入力します (default の場合は Enter キーを押します) >

多分defaultでいいはず。

エージェント名 を入力します (odatakuminoMacBook-Air の場合は Enter キーを押します) > 

このままEnterで。

作業フォルダー を入力します (_work の場合は Enter キーを押します) > 

これも別にこだわりがないのでこのままで。

2023-09-23 06:40:51Z: 設定が保存されました。

と表示されました。

ADOで確認してみると、オフラインですがAgentsとして登録されていることを確認できました。

オフラインということは、サービスを動かさないといけないということでしょう。

オプションということでしたが、./run.shは実質必須というわけでしょう。
それでは一旦実行してみます。

./run.sh
(base) takumi@ ~/myagent$ ./run.sh
ツール機能をスキャンしています。
サーバーに接続しています...
2023-09-23 06:46:38Z: ジョブをリッスンしています

はい、起動しました。

Pipelineから実行してHello Worldしてみる

ちょうどいいソースがないので、作ってしまいます。

作成中。

作成したリポジトリに対してNew pipelineします。

Azure Repo使ってるのでこれを選択。

今回作ったリポジトリを選択。

新しくpipelineを作成します。

内容としてはこんな感じ。

ただし、後述しますが、Agentの指定の仕方ミスってるのでこのままでは動かない。

というわけでミスの内容を書きます。
エラーになりました。

##[warning]An image label with the label Default does not exist.
,##[error]The remote provider was unable to process the request.
Pool: Azure Pipelines
Image: Default
Started: Just now
Duration: 1m 11s

もしかしたらpoolの指定を間違えたか?
ミスってました。
さっきのだとvmImageにDefaultを指定してしまっていました。

正しい設定はこれです。vmImageはいらんです。

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- main

pool: Default

steps:
- script: echo Hello, world!
  displayName: 'Run a one-line script'

- script: |
    touch sample.txt
  displayName: 'Create txt file on self-hosted machine'

再度実行してみると成功しました。

作ったファイルがどこにあるか確認してみると、どうも_work/1という場所に作成されているようです。

(base) takumi@ ~/myagent/_work$ tree
.
├── 1
│   ├── TestResults
│   ├── a
│   ├── b
│   └── s
│       ├── README.md
│       ├── azure-pipelines.yml
│       └── sample.txt