演習 - 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 サブスクリプションが必要です。

  1. Azure Portal にアクセスしてサインインします。

  2. メニューから [Cloud Shell] を選択します。 プロンプトが表示されたら、[Bash] エクスペリエンスを選択します。

    A screenshot of the Azure portal showing the location of the Cloud Shell menu item.

    Note

    Cloud Shell では、Cloud Shell で作成するすべてのファイルを保持する Azure ストレージ リソースが必要です。 ユーザーが Cloud Shell を初めて開くとき、リソース グループ、ストレージ アカウント、Azure Files 共有を作成するように求められます。 この設定は、以降のすべての Cloud Shell セッションで自動的に使用されます。

Azure リージョンを選択する

"リージョン" は、1 つの地理的な場所内にある 1 つ以上の Azure データセンターです。 米国東部、米国西部、北ヨーロッパなどがリージョンの例です。 Azure VM を含むすべての Azure リソースには、リージョンが割り当てられます。

コマンドをより簡単に実行するには、まず、既定のリージョンを選択します。 既定のリージョンを指定すると、別のリージョンを指定しない限り、そのリージョンが以降のコマンドで使用されます。

  1. Cloud Shell から次の az account list-locations コマンドを実行して、お使いの Azure サブスクリプションで使用可能なリージョンを一覧表示します。

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. 出力の Name 列から、最寄りのリージョンを選択します。 たとえば、eastasia または westus2 を選択します。

  3. 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 でエージェント プールを作成します。 エージェントが自分自身を正しいプールに登録できるよう、後でエージェントを構成するときにエージェント プールの名前を指定します。

  1. Azure DevOps で、Space Game - web - Agent プロジェクトに移動します。

  2. [Project settings] を選択します。

  3. [パイプライン] で、[エージェント プール] を選択します。

    A screenshot of the project settings in Azure DevOps showing the location of the Agent pools menu item.

  4. [プールの追加] を選択します。

  5. [Add pool] ウィンドウで、次の手順を行います。

    1. [Pool to link][New] を選択します。
    2. [Pool type][Self-hosted] を選択します。
    3. [Name] に「MyAgentPool」と入力します。

    実際には、プールにはもっとわかりやすい名前を選択します。

  6. [作成] を選択します 新しいエージェント プールが一覧に表示されます。

個人用アクセス トークンを作成する

ビルド エージェントが Azure DevOps に自己登録するには、エージェントが自己認証を行うための手段が必要です。

これを行うために、個人用アクセス トークンを作成できます。 個人用アクセス トークン (PAT) は、パスワードの代わりとなるものです。 PAT を使用して、Azure DevOps などのサービスで認証を行うことができます。

重要

パスワードと同様に、アクセス トークンは安全な場所に保管してください。 このセクションでは、アクセス トークンを環境変数として保存して、シェル スクリプトに表示されないようにします。

  1. Azure DevOps でご自分のプロファイル設定を開き、[個人用アクセス トークン] を選択します。

    A screenshot of Azure DevOps showing the location of the Personal access tokens menu item.

  2. [New Token] を選択します。

  3. トークンの名前 (例: Build agent) を入力します。

  4. [スコープ] で、下部にある [すべてのスコープを表示する] を選択します。

  5. [エージェント プール] を探し、[読み取りと管理] を選択します。

  6. [作成] を選択します

  7. トークンを安全な場所にコピーします。

    後で、トークンを使用して、ビルド エージェントで Azure Pipelines へのアクセスを認証できるようにします。

VM に接続する

このセクションでは、Linux VM を構成するために、SSH 経由で Linux VM に接続します。

対話形式では Microsoft ホステッド エージェントにサインインできないことを思い出してください。 プライベート ビルド エージェントはご自分のものなので、好きなようにサインインして構成できます。

ビルド エージェントに接続できるため、ソフトウェアのビルドに必要なツールを使用して構成できます。 また、パイプラインの構成を作成する際に問題のトラブルシューティングを行うこともできます。

  1. 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 アドレスが格納されます。

  2. VM の IP アドレスをコンソールに出力します。

    echo $IPADDRESS
    
  3. 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 システムを設定するときに最初に行うことです。

  1. SSH 接続から、apt パッケージ マネージャーのキャッシュを更新します。

    sudo apt-get update
    

    sudo により、管理者 (ルート) 特権でコマンドが実行されます。

  2. build-tools.sh という名前のシェル スクリプトを GitHub からダウンロードするために、次の curl コマンドを実行します。

    curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-tools.sh > build-tools.sh
    
  3. スクリプトをターミナルに出力して、その内容を調べられるようにします。

    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 バージョンを指定できます。 この変数を設定しない場合、スクリプトは、既存のビルド構成で使用されているバージョンをインストールします。 学習目的なので、この変数を設定しません。 スクリプトによって既定のバージョンが使用されるようにします。

  4. スクリプトを実行可能にしてから、スクリプトを実行します。

    chmod u+x build-tools.sh
    sudo ./build-tools.sh
    

    スクリプトの実行には数分かかります。

    実際には、各ソフトウェア コンポーネントが正常にインストールされたことを確認するためのコマンドをここで実行できます。

エージェント ソフトウェアを VM にインストールする

ここで、エージェント ソフトウェアを VM にインストールします。 このソフトウェアにより、VM はビルド エージェントとして機能して Azure Pipelines からビルド ジョブを受信できるようになります。

登録プロセスは、エージェントを Azure Pipelines に登録する前に、インストールされているソフトウェアを確認します。 そのため、他のすべてのソフトウェアをインストールした後、エージェントを設定することが重要です。 実際には、追加のソフトウェアをインストールする必要がある場合、エージェントの登録をやり直すことができます。

このドキュメントでは、macOS と Windows のエージェントに加えて、セルフホステッド Linux エージェントを手動で設定する方法について説明します。 前のセクションでビルド ツールを設定したのとほぼ同じ方法で、シェル スクリプトを実行してエージェントを構成します。

重要

ここで実行するスクリプトは学習用です。 実際には、最初に、作成するスクリプトの各コマンドがシステム全体にどのように影響するかを理解する必要があります。 このモジュールの最後には、オプションについてより詳しく説明したドキュメントを紹介します。

  1. 次の curl コマンドを実行して、build-agent.sh という名前のシェル スクリプトを GitHub からダウンロードします。

    curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-agent.sh > build-agent.sh
    
  2. スクリプトをターミナルに出力して、その内容を調べられるようにします。

    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

    これら以外の変数は当面、未設定のままにしておくことをお勧めします。

  3. AZP_AGENT_NAME 環境変数を設定して、エージェントの名前を指定します。 MyLinuxAgent をお勧めします。

    export AZP_AGENT_NAME=MyLinuxAgent
    
  4. AZP_URL 環境変数を設定して、お使いの Azure DevOps 組織の URL を指定します。

    <organization> はご自身のものに置き換えます。 Azure DevOps を表示しているブラウザー タブから名前を取得できます。

    export AZP_URL=https://dev.azure.com/organization
    
  5. AZP_TOKEN 環境変数を設定して、個人用アクセス トークン (このユニットで前にコピーした長いトークン値) を指定します。

    <token> はご自身のトークンに置き換えます。

    export AZP_TOKEN=token
    
  6. AZP_POOL 環境変数を設定して、お使いのエージェント プールの名前を指定します。 以前に、MyAgentPool という名前のプールを作成しました。

    export AZP_POOL=MyAgentPool
    
  7. 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 文字列から最新バージョンが読み取られます。

  8. エージェントのバージョンをコンソールに出力します。 必要に応じて、チェックを行い、これが最新バージョンであることを確認します。

    echo $AZP_AGENT_VERSION
    
  9. スクリプトを実行可能にしてから実行します。

    chmod u+x build-agent.sh
    sudo -E ./build-agent.sh
    

    sudo は、ルート ユーザーとしてスクリプトを実行できるようにします。 -E 引数は、スクリプトから使用できるように、設定したものも含めて現在の環境変数を保持します。

    スクリプトを実行すると、エージェントが Azure DevOps に接続し、そのエージェントがエージェント プールに追加され、エージェントの接続がテストされます。

エージェントが実行されていることを確認する

ビルド ツールとエージェント ソフトウェアを VM に正常にインストールしました。 確認手順として、Azure DevOps に移動し、エージェント プール内のエージェントを確認します。

  1. Azure DevOps で、Space Game - web - Agent プロジェクトに移動します。

  2. [Project settings] を選択します。

  3. [パイプライン] で、[エージェント プール] を選択します。

  4. MyAgentPool を選択します。

  5. [エージェント] タブを選択します。

    エージェントがオンラインで、ビルド ジョブを受け付ける準備ができているのがわかります。

    A screenshot of Azure DevOps showing the status of the private agent. The agent shows as online, idle, and enabled.

    ヒント

    ビルド エージェントが [Offline] と表示されている場合、少し待ってからページを更新してみてください。

  6. エージェント MyLinuxAgent を選択します。

  7. [機能] タブを選択します。

    セットアップ中、構成プロセスはビルド エージェントのツール機能をスキャンしました。 npm が機能の 1 つとして一覧に含まれています。 元のビルド構成で、npm をエージェントにインストールする必要があると指定したことを思い出してください。

    A screenshot of Azure DevOps showing a few of the agent's capabilities. The npm capability is highlighted.

    使用するエージェント プールを指定するときは、これらのエントリのどれでも demands セクションに含めることができます。 これらを含めることで、アプリケーションをビルドするために必要なソフトウェアがあるエージェントが、Azure Pipelines によって確実に選択されるようになります。 また、さまざまなソフトウェア構成でエージェント プールを作成することもできます。 Azure Pipelines により、要件に基づいて正しい構成が選択されます。