Azure IoT Edge デバイスに対する継続的インテグレーションと継続的配置 (クラシック エディター)

適用対象:IoT Edge 1.4 チェックマーク IoT Edge 1.4

重要

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 を使用して Azure 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 ソリューションに変更をチェックインするときに必ず自動的に実行されて、ビルド ログを発行するように、パイプラインを構成します。

  1. ご自身の Azure DevOps 組織 (https://dev.azure.com/{your organization}) にサインインして、IoT Edge ソリューションのリポジトリが含まれているプロジェクトを開きます。

    DevOps プロジェクトを開く方法を示すスクリーンショット。

  2. プロジェクトの左側ペインのメニューで、 [パイプライン] を選択します。 ページの中央にある [パイプラインの作成] を選択します。 または、既にビルド パイプラインがある場合は、右上にある [新しいパイプライン] ボタンを選択します。

    新しいビルド パイプラインを作成する方法を示すスクリーンショット。

  3. [コードはどこにありますか?] ページの下部で、 [クラシック エディターを使用] を選択します。 YAML を使用してプロジェクトのビルド パイプラインを作成する場合は、YAML のガイドを参照してください。

    クラシック エディターの使用方法を示すスクリーンショット。

  4. プロンプトに従ってパイプラインを作成します。

    1. 新しいビルド パイプラインのソース情報を入力します。 ソースとして [Azure Repos Git] を選択し、IoT Edge ソリューションのコードが配置されているプロジェクト、リポジトリ、ブランチを選択します。 その後、 [続行] を選択します。

      パイプライン ソースを選択する方法を示すスクリーンショット。

    2. テンプレートではなく、[空のジョブ] を選択します。

      ビルド パイプラインの空のジョブから開始する方法を示すスクリーンショット。

  5. パイプラインが作成されると、パイプライン エディターが表示されます。 ここでは、パイプラインの名前、エージェント プール、およびエージェントの指定を変更できます。

    Microsoft によってホストされているプール、またはユーザーが管理する自己ホスト型プールを選択できます。

    パイプラインの説明で、ターゲット プラットフォームに基づいて適切なエージェントの指定を選択します。

    ビルド エージェントの指定を構成する。

  6. パイプラインは、エージェント ジョブ 1 というジョブで事前に構成されています。 プラス記号 (+) を選択して、ジョブに 4 つのタスクを追加します (Azure IoT Edge 2 回、[ファイルのコピー] 1 回、[ビルド成果物の発行] 1 回)。 各タスクを検索し、タスクの名前の上にマウス ポインターを移動すると、 [追加] ボタンが表示されます。

    Azure IoT Edge タスクを追加する。

    4 つのすべてのタスクを追加すると、エージェントのジョブは次の例のようになります。

    ビルド パイプラインの 4 つのタスク。

  7. 最初の Azure IoT Edge タスクを選択して編集します。 このタスクでは、指定したターゲット プラットフォームを使用してソリューション内のすべてのモジュールをビルドします。 次の値を使用してタスクを編集します。

    パラメーター 説明
    表示名 表示名は、アクション フィールドが変更されると自動的に更新されます。
    アクション [モジュール イメージをビルドする] を選択します。
    .template.json ファイル 省略記号 (...) を選択し、IoT Edge ソリューションが含まれているリポジトリ内の deployment.template.json ファイルに移動します。
    既定のプラットフォーム ターゲットの IoT Edge デバイスに基づいて、モジュールの適切なオペレーティング システムを選択します。
    出力変数 deployment.json ファイルによって生成されるファイル パスに関連付ける参照名を指定します (edge など)。

    このタスクとそのパラメーターの詳細については、「Azure IoT Edge タスク」を参照してください。

    これらの構成では、module.json ファイルで定義されているイメージ リポジトリとタグを使用して、モジュール イメージに名前とタグを付けます。 また、 [Build module images](モジュール イメージのビルド) は、module.json ファイルで定義するのと同じ値に変数を置き換えるのにも役立ちます。 Visual Studio または Visual Studio Code では、.env ファイルに実際の値を指定します。 Azure Pipelines では、 [パイプライン変数] タブで値を設定します。パイプライン エディターのメニューの [変数] タブを選択し、次のように名前と値を構成します。

    • ACR_ADDRESS:Azure Container Registry のログイン サーバー値。 ログイン サーバーの値は、Azure portal のコンテナー レジストリの概要ページで確認できます。

    プロジェクトに他の変数がある場合は、このタブでその名前と値を指定できます。 [Build module images](モジュール イメージのビルド) では、${VARIABLE} 形式の変数のみが認識されます。 **/module.json ファイルでこの形式を使用していることを確認してください。

  8. 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 タスク」を参照してください。

    モジュール イメージをホストするコンテナー レジストリが複数ある場合は、このタスクを複製し、別のコンテナー レジストリを選択し、 [詳細] 設定の [モジュールをバイパス] を使用して、この特定のレジストリ用ではないイメージをバイパスする必要があります。

  9. [Copy Files](ファイルのコピー) タスクを選択してそれを編集します。 このタスクは、成果物のステージング ディレクトリにファイルをコピーする場合に使用します。

    パラメーター 説明
    表示名 既定の名前を使用するか、カスタマイズします
    ソース フォルダー コピーするファイルが含まれているフォルダー。
    内容 deployment.template.json**/module.json の 2 つの行を追加します。 これらの 2 つのファイルは、IoT Edge 配置マニフェストを生成するための入力となります。
    ターゲット フォルダー 変数 $(Build.ArtifactStagingDirectory) を指定します。 内容については、「ビルド変数」を参照してください。

    このタスクとそのパラメーターの詳細については、「ファイルのコピー タスク」を参照してください。

  10. [Publish Build Artifacts] タスクを選択して編集します。 タスクにビルド成果物のステージング ディレクトリ パスを指定し、そのパスがリリース パイプラインに発行できるようにします。

    パラメーター 説明
    表示名 既定の名前を使用するか、カスタマイズします。
    公開するためのパス 変数 $(Build.ArtifactStagingDirectory) を指定します。 詳細については、「ビルド変数」を参照してください。
    アーティファクト名 既定の名前 (drop) を使用します。
    成果物の公開場所 既定の場所を使用します:Azure Pipelines

    このタスクとそのパラメーターの詳細については、「ビルド成果物の発行タスク」を参照してください。

  11. [トリガー] タブを開いて、[継続的インテグレーションを有効にする] チェック ボックスをオンにします。 ご自身のコードを含むブランチを含まれていることを確認します。

継続的インテグレーション トリガーを有効にする方法を示すスクリーンショット。

  1. [保存してキューに登録] ドロップダウンから [保存] を選択します。

これでこのパイプラインは、新しいコードをリポジトリにプッシュすると自動的に実行されるように構成されました。 最後のタスクであるパイプライン成果物の発行では、リリース パイプラインをトリガーします。 次のセクションに進んで、リリース パイプラインをビルドします。

継続的デプロイのためのリリース パイプラインを作成する

このセクションでは、ビルド パイプラインで成果物を削除すると自動的に実行されるように構成されたリリース パイプラインを作成します。その後、Azure Pipelines にデプロイ ログが表示されます。

新しいパイプラインを作成し、新しいステージを追加します。

  1. [パイプライン][リリース] タブで、 [+ 新しいパイプライン] を選択します。 または、既にリリース パイプラインがある場合は、[+ 新規] ボタンを選択し、[+ 新しいリリース パイプライン] を選択します。

    [+ 新しいパイプライン] ボタンを使用してリリース パイプラインを追加する

  2. テンプレートを選択するよう求められたら、[空のジョブ] を選択します。

    リリース パイプラインの作成を空のジョブから開始する

  3. ステージ 1 という 1 つのステージを持つ新しいリリース パイプラインが初期化されます。 ステージ 1 の名前を dev に変更し、お使いの開発環境用の継続的デプロイ パイプラインとして扱います。 通常、継続的デプロイ パイプラインには、devstagingprod の複数のステージがあります。使用する DevOps 手法に応じて、別の名前を使用したり、さらに作成したりできます。 名前を変更した後、ステージの詳細ウィンドウを閉じます。

    上部にある "新しいリリース パイプライン" のテキストを選択して、リリース パイプラインの名前を変更することもできます。

  4. ビルド パイプラインによって発行されているビルド成果物に、リリースをリンクします。 成果物領域で [追加] をクリックします。

    インターフェイスの成果物領域で [追加] をクリックします。

  5. [成果物の追加] ページで、 [ソースの種類] として [ビルド] を選択します。 作成したプロジェクトとビルド パイプラインを選択します。 [ソース エイリアス] は、必要に応じてわかりやすいものに変更できます。 その後、 [追加] を選択します。

    成果物の追加ページで [追加] を選択して成果物を作成する

  6. 成果物トリガーを開き、切り替えを選択して継続的デプロイ トリガーを有効にします。 これで、新しいビルドが利用可能になるたびに新しいリリースが作成されるようになります。

    成果物トリガーを開き、継続的デプロイ トリガーを有効に切り替える

  7. dev ステージは、1 つのジョブ、0 個のタスクで、事前に構成されています。 パイプライン メニューから [タスク] を選択し、[dev] ステージを選択します。 [エージェント ジョブ] を選択し、その [表示名]QA に変更します。 エージェント ジョブの詳細を構成できますが、デプロイ タスクはプラットフォームに依存しないため、選択した [エージェント プール] で任意の [エージェント仕様] を使用できます。

    [タスク] タブで dev ステージのタスクを表示する

  8. QA ジョブで、プラス記号 ( + ) を選択して 2 つのタスクを追加します。 [Azure IoT Edge] を検索して 2 回追加します。

  9. 最初の 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}"
      }
    }
    

    [変数] タブでリリース パイプラインの変数を構成する

  10. 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 デプロイ IDIoT Edge デプロイの優先順位を更新します。 複数のデバイスのデプロイを作成する方法の詳細については、IoT Edge 自動デプロイについての理解に関するページを参照してください。
    デバイス ID またはターゲット条件 以前の選択に応じて、複数のデバイスにデプロイするためのデバイス ID またはターゲット条件を指定します。
    詳細設定 IoT Edge デプロイ ID には、$(System.TeamProject)-$(Release.EnvironmentName) を指定します。 この変数により、プロジェクトとリリース名がその IoT Edge デプロイ ID を使用してマッピングされます。

    パブリック クラウドに表示されないプライベート Docker Trusted Registry に存在するイメージを使用するタスクの場合は、SKIP_MODULE_IMAGE_VALIDATION 環境変数を true に設定して、イメージの検証をスキップできます。

    dev ステージに Azure IoT Edge タスクを追加する

  11. [保存] を選択して、新しいリリース パイプラインの変更内容を保存します。 メニューで [パイプライン] タブを選択して、パイプライン ビューに戻ります。

注意

階層型配置は、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. 左側のウィンドウ メニューから、 [パイプライン] を選択し、この記事の冒頭で作成したビルド パイプラインを開きます。

  2. 右上にある [パイプラインの実行] ボタンを選択すると、ビルド パイプラインのビルド ジョブをトリガーできます。

    [パイプラインの実行] ボタンを使用してビルド パイプラインを手動でトリガーする

  3. [パイプラインの実行] の設定をレビューします。 次に、 [実行] を選択します。

    パイプラインの実行オプションを指定し、[実行] を選択する

  4. [エージェントジョブ 1] を選択して、実行の進行状況を監視します。 ジョブを選択すると、ジョブの出力ログをレビューできます。

    ジョブのログ出力をレビューする

  5. ビルド パイプラインが正常に完了すると、dev ステージへのリリースがトリガーされます。 dev へのリリースが成功すると、IoT Edge デバイスを対象とする IoT Edge デプロイが作成されます。

    dev へのリリース

  6. リリース ログを確認するには、[dev] ステージをクリックします。

    リリース ログ

  7. パイプラインでエラーが発生した場合は、まずログを確認します。 ログを表示するには、パイプラインの実行の概要に移動し、ジョブとタスクを選択します。 特定のタスクが失敗している場合は、そのタスクのログを確認します。 ログを構成および使用するための詳細な手順については、「ログを確認してパイプラインの問題を診断する」を参照してください。

次のステップ