次の方法で共有


コンテナー ビルドに継続的インテグレーションを追加する

継続的インテグレーションは、特定のコード ベースへのコミットごとに自動ビルドを提供することで、アプリケーションを継続的にリリース可能な状態に保つソフトウェア開発プロセスです。 ほぼすべてのビルド システムに継続的インテグレーションを追加できますが、特に便利な 2 つがGitHub Actionsと Azure Pipelines です。 このトピックでは、「コンテナーを使用して Azure Sphere アプリを構築する」で説明されている Docker ビルド手順を自動化するために、GitHub Actionsまたは Azure Pipelines を使用する方法について説明します。

GitHub Actionsを使用してコンテナーを自動的にビルドする

GitHub Actions、GitHub リポジトリから直接ビルド プロセスを自動化できます。 したがって、GitHub Actionsを使用する最初の手順は、アプリケーション コードを含む GitHub リポジトリを作成または開く方法です。 このトピックでは、「 チュートリアル: 高度 なアプリケーションをビルドする」で生成された Blink アプリケーションを含む GitHub リポジトリを作成し、プロジェクトの名前が "Blink" であることを前提としています。 継続的インテグレーション プロジェクトと同様に、プロセスの自動化を試みる前に、プロジェクトがローカルにビルドされ、予想される成果物が提供されていることを確認してください。 この例では、ビルドが成功した後、ディレクトリに out Blink.imagepackage ファイルが含まれていると想定しています。

GitHub リポジトリの最上位ディレクトリで、.devcontainer という名前のディレクトリを作成し、そのディレクトリに Dockerfile という名前のファイルを次の内容で作成します。

FROM mcr.microsoft.com/azurespheresdk:latest AS dev

FROM dev AS build
COPY ./ /src/
WORKDIR /out
RUN cmake -G "Ninja" -DCMAKE_TOOLCHAIN_FILE="/opt/azurespheresdk/CMakeFiles/AzureSphereToolchain.cmake" \
    -DAZURE_SPHERE_TARGET_API_SET="latest-lts" -DCMAKE_BUILD_TYPE="Release" "/src"
ENTRYPOINT [ "ninja" ]

最初 FROM の行では、基本開発コンテナーとして標準の Azure Sphere Docker イメージを指定し、2 番目の行では、その基本コンテナーをビルド環境として使用することを示します。 行は COPY 、リポジトリの内容をコンテナーの /src/ ディレクトリにコピーします。 は WORKDIR 、ビルド ディレクトリを指定します。 このコマンドは RUN 、ビルド ファイルを生成する CMake コマンドを提供します。 最後に、 は ENTRYPOINT 、実際にアプリケーションをビルドするために ninja を呼び出す必要があることを指定します。

リポジトリの最上位ディレクトリで、.github/workflows ディレクトリを作成し、ci.yml という名前のファイルを次の内容で追加します。

# This is a basic workflow to help you get started with Actions

name: ContinuousIntegration

# Controls when the action will run. Triggers the workflow on push or pull request
# events, but including workflow_dispatch also allows manual execution
on:
  push:
  pull_request:
  workflow_dispatch:


jobs:
  build:
    runs-on: ubuntu-latest
    name: Build Azure Sphere Apps
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Build image for az sphere builds and Start container from build image
      run: |
        docker build --target build -t hlbuildimage -f .devcontainer/Dockerfile .
        docker run --name hlbuildcontainer hlbuildimage
    - name: Copy container build output
      run:
        docker cp hlbuildcontainer:/out HLOutput
    - name: Publish HL imagepackage
      uses: actions/upload-artifact@v2
      with:
        name: HL imagepackage
        path: ${{ github.workspace }}/HLOutput/Blink.imagepackage

このワークフローには、アプリケーションをビルドするためのジョブが 1 つだけです。ジョブは、GitHub Actions ランナー (この場合ubuntu-latest) で実行され、次の 4 つの手順があります。

  1. 手順 1、 は、 Checkoutリポジトリを ubuntu-latest ランナーにチェックアウトするだけの標準的な GitHub アクションです。

  2. 手順 2 では、イメージ (docker build) をビルドし、コンテナー (docker run) を開始します。

  3. 手順 3 では、コンテナーからランナーに出力をコピーします。

  4. 手順 4. HL イメージ パッケージを発行し、高レベルのアプリケーション イメージ パッケージを 成果物として発行します。

これらの変更を メイン ブランチにコミットし、[アクション] を選択します。 [すべてのワークフロー] というラベルの付いたページが表示され、少なくとも 1 つのワークフローが実行または完了します。 ワークフローが正常に完了すると、その横に緑色のチェックマークが表示されます。 成功したワークフローをクリックすると、"HL imagepackage" というラベルが付いた 1 つの成果物が含まれる "Artifacts" というラベルの付いたボックスが表示されます。 この成果物をダウンロードし、imagepackage ファイルをアンパックします。その後、 デプロイを作成 するか 、アプリケーションをデバイスにサイドロードできます

Azure Pipelines を使用してコンテナーを自動的に構築する

Azure Pipelines を使用すると、GitHub リポジトリ (およびその他の多くのコード リポジトリ) から直接ビルド プロセスを自動化できます。 このトピックでは、Azure DevOps プロジェクトを持つorganizationに既に属しており、Azure Pipelines にアクセスできるものとします。 Azure Pipelines を使用する最初の手順は、アプリケーション コードを含むリポジトリを作成または開く方法です。 このトピックでは、「 チュートリアル: 高度なアプリケーションを構築する」で生成された Blink アプリケーションを含む GitHub リポジトリを作成していることを前提としています。

このリポジトリの最上位ディレクトリで、.devcontainer ディレクトリを作成し、そのディレクトリに次の内容を含む Dockerfile ファイルを作成します。

FROM mcr.microsoft.com/azurespheresdk:latest AS dev

FROM dev AS build
COPY ./ /src/
WORKDIR /out
RUN cmake -G "Ninja" -DCMAKE_TOOLCHAIN_FILE="/opt/azurespheresdk/CMakeFiles/AzureSphereToolchain.cmake" \
    -DAZURE_SPHERE_TARGET_API_SET="latest-lts" -DCMAKE_BUILD_TYPE="Release" "/src"
ENTRYPOINT [ "ninja" ]

最初 FROM の行では、基本開発コンテナーとして標準の Azure Sphere Docker イメージを指定し、2 番目の行では、その基本コンテナーをビルド環境として使用することを示します。 行は COPY 、リポジトリの内容をコンテナーの /src/ ディレクトリにコピーします。 は WORKDIR 、ビルド ディレクトリを指定します。 このコマンドは RUN 、ビルド ファイルを生成する CMake コマンドを提供します。 最後に、 は ENTRYPOINT 、実際にアプリケーションをビルドするために ninja を呼び出す必要があることを指定します。

パイプラインを作成するには:

  1. Azure DevOps プロジェクトにログインし、[ パイプライン] を開きます。
  2. [新しいパイプライン] を選択し、[コードはどこにありますか] というメッセージが表示されたら、[GitHub] を選択します。GitHub 認証ページに移動する場合があります。認証を完了し、ページに進んでリポジトリを選択します。
  3. Blink リポジトリを選択します。 [ パイプラインの構成] というタイトルのページが表示されます。
  4. [ スターター パイプライン] を選択します。 これにより、リポジトリの最上位ディレクトリに azure-pipelines.yml という名前のファイルが開き、Hello、World タスクが表示されます。
  5. [ 保存して実行] を選択します。 既定のコミット メッセージをそのまま使用し、もう一度 [保存して実行] を選択します。 azure-pipelines.yml ファイルは GitHub リポジトリにコミットされ、パイプラインが作成されます。

azure-pipelines.yml ファイルの内容を次の内容に置き換えます。

# Docker
# Build a Docker image
# /azure/devops/pipelines/languages/docker

trigger:
- main

resources:
- repo: self

variables:
  tag: '$(Build.BuildId)'

stages:
- stage: Build
  displayName: Build image
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - bash: docker build --target build -t hlbuildimage -f .devcontainer/Dockerfile . &&  docker run --name hlbuildcontainer hlbuildimage && docker cp hlbuildcontainer:/out $(Build.ArtifactStagingDirectory)/HLOutput
      displayName: Build high-level Azure Sphere application in a container and copy the output
    - task: PublishBuildArtifacts@1
      displayName: Publish build artifacts
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)/HLOutput/Blink.imagepackage'
        ArtifactName: 'BlinkSample.imagepackage'
        publishLocation: 'Container'

このワークフローには、アプリケーションをビルドするためのジョブが 1 つだけです。ジョブは Azure DevOps エージェント (この場合 ubuntu-latest) で実行され、次の 2 つの手順があります。

  1. 手順 1 では、イメージ (docker build) をビルドし、コンテナー (docker run) を起動し、コンテナーからエージェントに出力をコピーします。

  2. 手順 2. ビルド 成果物を発行し、高レベルのアプリケーション イメージ パッケージを 成果物として発行します。

これらの変更を メイン ブランチにコミットします。 Azure DevOps で、もう一度 [パイプライン] を開きます。 パイプラインの実行が進行中か、完了したばかりの状態が表示されます。 実行に緑色のチェックマークが表示された場合、ビルドは成功しました。 成功した実行を選択します。[関連] 列に [発行済み] が 1 つ表示されます。 この成果物をダウンロードし、imagepackage ファイルを解凍します。その後、 デプロイを作成 するか 、アプリケーションをデバイスにサイドロードできます

Azure Sphere サンプル アプリケーションへの継続的インテグレーションの追加

GitHub Actionsと Azure Pipelines は、Microsoft サンプル ブラウザーからダウンロードしたプロジェクトなど、1 つのプロジェクトのビルドを自動化するためのものです。 GitHub の Azure Sphere サンプル は、一部の共有リソースを持つプロジェクトのコレクションです。 これらのサンプルのいずれかを継続的インテグレーションで使用するには、必要な共有リソースを組み込む必要があります。 通常、これは少なくともプロジェクトの最上位ディレクトリに HardwareDefinitions ディレクトリを作成し、ローカル コピーを指すように CMakeLists.txt ファイルを編集することを意味します。 たとえば、HelloWorld/HelloWorld_HighLevelApp サンプルに基づいてプロジェクトを作成した場合、最上位ディレクトリは最初は次のようになります。

.vscode
.gitignore
applibs_versions.h
app_manifest.json
CMakeLists.txt
CMakeSettings.json
launch.vs.json
LICENSE.txt
main.c
README.md

CMakeLists.txt ファイルには、Samples リポジトリ内の共有 HardwareDefinitions ディレクトリを指す次の行が含まれています。

azsphere_target_hardware_definition(${PROJECT_NAME} TARGET_DIRECTORY "../../../HardwareDefinitions/mt3620_rdb" TARGET_DEFINITION "sample_appliance.json")

プロジェクトのビルドを有効にするには、HardwareDefinitions フォルダーを最上位のディレクトリにコピーし、CMakeLists.txt ファイルを編集してローカルの場所を使用します。

azsphere_target_hardware_definition(${PROJECT_NAME} TARGET_DIRECTORY "HardwareDefinitions/mt3620_rdb" TARGET_DEFINITION "sample_appliance.json")

ここでも、GitHub Actionsで自動化を試みる前に、プロジェクトがローカルにビルドされていることを確認します。