コンテナー ビルドに継続的インテグレーションを追加する
継続的インテグレーションは、特定のコード ベースへのコミットごとに自動ビルドを提供することで、アプリケーションを継続的にリリース可能な状態に保つソフトウェア開発プロセスです。 ほぼすべてのビルド システムに継続的インテグレーションを追加できますが、特に便利な 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、 は、
Checkout
リポジトリを ubuntu-latest ランナーにチェックアウトするだけの標準的な GitHub アクションです。手順 2 では、イメージ (
docker build
) をビルドし、コンテナー (docker run
) を開始します。手順 3 では、コンテナーからランナーに出力をコピーします。
手順 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 を呼び出す必要があることを指定します。
パイプラインを作成するには:
- Azure DevOps プロジェクトにログインし、[ パイプライン] を開きます。
- [新しいパイプライン] を選択し、[コードはどこにありますか] というメッセージが表示されたら、[GitHub] を選択します。GitHub 認証ページに移動する場合があります。認証を完了し、ページに進んでリポジトリを選択します。
- Blink リポジトリを選択します。 [ パイプラインの構成] というタイトルのページが表示されます。
- [ スターター パイプライン] を選択します。 これにより、リポジトリの最上位ディレクトリに azure-pipelines.yml という名前のファイルが開き、Hello、World タスクが表示されます。
- [ 保存して実行] を選択します。 既定のコミット メッセージをそのまま使用し、もう一度 [保存して実行] を選択します。 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 では、イメージ (
docker build
) をビルドし、コンテナー (docker run
) を起動し、コンテナーからエージェントに出力をコピーします。手順 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で自動化を試みる前に、プロジェクトがローカルにビルドされていることを確認します。