将持续集成添加到容器生成

重要

这是 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 应用程序:生成高级应用程序 ,并且你的项目名为“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 指定应调用 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 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 是一个标准 GitHub 操作, Checkout只需将存储库签出到 ubuntu 最新运行程序即可。

  2. 步骤 2 生成映像(docker build)并启动容器(docker run)。

  3. 步骤 3 将容器的输出复制到运行程序。

  4. 步骤 4,发布 HL imagepackage,将高级应用程序 imagepackage 发布为 项目

将这些更改提交到主分支,然后选择“ 操作”。 现在应会看到一个标记为“所有工作流”的页面,其中至少有一个工作流正在运行或已完成。 如果工作流成功完成,则会在工作流旁边显示绿色复选标记。 单击成功的工作流,应会看到一个标记为“Artifacts”的框,其中包含一个标记为“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 指定应调用 ninja 以实际生成应用程序。

若要创建管道

  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'

此工作流只有一个作业 , 用于生成应用程序;在本例ubuntu-latest中,作业在 Azure DevOps 代理上运行,并具有两个步骤:

  1. 步骤 1 生成映像(docker build)、启动容器(docker run),并将容器的输出复制到代理。

  2. 步骤 2:发布生成项目,将高级应用程序映像包发布为 项目

将这些更改提交到主分支。 在 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 自动执行之前,请验证项目是否在本地生成。