共用方式為


將持續整合新增至容器組建

重要

這是 Azure Sphere (舊版) 檔。 Azure Sphere(舊版)將於 2027 年 9 月 27 日淘汰,且使用者此時必須移轉至 Azure Sphere(整合式)。 使用位於 TOC 上方的版本選取器來檢視 Azure Sphere (整合式) 檔。

持續整合是一種軟體開發程式,應用程式會持續處於可發行的狀態,方法是提供每個認可給特定程式代碼基底的自動化組建。 您可以將持續整合新增至幾乎任何建置系統,但 GitHub Actions 和 Azure Pipelines 特別方便的兩個。 在本主題中,您將瞭解如何使用 GitHub Actions 或 Azure Pipelines,將使用容器來建置 Azure Sphere 應用程式中所述的 Docker 建置步驟自動化。

使用 GitHub Actions 自動建置您的容器

GitHub Actions 可讓您直接從 GitHub 存放庫自動化建置程式。 因此,使用 GitHub Actions 的第一個步驟是建立或開啟包含應用程式程式代碼的 GitHub 存放庫。 本主題假設您已建立 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 映射指定為基底開發容器,而第二個表示使用該基底容器作為建置環境。 此 COPY 行會將存放庫的內容複製到容器的 /src/ 目錄中。 WORKDIR指定組建目錄。 此命令 RUN 會提供 CMake 命令來產生組建檔案。 最後, ENTRYPOINT 指定應該叫用忍者來實際建置應用程式。

在存放庫的最上層目錄中,建立 .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 azsphere 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

此工作流程只有一個作業—用來建置應用程式;此作業會在 GitHub Actions 執行器上執行,在此案例 ubuntu-latest中為 ,並具有四個步驟:

  1. 步驟 1 Checkout是標準 GitHub 動作,只會將您的存放庫簽出至 ubuntu-latest 執行器。

  2. 步驟 2 會建置映射 (docker build) 並啟動容器 (docker run)。

  3. 步驟 3 會將容器的輸出複製到執行器。

  4. 步驟 4:發佈 HL imagepackage,將高階應用程式 imagepackage 發佈為 成品

將這些變更認可到您的主要分支,然後選取 [ 動作]。 您現在應該會看到標示為「所有工作流程」的頁面,其中至少有一個工作流程正在執行或完成。 如果工作流程成功完成,則旁邊會出現綠色複選標記。 按兩下成功的工作流程,您應該會看到標示為「成品」的方塊,其中包含一個標示為「HL imagepackage」的成品。 下載此成品並解壓縮 imagepackage 檔案;然後 ,您可以建立部署側載應用程式到您的裝置

使用 Azure Pipelines 自動建置您的容器

Azure Pipelines 可讓您直接從 GitHub 存放庫自動執行建置程式(以及其他許多程式代碼存放庫)。 本主題假設您已經屬於具有 Azure DevOps 專案且可存取 Azure Pipelines 的組織。 使用 Azure Pipelines 的第一個步驟是建立或開啟包含應用程式程式代碼的存放庫。 本主題假設您已建立 GitHub 存放庫,其中包含教學課程:建置高階應用程式所產生的 Blink 應用程式

在此存放庫的最上層目錄中,建立 .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 映射指定為基底開發容器,而第二個表示使用該基底容器作為建置環境。 此 COPY 行會將存放庫的內容複製到容器的 /src/ 目錄中。 WORKDIR指定組建目錄。 此命令 RUN 會提供 CMake 命令來產生組建檔案。 最後, ENTRYPOINT 指定應該叫用忍者來實際建置應用程式。

若要建立管線:

  1. 登入您的 Azure DevOps 項目並開啟 Pipelines
  2. 選取 [新增管線],然後在系統詢問您的程式代碼在哪裡時選取 GitHub您可以前往 GitHub 驗證頁面;完成驗證,然後繼續前往頁面以選取您的存放庫。
  3. 選取您的 Blink 存放庫。 系統會帶您前往標題為 設定管線的頁面。
  4. 選取 [入門管線]。 這會使用 Hello, World 工作,開啟存放庫最上層目錄中名為 azure-pipelines.yml 的檔案。
  5. 選取儲存並執行。 接受預設認可訊息,然後再次選取 [ 儲存並執行]。 azure-pipelines.yml檔案會認可至您的 GitHub 存放庫,並建立管線。

以下列內容取代azure-pipelines.yml檔案的內容:

# Docker
# Build a Docker image
# https://learn.microsoft.com/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'

此工作流程只有一個作業—用來建置應用程式;此作業會在 Azure DevOps 代理程式上執行,在此案例 ubuntu-latest中,有兩個步驟:

  1. 步驟 1 會建置映射 (docker build)、啟動容器 (docker run),並將容器的輸出複製到代理程式。

  2. 步驟 2:發佈組建成品,將高階應用程式 imagepackage 發佈為 成品

將這些變更認可到您的主要分支。 在 Azure DevOps 中,再次開啟 Pipelines 。 您應該會看到管線的執行進行中或剛完成。 如果執行顯示綠色複選標記,則組建成功。 選取成功的執行;您應該會在 [相關] 資料行中看到 [1 已發佈]。 下載此成品並解壓縮 imagepackage 檔案;然後 ,您可以建立部署側載應用程式到您的裝置

將持續整合新增至 Azure Sphere 範例應用程式

GitHub Actions 和 Azure Pipelines 旨在將單一專案的組建自動化,例如從 Microsoft範例瀏覽器下載的專案。 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檔案包含下列一行,指向範例存放庫中的共用 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 自動執行。