適用対象: IoT Edge 1.4
重要
サポートされているリリースは、IoT Edge 1.5 LTS と IoT Edge 1.4 です。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。
Azure Pipelines には、Azure IoT Edge アプリケーションで DevOps を採用するのに役立つ組み込みの Azure IoT Edge タスクが含まれています。 この記事では、Azure Pipelines の継続的インテグレーションと継続的デプロイ機能を使用して、クラシック エディターを使用してアプリケーションを迅速かつ効率的に Azure IoT Edge にビルド、テスト、デプロイする方法について説明します。 または、 YAML を使用することもできます。
この記事では、Azure Pipelines の組み込みの Azure IoT Edge タスクを使用して、IoT Edge ソリューション用のビルド パイプラインおよびリリース パイプラインを作成する方法について説明します。 パイプラインに追加される各 Azure IoT Edge タスクは、次の 4 つのアクションのいずれかを実装します。
アクション | 説明 |
---|---|
モジュール イメージをビルドする | IoT Edge ソリューション コードを受け取り、コンテナー イメージをビルドします。 |
モジュール イメージをプッシュする | 指定したコンテナー レジストリにモジュール イメージをプッシュします。 |
配置マニフェストを生成する | deployment.template.json ファイルと変数を受け取り、最終的な IoT Edge 配置マニフェスト ファイルを生成します。 |
IoT Edge デバイスにデプロイする | 1 つ以上の IoT Edge デバイスに IoT Edge 展開を作成します。 |
特に指定がない限り、この記事の手順では、タスク パラメーターで使用できるすべての機能については説明しません。 詳細については、次のリソースを参照してください。
[前提条件]
Azure Repos リポジトリ。 ない場合は、プロジェクト内に新しい Git リポジトリを作成することができます。 この記事では、IoTEdgeRepo というリポジトリを作成しました。
リポジトリにコミットおよびプッシュされた IoT Edge ソリューション。 この記事をテストするための新しいサンプル ソリューションを作成する場合は、「Visual Studio Code を使用して IoT Edge モジュールを開発する」の手順に従ってください。 この記事では、IoTEdgeSolution という名前のソリューションをリポジトリに作成しました。これには filtermodule という名前のモジュールのコードが含まれています。
この記事では、必要なのは、Visual Studio Code または Visual Studio のいずれかにある IoT Edge テンプレートで作成されたソリューション フォルダーだけです。 続ける前にこのコードをビルド、プッシュ、デプロイ、またはデバッグする必要はありません。 これらのプロセスは Azure Pipelines で設定します。
ソリューション内の deployment.template.json ファイルへのパスを確認します。これはいくつかの手順で使用されます。 デプロイ テンプレートの役割についてよく知らない場合は、モジュールをデプロイしてルートを確立する方法に関するページを参照してください。
ヒント
新しいソリューションを作成する場合は、最初にリポジトリをローカルで複製します。 その後で、ソリューションを作成するときに、リポジトリ フォルダー内に直接作成することができます。 そこから新しいファイルを簡単にコミットおよびプッシュできます。
モジュール イメージをプッシュできるコンテナー レジストリ。 Azure Container Registry またはサード パーティ製のレジストリを使用することができます。
テストと運用環境のデプロイの個々のステージをテストするための少なくとも 2 つの IoT Edge デバイスのある、アクティブな Azure IoT Hub。 クイック スタートの記事に従って、Linux または Windows 上に IoT Edge デバイスを作成することができます
継続的インテグレーションのためのビルド パイプラインを作成する
このセクションでは、新しいビルド パイプラインを作成します。 IoT Edge ソリューションへの変更をチェックインするたびに、自動的に実行されるようにパイプラインを構成し、ビルド ログを発行します。
ご自身の Azure DevOps 組織 (
https://dev.azure.com/{your organization}
) にサインインして、IoT Edge ソリューションのリポジトリが含まれているプロジェクトを開きます。プロジェクトの左側ペインのメニューで、[パイプライン] を選択します。 ページの中央にある [パイプラインの作成] を選択します。 または、既にビルド パイプラインがある場合は、右上にある [新しいパイプライン] ボタンを選択します。
[ コードの場所 ] ページの下部にある [ クラシック エディターを使用する] を選択します。 YAML を使用してプロジェクトのビルド パイプラインを作成する場合は、 YAML ガイドを参照してください。
プロンプトに従ってパイプラインを作成します。
新しいビルド パイプラインのソース情報を指定します。 ソースとして Azure Repos Git を選択し、IoT Edge ソリューション コードが配置されているプロジェクト、リポジトリ、ブランチを選択します。 その後、 [続行] を選択します。
テンプレートの代わりに [空のジョブ] を選択します。
パイプラインが作成されると、パイプライン エディターが表示されます。 ここでは、パイプラインの名前、エージェント プール、およびエージェントの仕様を変更できます。
Microsoft がホストするプール、または管理するセルフホステッド プールを選択できます。
パイプラインの説明で、ターゲット プラットフォームに基づいて適切なエージェント仕様を選択します。
Linux コンテナー用のプラットフォーム amd64 でモジュールをビルドする場合は、ubuntu-18.04 を選択します
Windows 1809 コンテナー用のプラットフォーム amd64 でモジュールをビルドする場合は、 Windows でセルフホステッド エージェントを設定する必要があります。
Linux コンテナー用のプラットフォーム arm32v7 または arm64 でモジュールをビルドする場合は、 Linux でセルフホステッド エージェントを設定する必要があります。
パイプラインには、 エージェント ジョブ 1 というジョブが事前構成されています。 プラス記号 (+) を選択して、4 つのタスクをジョブに追加します。 Azure IoT Edge は 2 回、 ファイルを 1 回コピーし、 ビルド 成果物を 1 回発行します 。 各タスクを検索し、タスクの名前にカーソルを合わせると、[ 追加 ] ボタンが表示されます。
4 つのタスクがすべて追加されると、エージェント ジョブは次の例のようになります。
最初の Azure IoT Edge タスクを選択して編集します。 このタスクは、指定したターゲット プラットフォームを使用して、ソリューション内のすべてのモジュールをビルドします。 次の値を使用してタスクを編集します。
パラメーター 説明 [表示名] 表示名は、アクション フィールドが変更されると自動的に更新されます。 アクション [モジュール イメージをビルドする] を選択します。 .template.json ファイル 省略記号 (...) を選択し、IoT Edge ソリューションを含むリポジトリ内の deployment.template.json ファイルに移動します。 既定のプラットフォーム ターゲットの IoT Edge デバイスに基づいて、モジュールの適切なオペレーティング システムを選択します。 出力変数 エッジなど、deployment.json ファイルが生成するファイル パスに関連付ける参照名を指定 します。 このタスクとそのパラメーターの詳細については、「Azure IoT Edge タスク」を参照してください。
これらの構成では、
module.json
ファイルで定義されているイメージ リポジトリとタグを使用して、モジュール イメージの名前とタグを付けます。 ビルド モジュール イメージ は、変数を、module.json
ファイルで定義した正確な値に置き換えるのにも役立ちます。 Visual Studio または Visual Studio Code では、.env
ファイルで実際の値を指定します。 Azure Pipelines では、[ パイプライン変数 ] タブで値を設定します。パイプライン エディター メニューの [ 変数 ] タブを選択し、名前と値を次のように構成します。- ACR_ADDRESS: Azure Container Registry のログイン サーバー値。 ログイン サーバーの値は、Azure portal のコンテナー レジストリの概要ページで確認できます。
プロジェクトに他の変数がある場合は、このタブで名前と値を指定できます。 ビルド モジュール イメージ は、
${VARIABLE}
形式の変数のみを認識します。**/module.json
ファイルでは、必ずこの形式を使用してください。2 番目の Azure IoT Edge タスクを選択して編集します。 このタスクは、選択したコンテナー レジストリにすべてのモジュール イメージをプッシュします。
パラメーター 説明 [表示名] 表示名は、アクション フィールドが変更されると自動的に更新されます。 アクション [モジュール イメージをプッシュする] を選択します。 コンテナー レジストリの種類 既定の種類である Azure Container Registry
を使用します。Azure サブスクリプション サブスクリプションを選択します。 Azure Container Registry(アジュール コンテナ レジストリ) モジュール イメージの格納に使用するコンテナー レジストリの種類を選択します。 選択したレジストリの種類に応じて、フォームが変更されます。 Azure Container Registry を選択した場合は、ドロップダウン リストを使用して、Azure サブスクリプションとコンテナー レジストリの名前を選択します。 [汎用コンテナー レジストリ] を選択した場合は、[新規] を選択してレジストリ サービス接続を作成します。 .template.json ファイル 省略記号 (...) を選択し、IoT Edge ソリューションを含むリポジトリ内の deployment.template.json ファイルに移動します。 既定のプラットフォーム ターゲットの IoT Edge デバイスに基づいて、モジュールの適切なオペレーティング システムを選択します。 配置マニフェストにレジストリ資格情報を追加する docker イメージを配置マニフェストにプッシュするためのレジストリ資格情報を追加するには、true を指定します。 このタスクとそのパラメーターの詳細については、「Azure IoT Edge タスク」を参照してください。
モジュール イメージをホストするために複数のコンテナー レジストリがある場合は、このタスクを複製し、別のコンテナー レジストリを選択し、[詳細設定] で [モジュールのバイパス] を使用して、この特定のレジストリ用ではないイメージをバイパスする必要があります。
[ ファイルのコピー ] タスクを選択して編集します。 このタスクを使用して、成果物のステージング ディレクトリにファイルをコピーします。
パラメーター 説明 [表示名] 既定の名前を使用するか、カスタマイズする ソース フォルダー コピーするファイルを含むフォルダー。 内容 deployment.template.json
と**/module.json
の 2 つの行を追加します。 これら 2 つのファイルは、IoT Edge 配置マニフェストを生成するための入力として機能します。ターゲット フォルダー 変数 $(Build.ArtifactStagingDirectory)
を指定します。 内容については、「ビルド変数」を参照してください。このタスクとそのパラメーターの詳細については、「ファイルのコピー タスク」を参照してください。
[ ビルド 成果物の発行 ] タスクを選択して編集します。 リリース パイプラインにパスを発行できるように、タスクへの成果物ステージング ディレクトリ パスを指定します。
パラメーター 説明 [表示名] 既定の名前を使用するか、カスタマイズします。 公開するためのパス 変数 $(Build.ArtifactStagingDirectory)
を指定します。 詳細については、「 変数のビルド」 を参照してください。アーティファクト名 既定の名前を使用する: drop 成果物の公開場所 既定の場所を使用する: Azure Pipelines このタスクとそのパラメーターの詳細については、「ビルド成果物の発行タスク」を参照してください。
[トリガー] タブを開き、[継続的インテグレーションを有効にする] チェック ボックスをオンにします。 コードを含むブランチが含まれていることを確認します。
- [保存] > [キュー] ドロップダウンから [保存] を選択します。
これで、新しいコードをリポジトリにプッシュするときに、このパイプラインが自動的に実行されるように構成されました。 最後のタスクであるパイプライン成果物を発行すると、リリース パイプラインがトリガーされます。 次のセクションに進んで、リリース パイプラインをビルドします。
継続的デプロイのためのリリース パイプラインを作成する
このセクションでは、ビルド パイプラインが成果物を削除したときに自動的に実行されるように構成されたリリース パイプラインを作成し、Azure Pipelines にデプロイ ログを表示します。
新しいパイプラインを作成し、新しいステージを追加します。
[パイプライン] の [リリース] タブで、[+ 新しいパイプライン] を選択します。 または、既にリリース パイプラインがある場合は、[+ 新規] ボタンを選択し、[+ 新しいリリース パイプライン] を選択します。
テンプレートを選択するよう求められたら、[空のジョブ] で開始を選択してください。
ステージ 1 という 1 つのステージを持つ新しいリリース パイプラインが初期化されます。 ステージ 1 の名前を dev に変更し、お使いの開発環境用の継続的デプロイ パイプラインとして扱います。 通常、継続的デプロイ パイプラインには、dev、staging、prod の複数のステージがあります。使用する DevOps 手法に応じて、別の名前を使用したり、さらに作成したりできます。 名前を変更した後、ステージの詳細ウィンドウを閉じます。
上部にある "新しいリリース パイプライン" のテキストを選択して、リリース パイプラインの名前を変更することもできます。
ビルド パイプラインによって発行されているビルド成果物に、リリースをリンクします。 成果物領域で 追加 をクリックします。
[成果物の追加] ページで、[ソースの種類] として [ビルド] を選択します。 作成したプロジェクトとビルド パイプラインを選択します。 [ソース エイリアス] は、必要に応じてわかりやすいものに変更できます。 その後、 [追加] を選択します。
成果物トリガーを開き、切り替えを選択して継続的デプロイ トリガーを有効にします。 これで、新しいビルドが使用可能になるたびに新しいリリースが作成されます。
dev ステージは、1 つのジョブ、0 個のタスクで、事前に構成されています。 パイプライン メニューから [タスク] を選択し、[dev] ステージを選択します。 [エージェント ジョブ] を選択し、その [表示名] を QA に変更します。 エージェント ジョブの詳細を構成できますが、デプロイ タスクはプラットフォームに依存しないため、選択した [エージェント プール] で任意の [エージェント仕様] を使用できます。
QA ジョブで、プラス記号 (+) を選択して 2 つのタスクを追加します。 [Azure IoT Edge] を検索して 2 回追加します。
最初の Azure IoT Edge タスクを選択し、次の値を使用して構成します。
パラメーター 説明 [表示名] 表示名は、アクション フィールドが変更されると自動的に更新されます。 アクション [ Generate deployment manifest
] を選択します。.template.json ファイル パスを指定します: $(System.DefaultWorkingDirectory)/Drop/drop/deployment.template.json
。 このパスはビルド パイプラインから発行されます。既定のプラットフォーム ターゲットの IoT Edge デバイスに基づいて、モジュールの適切なオペレーティング システムを選択します。 出力パス パス $(System.DefaultWorkingDirectory)/Drop/drop/configs/deployment.json
を設定します。 このパスは、最終的な IoT Edge 配置マニフェスト ファイルです。これらの構成は、
deployment.template.json
ファイル内のモジュール イメージ URL を置き換えるのに役立ちます。 また、[Generate deployment manifest]\(配置マニフェストの生成\)は、deployment.template.json
ファイルで定義したのと同じ値に変数を置き換えるのにも役立ちます。 Visual Studio/Visual Studio Code では、.env
ファイルに実際の値を指定します。 Azure Pipelines では、[リリース パイプライン変数] タブで値を設定します。[変数] タブに移動し、次のように名前と値を構成します。- ACR_ADDRESS: Azure Container Registry のログイン サーバー値。 Azure portal で、コンテナー レジストリの概要ページからログイン サーバーを取得できます。
- ACR_PASSWORD: Azure Container Registry のパスワード。
- ACR_USER: Azure Container Registry のユーザー名。
プロジェクトに他の変数がある場合は、このタブでその名前と値を指定できます。[デプロイ マニフェストの生成] で認識できるのは
${VARIABLE}
フレーバー内の変数だけです。*.template.json
ファイルでこのフレーバーを使用していることを確認してください。"registryCredentials": { "<ACR name>": { // Your Azure Container Registry **Registry name** value "username": "${ACR_USER}", "password": "${ACR_PASSWORD}", "address": "${ACR_ADDRESS}" } }
2 つ目の [Azure IoT Edge] タスクを選択し、次の値を使用して構成します。
パラメーター 説明 [表示名] 表示名は、アクション フィールドが変更されると自動的に更新されます。 アクション [ Deploy to IoT Edge devices
] を選択します。デプロイ ファイル パス $(System.DefaultWorkingDirectory)/Drop/drop/configs/deployment.json
を設定します。 このパスは IoT Edge デプロイ マニフェスト ファイルです。Azure サブスクリプション IoT Hub が含まれているサブスクリプションを選択します。 IoT Hub の名称 IoT ハブを選択します。 1 つまたは複数のデバイスを選択 リソース パイプラインを 1 つのデバイスまたは複数のデバイスのどちらにデプロイするかを選択します。 1 つのデバイスにデプロイする場合は、IoT Edge デバイス ID を入力します。 複数のデバイスにデプロイする場合は、デバイスのターゲット条件を指定します。 ターゲット条件とは、IoT Hub 内の一連の IoT Edge デバイスと突き合わせるフィルターです。 デバイス タグを条件として使用する場合は、対応するデバイス タグを IoT Hub デバイス ツインに合わせて更新する必要があります。 詳細設定で、IoT Edge デプロイ ID と IoT Edge デプロイの優先順位を更新します。 複数のデバイスのデプロイを作成する方法の詳細については、IoT Edge 自動デプロイについての理解に関するページを参照してください。 デバイス ID またはターゲット条件 以前の選択に応じて、複数のデバイスにデプロイするためのデバイス ID またはターゲット条件を指定します。 アドバンスド IoT Edge デプロイ ID には、 $(System.TeamProject)-$(Release.EnvironmentName)
を指定します。 この変数により、プロジェクトとリリース名がその IoT Edge デプロイ ID を使用してマッピングされます。パブリック クラウドに表示されないプライベート Docker Trusted Registry に存在するイメージを使用するタスクの場合は、SKIP_MODULE_IMAGE_VALIDATION 環境変数を
true
に設定して、イメージの検証をスキップできます。[保存] を選択して、新しいリリース パイプラインの変更内容を保存します。 メニューで [パイプライン] タブを選択して、パイプライン ビューに戻ります。
注
Azure DevOps の Azure IoT Edge タスクでは、階層化されたデプロイはまだサポートされていません。
ただし、 Azure DevOps で Azure CLI タスク を使用して、階層型デプロイとしてデプロイを作成できます。 インライン スクリプトの値には、az iot edge deployment create コマンドを使用できます。
az iot edge deployment create -d {deployment_name} -n {hub_name} --content modules_content.json --layered true
ビルド パイプラインとリリース パイプラインの IoT Edge CI/CD を検証する
ビルド ジョブをトリガーするには、コミットをソース コード リポジトリにプッシュするか、手動でトリガーできます。 このセクションでは、CI/CD パイプラインを手動でトリガーして、その動作をテストします。 その後、デプロイが成功したことを確認します。
左側のウィンドウ メニューから、[パイプライン] を選択し、この記事の冒頭で作成したビルド パイプラインを開きます。
右上にある [パイプラインの実行] ボタンを選択すると、ビルド パイプラインのビルド ジョブをトリガーできます。
[パイプラインの実行] の設定をレビューします。 次に、 [実行] を選択します。
[エージェントジョブ 1] を選択して、実行の進行状況を監視します。 ジョブを選択すると、ジョブの出力ログをレビューできます。
ビルド パイプラインが正常に完了すると、dev ステージへのリリースがトリガーされます。 dev へのリリースが成功すると、IoT Edge デバイスを対象とする IoT Edge デプロイが作成されます。
開発ステージをクリックすると、リリース ログが表示されます。
パイプラインでエラーが発生した場合は、まずログを確認します。 ログを表示するには、パイプラインの実行の概要に移動し、ジョブとタスクを選択します。 特定のタスクが失敗している場合は、そのタスクのログを確認します。 ログを構成および使用するための詳細な手順については、「ログを確認してパイプラインの問題を診断する」を参照してください。
次のステップ
- 「1 台のデバイスまたは一群のデバイスを対象とした IoT Edge デプロイについて」で IoT Edge デプロイについて理解します。
- 「Deploy and monitor IoT Edge modules at scale (IoT Edge モジュールを大規模にデプロイして監視する)」で、デプロイを作成、更新、または削除するための手順を学習してください。