演習 - Azure 上で動作するビルド エージェントを作成する
このユニットでは、Microsoft Azure Pipelines で使用できるビルド エージェントを構成するために、Microsoft Azure 上で動作する仮想マシンを使用します。 このモジュールの期間中に使用できる仮想マシンが用意されています。
このユニットでは、次のことを行います。
- ビルド エージェントとして機能する Ubuntu 仮想マシンを Azure 上に作成します。
- Microsoft Azure DevOps でエージェント プールを作成します。
- エージェントを認証するためのアクセス トークンを Azure DevOps で作成します。
- Space Game Web サイトをビルドするために必要なソフトウェアをエージェントに構成します。
- Azure DevOps に接続するようにエージェントを構成して、ビルド ジョブを受信できるようにします。
- エージェントが Azure DevOps に接続され、ビルド ジョブの受信準備ができていることを確認します。
Azure 上に仮想マシンを作成する方法は多数あります。 このユニットでは、Cloud Shell と呼ばれる対話型ターミナルを使用して Ubuntu の仮想マシンを作成します。
VM を構成するには、いくつかの選択肢があります。
- Linux VM の場合、SSH 経由で直接接続して、対話形式でシステムを構成することができます。
- ARM テンプレート、Bicep、またはその他の自動プロビジョニング ツールを使用して、デプロイを自動化することができます。
- 多数のビルド エージェントをデプロイする必要がある場合、すべてのソフトウェアがあらかじめインストールされた VM イメージを作成できます。
対話形式でシステムを構成すると、プロセスや必要なものが理解しやすいため、この方法で始めることをお勧めします。 プロセスを簡素化するために、SSH 経由で Ubuntu VM に接続し、シェル スクリプトを実行してビルド エージェントをセットアップします。
Note
Linux システムへの接続またはその構成に慣れていない場合は、指示どおりに進めてください。 Windows のビルド エージェントにも同じ概念を応用できます。
Linux 仮想マシンの作成
このセクションでは、Ubuntu 20.04 が動作する VM を作成し、これをビルド エージェントとして使用します。 VM をビルド エージェントにするためのセットアップはまだ済んでいませんし、Space Game Web アプリケーションをビルドするために必要なツールもありません。 これからセットアップしていきます。
Azure portal から Cloud Shell を起動する
重要
このモジュールの演習を完了するには、自分の Azure サブスクリプションが必要です。
Azure Portal にアクセスしてサインインします。
メニューから [Cloud Shell] を選択します。 プロンプトが表示されたら、[Bash] エクスペリエンスを選択します。
Note
Cloud Shell では、Cloud Shell で作成するすべてのファイルを保持する Azure ストレージ リソースが必要です。 ユーザーが Cloud Shell を初めて開くとき、リソース グループ、ストレージ アカウント、Azure Files 共有を作成するように求められます。 この設定は、以降のすべての Cloud Shell セッションで自動的に使用されます。
Azure リージョンを選択する
"リージョン" は、1 つの地理的な場所内にある 1 つ以上の Azure データセンターです。 米国東部、米国西部、北ヨーロッパなどがリージョンの例です。 Azure VM を含むすべての Azure リソースには、リージョンが割り当てられます。
コマンドをより簡単に実行するには、まず、既定のリージョンを選択します。 既定のリージョンを指定すると、別のリージョンを指定しない限り、そのリージョンが以降のコマンドで使用されます。
Cloud Shell から次の
az account list-locations
コマンドを実行して、お使いの Azure サブスクリプションで使用可能なリージョンを一覧表示します。az account list-locations \ --query "[].{Name: name, DisplayName: displayName}" \ --output table
出力の
Name
列から、最寄りのリージョンを選択します。 たとえば、eastasia
またはwestus2
を選択します。az configure
を実行して、自分の既定のリージョンを設定します。<REGION>
を、選択したリージョン名に置き換えます。az configure --defaults location=<REGION>
この例では、既定のリージョンとして
westus2
を設定します。az configure --defaults location=westus2
リソース グループを作成する
このトレーニング モジュールで使用されるリソースを含めるリソース グループを作成します。
tailspin-space-game-rg という名前のリソース グループを作成するには、次の
az group create
コマンドを実行します。az group create --name tailspin-space-game-rg
VM の作成
VM を作成するには、次の az vm create
コマンドを実行します。
az vm create \
--name MyLinuxAgent \
--resource-group tailspin-space-game-rg \
--image canonical:0001-com-ubuntu-server-focal:20_04-lts:latest \
--size Standard_DS2_v2 \
--admin-username azureuser \
--generate-ssh-keys
VM が起動するまでに数分かかります。
Standard_DS2_v2 は VM のサイズを指定します。 VM のサイズによって、プロセッサの速度、メモリの量、ストレージの初期量、および予想されるネットワーク帯域幅が定義されます。 これは、Microsoft ホステッド エージェントによって提供されるサイズと同じです。 実際には、より多くの計算能力や、グラフィックス処理などの追加機能を提供するサイズを選択することができます。
--resource-group
引数は、作成する必要があるすべてのものを保持するリソース グループを指定します。 リソース グループにより、ソリューションを構成する VM、ディスク、ネットワーク インターフェイスなどのすべての要素を 1 つのユニットとして管理できます。
エージェント プールを作成する
エージェント プールがビルド エージェントを編成することを思い出してください。 このセクションでは、Azure DevOps でエージェント プールを作成します。 エージェントが自分自身を正しいプールに登録できるよう、後でエージェントを構成するときにエージェント プールの名前を指定します。
Azure DevOps で、Space Game - web - Agent プロジェクトに移動します。
[Project settings] を選択します。
[パイプライン] で、[エージェント プール] を選択します。
[プールの追加] を選択します。
[Add pool] ウィンドウで、次の手順を行います。
- [Pool to link] で [New] を選択します。
- [Pool type] で [Self-hosted] を選択します。
- [Name] に「MyAgentPool」と入力します。
実際には、プールにはもっとわかりやすい名前を選択します。
[作成] を選択します 新しいエージェント プールが一覧に表示されます。
個人用アクセス トークンを作成する
ビルド エージェントが Azure DevOps に自己登録するには、エージェントが自己認証を行うための手段が必要です。
これを行うために、個人用アクセス トークンを作成できます。 個人用アクセス トークン (PAT) は、パスワードの代わりとなるものです。 PAT を使用して、Azure DevOps などのサービスで認証を行うことができます。
重要
パスワードと同様に、アクセス トークンは安全な場所に保管してください。 このセクションでは、アクセス トークンを環境変数として保存して、シェル スクリプトに表示されないようにします。
Azure DevOps でご自分のプロファイル設定を開き、[個人用アクセス トークン] を選択します。
[New Token] を選択します。
トークンの名前 (例: Build agent) を入力します。
[スコープ] で、下部にある [すべてのスコープを表示する] を選択します。
[エージェント プール] を探し、[読み取りと管理] を選択します。
[作成] を選択します
トークンを安全な場所にコピーします。
後で、トークンを使用して、ビルド エージェントで Azure Pipelines へのアクセスを認証できるようにします。
VM に接続する
このセクションでは、Linux VM を構成するために、SSH 経由で Linux VM に接続します。
対話形式では Microsoft ホステッド エージェントにサインインできないことを思い出してください。 プライベート ビルド エージェントはご自分のものなので、好きなようにサインインして構成できます。
ビルド エージェントに接続できるため、ソフトウェアのビルドに必要なツールを使用して構成できます。 また、パイプラインの構成を作成する際に問題のトラブルシューティングを行うこともできます。
VM の IP アドレスを取得するには、Cloud Shell で
az vm show
を実行します。IPADDRESS=$(az vm show \ --name MyLinuxAgent \ --resource-group tailspin-space-game-rg \ --show-details \ --query [publicIps] \ --output tsv)
このコマンドによって、
IPADDRESS
という名前の Bash 変数に IP アドレスが格納されます。VM の IP アドレスをコンソールに出力します。
echo $IPADDRESS
VM への SSH 接続を作成します。 $IPADDRESS の代わりに、前のステップで受け取った IP アドレスを入力します。 プロンプトで「yes」と入力して接続を続けます。
ssh azureuser@$IPADDRESS
これで、SSH 経由で VM に接続されました。
以前に
az vm create
を実行したときに--generate-ssh-keys
オプションを指定したので、このコマンドは機能します。 このオプションを選択すると、VM にサインインできる SSH キー ペアが作成されます。
ビルド ツールを VM にインストールする
このセクションでは、Space Game Web サイトの構築に必要なツールを使用して VM を構成します。
既存のビルド プロセスで次のツールを使用していることを思い出してください。
- アプリケーションのビルドに使用される .NET SDK
- Node.js。ビルド タスクを実行するために使用
- npm。Node.js 向けのパッケージ マネージャー
- gulp。JavaScript および CSS ファイルを縮小するために使用される Node.js パッケージ
これらはビルド プロセスに必要な主要ツールです。 これらをインストールするには、GitHub からシェル スクリプトをダウンロードして実行します。
Note
ビルド プロセスでは、node-sass などの他のツールを使って、Sass (.scss) ファイルを CSS (.css) ファイルに変換します。 ただし、Node.js はビルドの実行時にこれらのツールをインストールします。
まず、apt という名前の Ubuntu パッケージ マネージャーを更新します。 この操作で、パッケージ リポジトリから最新の情報がフェッチされます。これは、通常、新しい Ubuntu システムを設定するときに最初に行うことです。
SSH 接続から、apt パッケージ マネージャーのキャッシュを更新します。
sudo apt-get update
sudo
により、管理者 (ルート) 特権でコマンドが実行されます。build-tools.sh という名前のシェル スクリプトを GitHub からダウンロードするために、次の
curl
コマンドを実行します。curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-tools.sh > build-tools.sh
スクリプトをターミナルに出力して、その内容を調べられるようにします。
cat build-tools.sh
次のような結果が表示されます。
#!/bin/bash set -e # Select a default .NET version if one is not specified if [ -z "$DOTNET_VERSION" ]; then DOTNET_VERSION=6.0.300 fi # Add the Node.js PPA so that we can install the latest version curl -sL https://deb.nodesource.com/setup_16.x | bash - # Install Node.js and jq apt-get install -y nodejs apt-get install -y jq # Install gulp npm install -g gulp # Change ownership of the .npm directory to the sudo (non-root) user chown -R $SUDO_USER ~/.npm # Install .NET as the sudo (non-root) user sudo -i -u $SUDO_USER bash << EOF curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin -c LTS -v $DOTNET_VERSION EOF
このスクリプトにより、Node.js、npm、gulp、および .NET Core がインストールされます。
DOTNET_VERSION
環境変数を設定することで、インストールする .NET バージョンを指定できます。 この変数を設定しない場合、スクリプトは、既存のビルド構成で使用されているバージョンをインストールします。 学習目的なので、この変数を設定しません。 スクリプトによって既定のバージョンが使用されるようにします。スクリプトを実行可能にしてから、スクリプトを実行します。
chmod u+x build-tools.sh sudo ./build-tools.sh
スクリプトの実行には数分かかります。
実際には、各ソフトウェア コンポーネントが正常にインストールされたことを確認するためのコマンドをここで実行できます。
エージェント ソフトウェアを VM にインストールする
ここで、エージェント ソフトウェアを VM にインストールします。 このソフトウェアにより、VM はビルド エージェントとして機能して Azure Pipelines からビルド ジョブを受信できるようになります。
登録プロセスは、エージェントを Azure Pipelines に登録する前に、インストールされているソフトウェアを確認します。 そのため、他のすべてのソフトウェアをインストールした後、エージェントを設定することが重要です。 実際には、追加のソフトウェアをインストールする必要がある場合、エージェントの登録をやり直すことができます。
このドキュメントでは、macOS と Windows のエージェントに加えて、セルフホステッド Linux エージェントを手動で設定する方法について説明します。 前のセクションでビルド ツールを設定したのとほぼ同じ方法で、シェル スクリプトを実行してエージェントを構成します。
重要
ここで実行するスクリプトは学習用です。 実際には、最初に、作成するスクリプトの各コマンドがシステム全体にどのように影響するかを理解する必要があります。 このモジュールの最後には、オプションについてより詳しく説明したドキュメントを紹介します。
次の
curl
コマンドを実行して、build-agent.sh という名前のシェル スクリプトを GitHub からダウンロードします。curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-agent.sh > build-agent.sh
スクリプトをターミナルに出力して、その内容を調べられるようにします。
cat build-agent.sh
次のような結果が表示されます。
#!/bin/bash set -e # Select a default agent version if one is not specified if [ -z "$AZP_AGENT_VERSION" ]; then AZP_AGENT_VERSION=2.187.2 fi # Verify Azure Pipelines token is set if [ -z "$AZP_TOKEN" ]; then echo 1>&2 "error: missing AZP_TOKEN environment variable" exit 1 fi # Verify Azure DevOps URL is set if [ -z "$AZP_URL" ]; then echo 1>&2 "error: missing AZP_URL environment variable" exit 1 fi # If a working directory was specified, create that directory if [ -n "$AZP_WORK" ]; then mkdir -p "$AZP_WORK" fi # Create the Downloads directory under the user's home directory if [ -n "$HOME/Downloads" ]; then mkdir -p "$HOME/Downloads" fi # Download the agent package curl https://vstsagentpackage.azureedge.net/agent/$AZP_AGENT_VERSION/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz > $HOME/Downloads/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz # Create the working directory for the agent service to run jobs under if [ -n "$AZP_WORK" ]; then mkdir -p "$AZP_WORK" fi # Create a working directory to extract the agent package to mkdir -p $HOME/azp/agent # Move to the working directory cd $HOME/azp/agent # Extract the agent package to the working directory tar zxvf $HOME/Downloads/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz # Install the agent software ./bin/installdependencies.sh # Configure the agent as the sudo (non-root) user chown $SUDO_USER $HOME/azp/agent sudo -u $SUDO_USER ./config.sh --unattended \ --agent "${AZP_AGENT_NAME:-$(hostname)}" \ --url "$AZP_URL" \ --auth PAT \ --token "$AZP_TOKEN" \ --pool "${AZP_POOL:-Default}" \ --work "${AZP_WORK:-_work}" \ --replace \ --acceptTeeEula # Install and start the agent service ./svc.sh install ./svc.sh start
各行の働きを理解する必要はありませんが、このスクリプトの動作の要約を次に示します。
- エージェント パッケージを .tar.gz ファイルとしてダウンロードし、その内容を抽出します。
- 抽出されたファイルでは、スクリプトは次のようになります。
- installdependencies.sh というシェル スクリプトを実行し、エージェント ソフトウェアをインストールします。
- config.sh というシェル スクリプトを実行し、エージェントを構成し、そのエージェントを Azure Pipelines に登録します。
- svc.sh というシェル スクリプトを実行し、エージェント サービスをインストールして開始します。
スクリプトでは、環境変数を使用して、Azure DevOps 組織の詳細を提供できるようにします。 次に概要を示します。
Bash 変数 説明 Default AZP_AGENT_VERSION
インストールするエージェント ソフトウェアのバージョン このモジュールをテストするために最後に使用したバージョン AZP_URL
Azure DevOps 組織の URL (なし) AZP_TOKEN
個人用アクセス トークン (なし) AZP_AGENT_NAME
Azure DevOps に表示されるエージェントの名前 システムのホスト名 AZP_POOL
エージェント プールの名前 既定 AZP_WORK
ビルド タスクを実行するエージェントの作業ディレクトリ _work 設定されていない変数の既定値がスクリプトで定義されていない場合、スクリプトはエラー メッセージを出力して直ちに終了します。
この後の手順では、次の環境変数を設定します。
AZP_AGENT_VERSION
AZP_URL
AZP_TOKEN
AZP_AGENT_NAME
AZP_POOL
これら以外の変数は当面、未設定のままにしておくことをお勧めします。
AZP_AGENT_NAME
環境変数を設定して、エージェントの名前を指定します。 MyLinuxAgent をお勧めします。export AZP_AGENT_NAME=MyLinuxAgent
AZP_URL
環境変数を設定して、お使いの Azure DevOps 組織の URL を指定します。<organization> はご自身のものに置き換えます。 Azure DevOps を表示しているブラウザー タブから名前を取得できます。
export AZP_URL=https://dev.azure.com/organization
AZP_TOKEN
環境変数を設定して、個人用アクセス トークン (このユニットで前にコピーした長いトークン値) を指定します。<token> はご自身のトークンに置き換えます。
export AZP_TOKEN=token
AZP_POOL
環境変数を設定して、お使いのエージェント プールの名前を指定します。 以前に、MyAgentPool という名前のプールを作成しました。export AZP_POOL=MyAgentPool
AZP_AGENT_VERSION
環境変数を設定して、エージェントの最新バージョンを指定します。export AZP_AGENT_VERSION=$(curl -s https://api.github.com/repos/microsoft/azure-pipelines-agent/releases | jq -r '.[0].tag_name' | cut -d "v" -f 2)
Linux マシン上の YAML パイプラインには、たとえプレリリースであっても、最新バージョンのエージェントを使用する必要があります。 エージェント ソフトウェアは常に更新されているため、
curl
を使って GitHub リポジトリからバージョン情報を取得してください。 このコマンドを実行すると、jq
が使用され、返された JSON 文字列から最新バージョンが読み取られます。エージェントのバージョンをコンソールに出力します。 必要に応じて、チェックを行い、これが最新バージョンであることを確認します。
echo $AZP_AGENT_VERSION
スクリプトを実行可能にしてから実行します。
chmod u+x build-agent.sh sudo -E ./build-agent.sh
sudo
は、ルート ユーザーとしてスクリプトを実行できるようにします。-E
引数は、スクリプトから使用できるように、設定したものも含めて現在の環境変数を保持します。スクリプトを実行すると、エージェントが Azure DevOps に接続し、そのエージェントがエージェント プールに追加され、エージェントの接続がテストされます。
エージェントが実行されていることを確認する
ビルド ツールとエージェント ソフトウェアを VM に正常にインストールしました。 確認手順として、Azure DevOps に移動し、エージェント プール内のエージェントを確認します。
Azure DevOps で、Space Game - web - Agent プロジェクトに移動します。
[Project settings] を選択します。
[パイプライン] で、[エージェント プール] を選択します。
MyAgentPool を選択します。
[エージェント] タブを選択します。
エージェントがオンラインで、ビルド ジョブを受け付ける準備ができているのがわかります。
ヒント
ビルド エージェントが [Offline] と表示されている場合、少し待ってからページを更新してみてください。
エージェント MyLinuxAgent を選択します。
[機能] タブを選択します。
セットアップ中、構成プロセスはビルド エージェントのツール機能をスキャンしました。
npm
が機能の 1 つとして一覧に含まれています。 元のビルド構成で、npm
をエージェントにインストールする必要があると指定したことを思い出してください。使用するエージェント プールを指定するときは、これらのエントリのどれでも
demands
セクションに含めることができます。 これらを含めることで、アプリケーションをビルドするために必要なソフトウェアがあるエージェントが、Azure Pipelines によって確実に選択されるようになります。 また、さまざまなソフトウェア構成でエージェント プールを作成することもできます。 Azure Pipelines により、要件に基づいて正しい構成が選択されます。