Azure IoT Edge デバイスに対する継続的インテグレーションと継続的配置

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

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

Azure Pipelines 内の組み込み Azure IoT Edge タスクを使用して、Azure IoT Edge アプリケーションで DevOps を簡単に導入できます。 この記事では、YAML を使用して、Azure Pipelines で Azure IoT Edge モジュールをビルド、テスト、およびデプロイする方法について説明します。 別の方法として、クラシック エディターを使用することもできます。

開発と運用のための継続的インテグレーションと継続的開発ブランチの図。

この記事では、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 デバイスを作成することができます

Azure Repos の使用に関する詳細については、「Share your code with Visual Studio and Azure Repos (自分のコードを Visual Studio と Azure Repos に共有する)」を参照してください。

継続的インテグレーションのためのビルド パイプラインを作成する

このセクションでは、新しいビルド パイプラインを作成します。 サンプルの IoT Edge ソリューションへの変更をチェックインするときに自動的に実行し、ビルド ログを発行するように、パイプラインを構成します。

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

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

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

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

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

  4. パイプラインを作成するリポジトリを選択します。

    ビルド パイプラインのリポジトリを選択する方法を示すスクリーンショット。

  5. [パイプラインの構成] ページで、[スタート パイプライン] を選択します。 このパイプラインの作成に使用する Azure Pipelines の YAML ファイルが既に存在する場合は、[既存の Azure Pipelines の YAML ファイル] を選択して、リポジトリ内のファイルへのブランチとパスを指定することができます。

    [スタート パイプライン] または [既存の Azure Pipelines の YAML ファイル] を選択して、ビルド パイプラインの構成を開始する

  6. [パイプラインの YAML の確認] ページで、既定の名前 azure-pipelines.yml を選択すると、パイプラインの構成ファイルの名前を変更できます。

    [アシスタントの表示] を選択して、[タスク] パレットを開きます。

    [アシスタントの表示] を選択してタスク パレットを開く方法を示すスクリーンショット。

  7. タスクを追加するには、YAML の末尾にカーソルを合わせるか、タスクの指示を追加する場所にカーソルを合わせます。 [Azure IoT Edge] を検索して選択します。 次のように、タスクのパラメーターを入力します。 その後、 [追加] を選択します。

    パラメーター 説明
    アクション [モジュール イメージをビルドする] を選択します。
    .template.json ファイル IoT Edge ソリューションが含まれているリポジトリ内の deployment.template.json ファイルへのパスを指定します。
    既定のプラットフォーム ターゲットの IoT Edge デバイスに基づいて、モジュールの適切なオペレーティング システムを選択します。

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

    [タスクの使用] パレットと、パイプラインにタスクを追加する方法を示すスクリーンショット。

    ヒント

    各タスクを追加すると、追加された行がエディターによって自動的に強調表示されます。 誤って上書きされないようにするには、さらにタスクを追加する前に、行の選択を解除して、次のタスクを新たに追加できる状態にします。

  8. 次のパラメーターを使用してこの手順を繰り返し、さらに 3 つのタスクを追加します。

    • タスク: Azure IoT Edge

      パラメーター 説明
      アクション [モジュール イメージをプッシュする] を選択します。
      コンテナー レジストリの種類 既定の種類を使用します: Azure Container Registry
      Azure サブスクリプション サブスクリプションを選択します。
      Azure Container Registry パイプラインに使用するレジストリを選択します。
      .template.json ファイル IoT Edge ソリューションが含まれているリポジトリ内の deployment.template.json ファイルへのパスを指定します。
      既定のプラットフォーム ターゲットの IoT Edge デバイスに基づいて、モジュールの適切なオペレーティング システムを選択します。

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

    • タスク: ファイルをコピーする

      パラメーター 説明
      [同期元フォルダー] コピー元のソース フォルダー。 空にすると、リポジトリのルートとなります。 ファイルがリポジトリに存在しない場合は、変数を使用します。 例: $(agent.builddirectory)
      内容 deployment.template.json**/module.json の 2 つの行を追加します。
      ターゲット フォルダー 変数 $(Build.ArtifactStagingDirectory) を指定します。 内容については、「ビルド変数」を参照してください。

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

    • タスク: ビルド成果物の公開

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

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

  9. 右上にある [保存および実行] ドロップダウンから [保存] を選択します。

  10. この YAML パイプラインでは、継続的インテグレーションのトリガーが既定で有効になっています。 これらの設定を編集する場合は、パイプラインを選択し、右上の [編集] を選択します。 右上の [実行] ボタンの横にある [その他の操作] を選択し、[トリガー] に移動します。 パイプライン名の下の [継続的インテグレーション] が有効と表示されます。 トリガーの詳細を確認するには、[YAML の継続的インテグレーション トリガーをここからオーバーライドする] ボックスをオンにします。

[その他のアクション] の [トリガー] メニューからパイプラインのトリガー設定を確認する方法を示すスクリーンショット。

次のセクションに進んで、リリース パイプラインをビルドします。

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

このセクションでは、ビルド パイプラインで成果物を削除すると自動的に実行されるように構成されたリリース パイプラインを作成します。その後、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. [保存] を選択して、新しいリリース パイプラインの変更内容を保存します。 メニューで [パイプライン] タブを選択して、パイプライン ビューに戻ります。

ビルド パイプラインとリリース パイプラインの IoT Edge CI/CD を検証する

ビルド ジョブをトリガーするには、コミットをソース コード リポジトリにプッシュするか、手動でトリガーできます。 このセクションでは、CI/CD パイプラインを手動でトリガーして、その動作をテストします。 その後、デプロイが成功したことを確認します。

  1. 左側のウィンドウ メニューから、[パイプライン] を選択し、この記事の冒頭で作成したビルド パイプラインを開きます。

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

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

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

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

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

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

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

    dev へのリリース

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

    リリース ログ

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

次のステップ