オンラインで検索すると、さまざまなブログ記事、ドキュメント、チュートリアルがAzure DevOpsについて見つかります。これらのアイテムはすべて貴重な情報源ですが、実際のシナリオを一緒に進めるものはほとんどありません。多くはセキュリティの側面をスキップして、パスワードを平文で表示したり、本質的に何もしないエンドプロダクトを提供しています。それを変えましょう。
この記事/チュートリアルでは、Azure DevOpsを使用してインフラストラクチャを自動化する実際のAzure DevOpsリリースパイプラインの構築方法を学びます。具体的には、Azure DevOpsを使用してAzure仮想マシンをプロビジョニングするための継続的デプロイメントパイプラインの構築方法を学びます。
このプロジェクトの終了時には、完全に機能するAzureパイプラインが完成します。GitHubリポジトリへの単一のコミットから次の操作を行います:
- 一時的なAzureリソースグループを構築する
- ARMテンプレートを使用してAzure VMをプロビジョニングする
- 該当するARMテンプレートをCI/CDパイプラインに設定する
- テンプレートの変更がある場合に、テンプレートの検証テストを開始する
- ARMテンプレートをAzureにデプロイする
- デプロイされたインフラストラクチャをテストする
- すべてのAzureリソースを削除する
さあ、始めましょう!
プロジェクトの概要
このプロジェクトは、以下の6つのメインセクションに分割されます:
Azureリソースの準備
このセクションでは、Azureで必要なリソースのセットアップ方法を学びます。ここでは、以下の操作を行います:
- パイプライン内のさまざまなタスクのためにAzureのサービスプリンシパルを作成します。
- パイプラインが使用するためのシークレットを含むAzure Key Vaultを設定します。
- ARMデプロイメントとパイプラインの使用のために適切なアクセスポリシーを設定します。
Azure DevOpsの準備を行います。
Azureリソースをすべて設定したら、パイプラインのためにAzure DevOpsを準備する準備が整いました。このセクションでは、以下の手順を実行します。
- Azure DevOps組織にPester Test Runnerビルドタスクをインストールします。
- Azure DevOpsに必要なリソースアクセスを提供するためにサービス接続を作成します。
- Azure Key Vaultシークレットにアクセスするために、Azure DevOps変数グループを作成し、キーボールトとリンクします。
スクリプト/テンプレートの概要
このプロジェクトには、サーバーを構築するためのARMテンプレートやPesterテストなど、さまざまなアーティファクトがあります。このセクションでは、テンプレートがどのようにプロビジョニングされ、Pesterがパイプラインでテストしているかについて簡単に説明します。
パイプラインの作成
このセクションでは、本当の楽しみが始まります。実際のパイプラインの設定を開始します。ここでは、単一のYAMLファイルを使用して、この全体のオーケストレーションをセットアップする方法を学びます。
マルチステージパイプラインのUIエクスペリエンスを使用してパイプラインを構築します。この記事を書いている時点では、この機能はプレビュー版です。
パイプラインのデモンストレーション
パイプラインが構築されたら、実行してみましょう!このセクションでは、パイプラインをトリガーする方法を学び、単に魔法が起こるのを見守ります。
クリーンアップ
最後に、これは単なるデモンストレーションなので、チュートリアル中に構築したすべてのものを解体するスクリプトにアクセスできます。
多く聞こえますか?そうです!しかし心配しないでください、各タスクに一つずつ取り組むことで、段階的に学んでいきます。
このパイプラインを構築するために使用されるすべてのAzure CLIコマンドを含むスクリプトが必要な場合は、ServerAutomationDemo GitHubリポジトリのdemo.ps1で見つけることができます。
前提条件
あなたはたくさんのことを学ぶことになりますが、いくつかの準備も必要です。以下のものを準備してください。
- Azure DevOps組織- これを行う方法については、Microsoft QuickStartガイドを参照してください。この記事では、ServerAutomationDemoというプロジェクトを使用します。
- A GitHub repo – In this article, you’ll be learning from a GitHub repo called ServerAutomationDemo. Sorry, we’re not using Azure repos in this article.
- A GitHub personal access token – Be sure to create the token with the permissions of admin:repo_hook, all repo and all user options.

- Cloud ShellまたはPowerShell 6+(ローカルで実行する場合)- 例はWindows PowerShellでも動作する可能性がありますが、テストされていません。すべての例はPowerShellコンソールを介してローカルで実行されますが、Cloud Shellでも同様に動作します。パイプラインの構築を自動化します。
- インストールされたAzure CLI(ローカルで実行する場合)- この記事ではAzure CLIを使用してタスクを実行する方法を学びます。ただし、同じ手順はAzure Portal、PowerShell、またはAzure SDKを使用して実行することもできます。
注意:実行する操作には実際のお金がかかります(Azureのクレジットがある場合を除く)。Azureで最も費用のかかるリソースは一時的なVMです。
開始する前に
このチュートリアルでは多くの設定を行うことになります。始める前に、以下の項目を用意してください。
- リソースが展開されるAzureサブスクリプションの名前- 例ではAdam the Automatorを使用します。
- サブスクリプションのID
- Azure ADテナントID
- DevOps組織名 – 例ではadbertramを使用します。
- リソースを配置するリージョン – 例ではeastusを使用します。
- 一時的なキーバルトを配置するAzureリソースグループの名前 – 例ではServerAutomationDemoを使用します。
- A password to assign to the local administrator account on a deployed VM – the examples will use “I like azure.”.
- GitHubリポジトリのURL – 例ではhttps://github.com/adbertram/ServerAutomationDemoを使用します。
Azure CLIでログインする
この記事では、Azure CLIを使用して多くの作業を行う準備をしてください。Azure PowerShellのcmdletが大好きですが、Azure CLIは現在、より多くのDevOpsタスクを実行することができます。
最初のタスクは、PowerShell 6+コンソールにアクセスすることです。コンソールに入ったら、コマンドaz login
を使用してAzureに認証します。このコマンドはブラウザウィンドウを開き、アカウントを入力するように求めます。
認証が完了したら、サブスクリプションをデフォルトに設定してください。デフォルトに設定することで、常に指定する必要がなくなります。
Azureリソースの準備
Azure CLIでログインしたら、本格的に作業を始める準備が整います。Azure Pipelineにはさまざまな依存関係や設定項目があります。この最初のセクションでは、パイプラインのための環境をセットアップし、準備する方法を学びます。
Azure CLI DevOps拡張機能のインストール
Azure CLIでは、Azure DevOpsのコンポーネントをビルドする方法がデフォルトでは提供されていません。Azure CLIからAzure DevOpsを管理するには、DevOps拡張機能をインストールする必要があります。
幸い、拡張機能のインストールは以下のように1行で行えます。
拡張機能がインストールされたら、組織をデフォルトに設定して、繰り返し指定する必要がないようにします。
リソースグループの作成
パイプラインは一時的なリソースグループを作成する予定ですが、このデモではリソースを作成するためにもリソースグループを作成する必要があります。具体的には、Azure Key Vaultを作成するためのリソースグループです。
Azureサービスプリンシパルの作成
次のタスクは、Azureサービスプリンシパルを作成することです。Azureキーバルトに認証するためにAzureサービスプリンシパルが必要です。また、このサービスプリンシパルを使用してサービス接続を認証します。以下に示すように、キーバルトと将来のARM展開のためのサービスプリンシパルを作成してください。
この時点で、
$sp.appId
の値を保存するのが良いアイデアです。後でパイプラインを構築する際に必要になります!
例ではいくつかのPowerShellコマンドが表示されます。たとえば、
ConvertFrom-Json
です。Azure CLIはJSON文字列のみを返すため、PowerShellオブジェクトに変換するとプロパティを参照しやすくなります。
キーバルトの構築
このチュートリアルのパイプラインでは、いくつかのパスワードを参照する必要があります。パスワードを平文で保存する代わりに、正しい方法で行いましょう。すべての機密情報はAzureキーバルトに保存されます。
キーバルトを作成するには、以下に示すようにaz keyvault create
コマンドを使用します。このコマンドは、以前に作成したリソースグループ内にキーバルトを作成します。また、enabled-for-template-deployment
スイッチに注目してください。これにより、将来のARM展開がキーバルトにアクセスできるように、キーバルトのアクセスポリシーが変更されます。

キーバルトシークレットの作成
キーボールトが作成されたら、シークレットを作成する時が来ました。 このデモでは、ServerAutomationDemo-AppPwとStandardVmAdminPasswordという2つのシークレットを作成します。 AppPwパスワードは、サービスプリンシパルのパスワードです。 VMパスワードは、展開されるVMのローカル管理者アカウントに割り当てられます。
この例では、以前に定義されたPowerShell変数を使用していることに注意してください。 ここでは、以前に取得したサービスプリンシパルのパスワード(
$sp.password
)を提供しています。
パイプラインがキーボールトにアクセスできるようにする
次に、パイプラインがキーボールトにアクセスするための権限が必要です。 キーボールトシークレットを管理するために、作成したサービスプリンシパルにgetとlistの権限を付与してください。
Azure DevOpsの準備
すべてのAzureリソースの準備が完了しました。 これで、Azure DevOpsでの準備作業を行う時間です。
Pester拡張のインストール
最初に実行するタスクは、PesterRunner Azure DevOps拡張のインストールです。 パイプラインは2つのセットのPesterテストを実行して、VM ARMデプロイメントが成功したことを確認します。 Pesterテストを実行する最も簡単な方法の1つは、PesterRunner拡張を使用することです。
以下のコマンドを使用して拡張機能をインストールします。
Azure DevOpsプロジェクトの作成
プロジェクトを作成する時が来ました。Azure CLIを使用して、Azure DevOpsパイプラインを簡単に作成できます。以下のコマンドを実行してプロジェクトを作成し、プロジェクトをデフォルトに設定してください。
サービス接続の作成
パイプラインは、ARMとGitHubリポジトリに認証する必要があります。そのためには、2つのサービス接続を作成する必要があります。
まず、ARMサービスエンドポイントを作成します。以下のコマンドは、サービスプリンシパルのパスワードを入力するように求めます。まずはコンソールに表示されたパスワードをクリップボードにコピーしてください。
サブスクリプションID、テナントIDを入力し、以下のサブスクリプション名を置き換えてください。
次に、GitHubのためのサービス接続を作成します。パイプラインはGitのコミットでトリガーされるため、リポジトリを読み取ることができるようにする必要があります。
この時点で、GitHubのパーソナルアクセストークンが便利になります。以下のコマンドでもう一度サービスプリンシパルのパスワードを貼り付ける必要があります。両方のサービス接続で同じサービスプリンシパルを使用しています。
変数グループの作成
パイプラインは2つのパスワードに関してキーボールトのシークレットを参照します。これを安全に行うためには、変数グループを作成し、キーボールトにリンクする必要があります。
まず、以下に示すように変数グループを作成します。
foo=bar
の変数に注目してください。これは使用されませんが、変数グループを作成するためには単一の変数が必要です。
変数グループをキーボールトにリンクする
この時点では、残念ながらAzure CLIにはキーボールトを変数グループにリンクする方法がありません。
Azure DevOpsポータルに移動し、ライブラリをクリックします。その後、以下に示すようにServerAutomationDemo変数グループが表示されます。 ServerAutomationDemo変数グループをクリックします。

変数グループに入ると、Azureキーボールトからシークレットを変数としてリンクするをクリックします。これを行うと、すべての変数が消去されることになり、確認をクリックします。以下に、これを行う方法を示します。この操作は、foo変数が一時的なものであったため、問題ありません。

確認したら、以下に示すようにARMサービス接続と、以前に作成したServerAutomationDemo-KVキーボールトを選択します。 追加をクリックします。

次に、以下に示すように以前に作成したシークレットの両方を確認し、OKと保存をクリックして変更内容を保存します。

プロジェクトファイルの概要
ここまで来たら、おめでとうございます!パイプラインの構築を開始する準備が整いました。しかし待ってください…まだ続きます!
Azureパイプラインを実際の世界で構築するために、このチュートリアルでは「ユニット」テストと「受け入れ」テストを完備したパイプラインを構築します。これによりチュートリアルがより興味深くなりますが、何が起こっているのかについても追加の説明が必要です。
このチュートリアルのGitHubリポジトリには、以下に示すいくつかのファイルがあります。これからは、このリポジトリをクローンするか、ファイルから独自にビルドするのに良いタイミングです。

- azure-pipelines.yml – 最終的なYAMLパイプライン
- connect-azure.ps1 – Azureサブスクリプションへの認証を行うPowerShellスクリプト
- server.infrastructure.tests.ps1 – VMの設定が正常であることを確認するシンプルなPesterテスト
- server.json – VMをプロビジョニングするためのAzure ARMテンプレート
- server.parameters.json – ARMテンプレートにパラメータ値を提供するAzure ARMパラメータテンプレート
server.parameters.jsonファイルのサブスクリプションIDとキーボルト名を、キーボルトITのものに置き換えてください。
- server.templates.tests.ps1 – ARMテンプレートが有効であることを確認するPester「ユニット」テスト
これらのファイルがパイプライン内でどのように組み合わさるかは、少し後で見ていきます。
パイプラインの作成
私のGitHubレポジトリをクローンしたか、または独自に設定したと仮定して、パイプラインの作成を開始しましょう! az pipelines create
コマンドを実行します。以下のコマンドは、提供されたGitHubレポジトリをトリガーとして使用して、ServerAutomationDemoという名前のパイプラインを作成します。このパイプラインは、masterブランチを参照し、以前に作成したサービス接続を使用します。
GitHubレポジトリにazure-pipelines.ymlファイルがあるかどうかによって、以下のようなフィードバックを受け取るかどうかが異なるかもしれません。いずれにせよ、コンソールは似たような表示になります。GitHubのパーソナルアクセストークンを準備しておいてください!

YAMLパイプラインの概要
この時点で、パイプラインは実行する準備が整っていますが、まずYAMLパイプラインを理解することが重要です。 azure-pipelines.ymlファイルを見てみましょう。このファイルは、マルチステージのYAMLパイプライン機能を使用した場合のパイプラインです。
このYAMLパイプラインを構成する様々な要素を見てみましょう。
トリガー
自動的に実行されるCIパイプラインを構築しているため、トリガーが必要です。以下のトリガーは、Gitのmasterブランチでコミットが検出された時にパイプラインを実行するよう指示しています。
また、paths
セクションにも注目してください。デフォルトでは、CIビルドで明示的にファイルやディレクトリを含めたり除外したりしない場合、パイプラインはどんなファイルに対してもコミットが行われたときに実行されます。このプロジェクトはすべてARMテンプレートに基づいて構築されているため、たとえばPesterテストを微調整した場合にはパイプラインを実行したくありません。
プール
すべてのビルドにはエージェントが必要です。すべてのビルドエージェントはVM上で実行する必要があります。この場合、VMはubuntu-latest
VMイメージを使用しています。このイメージは、ビルドが最初に作成されたときに定義されたデフォルトのイメージです。このパイプラインの「簡易性」のために変更されていません。
変数
次に、すべての変数と変数グループがあります。このパイプラインのさまざまなタスクでは、AzureサブスクリプションID、テナントID、サービスプリンシパルのアプリケーションIDなどの値を読み取る必要があります。各タスクで静的な値を複製する代わりに、変数として定義されています。
また、group
要素にも注目してください。この要素は、以前に作成した変数グループを参照しています。この時点でsubscription_id
とtenant_id
を置き換えてください。
「Azureサービスプリンシパルの作成」セクションで$sp.appId
の値を保存するように指示されましたか?これが必要な場所です。サービスプリンシパルのアプリケーションIDの値を以下のようにapplication_id
に割り当ててください。
azure_resource_group_name
変数の値に注意してください。その値の中には$(Build.BuildId)
というものが表示されます。これは現在のジョブのビルド ID を表すシステム変数です。このコンテキストでは、一時的に作成されるリソースグループが一意であることを確保するために使用されています。
PowerShell の準備タスク
次の一連のタスクでは、PowerShell コードを呼び出します。このパイプラインの例では、テスト目的で一時的なリソースグループを作成および削除するために PowerShell を使用しています。これらのデプロイメントタスクでは、PowerShell コードを呼び出すための 2 つの例があります。
最初のタスクでは、GitHub リポジトリに存在する connect-azure.ps1 というスクリプトを呼び出します。このタスクは、後続の Azure PowerShell コマンドのために Azure サブスクリプションに認証します。
この Azure PowerShell 接続タスクは、スクリプトを呼び出してキーボールトのシークレット値 (ServerAutomationDemo-AppPw
) およびパイプライン変数 subscription_id
、application_id
、tenant_id
を渡しています。
2 番目のタスクは、PowerShell コードを インライン で実行しています。すでにスクリプトが存在しない代わりに、パイプラインの YAML 自体で azure_resource_group_name
パイプライン変数の値を使用して PowerShell コードを定義しています。
Pester テンプレートテスト
次に、最初の Pester テストがあります。このような CI/CD パイプラインでは、いくつかの異なるレイヤーのテストを行うことが重要です。ソフトウェアプロジェクトのパイプラインを作成する場合、さまざまなユニットテストを作成することがあります。
この例のパイプラインは、単一のARM VMデプロイメントを中心に構築されているため、最初の「単体」テストはJSONテンプレートの妥当性をテストするものです。 server.templates.tests.ps1ファイル内には、ARMテンプレートファイル自体に対して必要な数の異なるテストを追加することができます。
以下に注意してください、パイプラインはさまざまなシステム変数を使用しています。これらの変数は、ビルドエージェントに到達したファイルの場所を参照しています。
PesterRunnerタスクは、テスト結果を後でパイプラインで読み取るためにXMLファイルに送信しています。
ARM VMデプロイメント
ARMデプロイメントに移ります。パイプライン全体がVMをデプロイできる能力に基づいて構築されているため、これは重要です!このタスクは、必要な属性を提供してARMテンプレートをデプロイします。
deploymentOutputs: arm_output
属性に注意してください。次のステップでは、デプロイされたVMに接続するためのタスクが必要です。このVMのDNS名またはIPアドレスを取得する良い方法は、ARMデプロイメント経由で返すことです。 deploymentOutputs
オプションは、他のタスクで参照できるパイプライン変数を作成します。
Pester “受け入れ”テスト
VMがデプロイされた後、”統合”または”受け入れ”テストで正しくデプロイされたことを確認する必要があります。このPesterRunnerタスクは、Pesterを呼び出し、VMが正常にデプロイされたことを確認するための別のインフラストラクチャ関連のテストを実行します。
ArmDeploymentJsonOutput
パラメータを介して、ARM デプロイメントの出力値を渡していることに注意してください。Pester テスト スクリプト ファイルには、この値を受け取り、VM の DNS ホスト名を読み取るパラメータが定義されています。
以下に、server.infrastructure.tests.ps1 PowerShell スクリプトの内容が示されています。VM の DNS ホスト名を読み取り、シンプルなオープン ポートのチェックを実行していることに注意してください。
「受け入れ」テストのクリーンアップ
パイプラインがインフラストラクチャをデプロイした唯一の理由は、ARM テンプレートの有効性をテストするためです。このインフラストラクチャは一時的なものであるため、クリーンアップが必要です。最後の PowerShell タスクでは、パイプラインが以前に作成したリソース グループとその中のすべてのリソースを削除しています。
Pester テストの公開
そして、最後の一連のタスクにたどり着きました。Azure Pipelines には テスト結果の公開 というタスクがあります。このタスクはビルド エージェント上の XML ファイルを読み取り、Azure DevOps でテスト結果を表示します。これは、実行されたすべてのテストの結果を簡単に確認するための便利な方法です。

Azure DevOps パイプラインの使用
最後に、パイプラインを実行して動作を確認する準備が整いました。Azure DevOps の Web UI で、ServerAutomationDemo プロジェクトにいることを確認してください。ここにいる場合は、Pipelines をクリックし、ServerAutomationDemo パイプラインが表示されるはずです。
パイプラインを実行する方法の一つは、以下の画像に示すように、右端の3つの点をクリックし、パイプラインを実行 をクリックすることです。これにより、自動化が開始されます。

パイプラインは順調に進行し、指示通りに各タスクを実行します。最終的には、以下に示すように、ジョブによって実行された各タスクに対してすべての緑色のチェックマークが表示されるはずです。

クリーンアップ
パイプラインでいろいろ試して、ここで達成したすべてのことをクリーンアップする必要があります。毕竟、これはチュートリアルであり、プロダクションタスクではないからです!
以下に、この記事で構築したすべてのものをクリーンアップするためのいくつかのコマンドがあります。このコードは、サービスプリンシパル、Azure ADアプリケーション、リソースグループとその中のすべてのもの、およびAzure DevOpsプロジェクトを削除します。
概要
このチュートリアルは、実際のAzure DevOpsインフラストラクチャ自動化パイプラインの構築についての洞察を提供することを目的としていました。このようなパイプラインを構築するための無数の他の方法があるにもかかわらず、このチュートリアルで学んだスキルは、さまざまな構成を通じてあなたをサポートするはずです。
さあ、出かけてさらに自動化を始めましょう!