概述
在不断发展的嵌入式系统开发领域,支持自动化和高效的工作流程变得越来越重要。本文将探讨如何使用 GitHub Actions、Docker、MCUXpresso SDK 和 Visual Studio Code 为嵌入式项目量身打造一个强大的 CI/CD 管道。通过集成这些工具,开发人员可以自动构建、运行测试,并确保在不同团队和环境中一致地交付固件。
我们首先概述了 CI/CD 在嵌入式工作流程中的优势,包括更快的迭代周期、减少人为错误以及增强协作。接下来,我们深入探讨实际设置:使用 Docker 封装构建环境,利用 GitHub Actions 协调构建和测试,以及在 VS Code 中借助 MCUXpresso SDK 来管理和开发固件项目。真实案例和可重复使用的模板将引导读者创建一个可扩展、可维护且针对基于恩智浦的开发板进行了优化的管道。
无论您是希望实现工作流程现代化的嵌入式工程师,还是希望缩短交付时间的产品经理,本指南都将帮助您在开发生命周期中利用自动化的力量。
前提条件
目录
在嵌入式系统开发中实施持续集成和持续部署 (CI/CD) 具有变革性优势,尤其是在使用 MCUXpresso SDK 等复杂工具链和特定硬件限制时。以下是主要优势:
CI/CD 管道通过自动编译、链接和闪存流程,消除了手动构建步骤。这可确保每次代码更改都能在一致的构建环境中得到验证,从而降低人为错误的风险,节省宝贵的工程时间。
通过将自动单元测试、静态分析和在环硬件 (HIL) 测试集成到管道中,开发者可以在错误和回归进入生产硬件前及早发现。这将使固件更加稳定,减少集成过程中的意外情况。
使用 Docker 对构建环境进行容器化,可确保开发机器和 CI 运行程序之间的一致性。开发人员不再需要担心工具链版本不匹配或依赖项缺失的问题,一切都已定义并可重现。
CI/CD 鼓励频繁提交和拉取请求,这些请求会自动验证。这促进了团队成员间更好的协作,执行编码标准,并确保只有经过测试的代码被合并到主分支中。
借助自动化管道,固件更新可以快速构建、测试并部署到目标设备或暂存环境中。这加快了开发周期,实现了快速原型开发,尤其适用于敏捷或迭代开发模式。
CI/CD 系统会记录每一次构建、测试结果和部署,从而提供清晰的更改历史记录。这对于在汽车或医疗设备等受监管行业中进行调试、确保合规性和维持高质量标准至关重要。
管道一旦建立,就可以在多个嵌入式项目中重复使用或调整。这种可扩展性减少了新板或应用程序的设置时间,并促进了团队之间的最佳实践。
容器是轻量级、可移植的软件单元,它将代码与其所有依赖项、库和配置文件组成一个代码包,因此可以在不同的计算环境中可靠地运行。
将容器视为一个独立的盒子,其中包含应用程序运行所需的一切。有几个平台可以用来容器化工作区。本指南将重点介绍 Docker。
Docker 是一个开源平台,它使开发人员能够在容器中构建、打包和运行应用程序。它简化了创建隔离环境的过程,该环境包括应用程序在不同系统上持续运行所需的代码、库、工具和设置等所有内容。
Docker 的核心是确保开发、测试和部署环境相同,无论您是在本地还是在云中工作,都能帮助解决“它在我的机器上运行”的问题。
使用 Docker 对 MCUXpresso SDK 和构建系统进行容器化需要以下组件。
Dockerfile - 这是一个文本文件,其中定义了构建 Docker 镜像的步骤,例如安装软件包、复制文件和设置环境变量。
Docker 镜像 - 这是容器环境的快照。它由 Dockerfile 构建,用于创建容器。
Docker 容器 - Docker 镜像的运行实例。它具有隔离性、轻便性和便携性。
编写 dockerfile
1. 打开文本编辑器(例如 VS Code)
2. 创建一个新的文本文件。将其命名为 dockerfile。将此文件保存为 Docker 文件类型。
3. 创建用于容器化 MCUXpresso SDK 和构建系统的 dockerfile 时,必须指定所需的所有元器件。我们在下面提供了一个模板,你可以复制并粘贴到 dockerfile 中。
该模板的用途:
- 使用 Ubuntu 22.04 作为容器的基础。这为构建和运行嵌入式工具提供了稳定的 Linux 环境。
- 防止安装期间出现交互式提示
- 安装使用 MCUXpresso SDK 所需的所有软件包(部分为可选软件包)
安装 ARM GNU 13.2 工具链
- 设置一个工作区,以便使用 West 克隆 MCUXpresso SDK
- 配置工具链路径环境变量
# Use Ubuntu 22.04 as the base image
FROM ubuntu:22.04
# Set environment variables for non-interactive installations
ENV DEBIAN_FRONTEND=noninteractive
# Install necessary packages /some optional
RUN apt update && apt install -y \
curl \
wget \
ca-certificates \
xz-utils \
libncurses5 \
cmake \
ninja-build \
git \
python3 \
python3-pip \
build-essential \
device-tree-compiler \
unzip \
&& rm -rf /var/lib/apt/lists/*
# ===========================================================================================================
# Notes on flags used:
# (-LO) follows http redirects and saves the downloaded file with same name as in URL
# (-k) ignores SSL certificate verification. This is needed when system security prevents certain actions
# Contact IT to whitelist arm servers if needed.
# ============================================================================================================
RUN curl -LO -k https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz && \
tar xf arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz && \
rm arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz
# Install additional Python packages
RUN pip3 install --upgrade west imgtool requests
# Set the workspace directory
WORKDIR /workspace
# Clone the mcuxsdk-manifests repository
RUN git clone https://github.com/nxp-mcuxpresso/mcuxsdk-manifests.git
# Set the MCUXpresso SDK path environment variable
ENV MCUX_SDK_PATH=/workspace/mcuxsdk-manifests
# Initialize and update the west workspace
RUN cd $MCUX_SDK_PATH && \
west init -l . && \
west update
# ARMGCC ENV variable
ENV ARMGCC_DIR=/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi
# Default command: Start a shell
CMD ["/bin/bash"]
构建容器映像
在继续之前,建议设置一个 GitHub 存储库并配置凭据,以便在后续步骤中使用。
1. 创建一个新的存储库。暂时留空。稍后,它将包含以下项目:
2. 生成个人访问令牌(PAT)。这将允许您访问 GitHub API。
- 点击“我的”图标
- 选择设置 > 开发者设置 > 个人访问令牌 > 令牌(经典版)
- 选择“生成新令牌(经典)”
- 范围可以根据您的需求自定义。请在本指南中使用以下范围:delete:packages、repo、write:packages
- 点击“生成令牌”。生成令牌后,请务必复制并保存该令牌。
- 然后,将个人访问令牌 (PAT) 存储为 GitHub 密钥。GitHub 密钥将用于工作流文件中的身份验证。这样做是为了在不修改工作流文件的情况下提高可重用性、安全性和轮换性。
- 导航到已创建的存储库,然后单击“设置”。
- 选择密钥和变量,然后单击操作。
- 我们将在此处添加 2 个密钥。一个是用户名,另一个是个人访问令牌。点击“新建存储库密钥”。
用户名的密钥 - 这可以个性化定制。然而,在本指南稍后将介绍的工作流文件中,该变量设置为 GH_USERNAME。将名称设置为 GH_USERNAME。在 “密钥” 字段中输入您的 GitHub 用户名。
令牌的密钥 - 工作流已将变量设置为 GH_PAT。将名称设置为 GH_PAT。在 “密钥” 字段中粘贴您的个人访问令牌。
3. 现在我们可以通过命令行构建容器镜像。
- 克隆存储库的本地副本。打开该位置的命令行界面。
- 将 dockerfile 保存到克隆存储库的根目录下。
登录到 GitHub 容器注册表。运行:
echo | docker login ghcr.io -u --password-stdin
输出:
-构建容器镜像。这是本指南中最长的步骤,但只需构建一次镜像,就能将其推送到 ghcr 以供使用。运行:
docker build -t .
输出:
- 要验证您的镜像详细信息,请运行:
docker images
- 标记 Docker 镜像。此命令不会创建新镜像;它只为现有镜像提供新名称和标签。当你准备将镜像推送到像 GHCR 这样的注册表时尤其有用。Docker 要求在推送镜像前必须标记注册表 URL 和存储库名称。运行:
docker tag
- 将镜像推送到容器注册表。运行:
docker push
**注意:由于服务器错误,输出可能显示为失败。如果出现这种情况,只需再次运行该命令即可。
再次运行该命令:
恭喜!MCUXpresso SDK 和构建系统现已集成在容器镜像中,可以用于构建项目。接下来,我们将配置 GitHub 以实现自动化。
为什么要使用 GitHub Actions?
GitHub Actions 是 GitHub 内置的自动化工具,允许你定义工作流,根据推送或拉取请求等事件来构建、测试和部署代码。它使用 YAML 文件来配置这些工作流,从而可以直接在存储库中轻松设置 CI/CD 管道。
1. 在本地克隆您的存储库。然后导航到其根目录。
- 在项目根目录内创建 .github/workflows 目录。
- 导航至 VS 代码并创建一个新文件。将其命名为:docker-build.yml
- 我们在下面提供了一个模板,您可以将其复制并粘贴到 docker-build.ymll 中。
该模板的用途:
name: Build MCUXpresso Project
on:
push:
# branches: [ main ]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
container:
image: ghcr.io/nxp-jose/mcuxpresso-sdk:latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Copy my_app into west workspace
run: |
cp -r $GITHUB_WORKSPACE/my_app /workspace/mcuxsdk-manifests/my_app
- name: Build project using west
working-directory: /workspace/mcuxsdk-manifests
run: |
echo "Building project..."
west build -b frdmmcxa153 my_app
完成您的工作区设置
该过程的最后一步是创建一个项目以用于我们的管道。
1. 打开适用于 VS Code 的 MCUXpresso
2. 点击“从存储库导入示例”
3. 从 MCUXpresso SDK 24.12 或更高版本导入一个项目,作为独立示例。将导入位置设置为克隆存储库的根目录。
4. 将更改暂存、提交并推送到您的存储库。现在,您的存储库中应该包含:
*注意:如果在本地构建项目,您将看到 .vscode 目录。将此目录推送到存储库是完全可选的。
5. 推送完成后,在 GitHub 上启用工作流。启用工作流后。连续的推送或拉取请求将触发自动项目构建。
6. 检查构建细节。
- 导航至 GitHub 上的“操作”选项卡
- “操作”选项卡将显示工作流已运行的所有实例。
- 点击“构建”查看详细信息。
- 显示的详细信息是构建过程中执行的各个步骤。点击步骤以查看具体详情。
本指南中概述的 CI/CD 管道为使用 Docker、MCUXpresso SDK 和 GitHub Actions 自动构建提供了一个简单而有效的起点。虽然该示例以基本工作流为重点,但可对其进行广泛自定义,以满足项目的特定需求,例如集成自动测试、添加质量检查或使用自定义 MCUXpresso SDK 清单。利用这些工具,团队可以简化开发流程,确保一致性,并以最少的人工干预来扩展流程。