将持续集成添加到容器生成
重要
这是 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 是一个标准 GitHub 操作,
Checkout
只需将存储库签出到 ubuntu 最新运行程序即可。步骤 2 生成映像(
docker build
)并启动容器(docker run
)。步骤 3 将容器的输出复制到运行程序。
步骤 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 以实际生成应用程序。
若要创建管道
- 登录到 Azure DevOps 项目并打开 Pipelines。
- 选择“新建管道”,然后在系统询问代码的位置时选择 GitHub?可能会访问 GitHub 身份验证页;完成身份验证并继续转到页面以选择存储库。
- 选择 Blink 存储库。 你被带到标题为“配置管道”的页面。
- 选择“初学者管道”。 这会使用 Hello, World 任务在存储库的顶级目录中打开名为azure-pipelines.yml的文件。
- 选择保存并运行。 接受默认提交消息,然后再次选择“保存并运行”。 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 生成映像(
docker build
)、启动容器(docker run
),并将容器的输出复制到代理。步骤 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 自动执行之前,请验证项目是否在本地生成。