2185100_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2185100_zh-CN

2185100_zh-CN

MCUXpresso SDK:CI/CD 流水线

概述

在不断发展的嵌入式系统开发领域,支持自动化和高效的工作流程变得越来越重要。本文将探讨如何使用 GitHub Actions、Docker、MCUXpresso SDK 和 Visual Studio Code 为嵌入式项目量身打造一个强大的 CI/CD 管道。通过集成这些工具,开发人员可以自动构建、运行测试,并确保在不同团队和环境中一致地交付固件。

我们首先概述了 CI/CD 在嵌入式工作流程中的优势,包括更快的迭代周期、减少人为错误以及增强协作。接下来,我们深入探讨实际设置:使用 Docker 封装构建环境,利用 GitHub Actions 协调构建和测试,以及在 VS Code 中借助 MCUXpresso SDK 来管理和开发固件项目。真实案例和可重复使用的模板将引导读者创建一个可扩展、可维护且针对基于恩智浦的开发板进行了优化的管道。

无论您是希望实现工作流程现代化的嵌入式工程师,还是希望缩短交付时间的产品经理,本指南都将帮助您在开发生命周期中利用自动化的力量。


前提条件

  • MCUXpresso for VS Code
  • MCUXpresso SDK 24.12 或更高版本
  • Git
  • GitHub 帐户
  • Docker

目录

  1. 嵌入式工作流程中的 CI/CD 优势
  2. 容器 - Docker
  3. 自动化 - GitHub Actions
  4. 使用流水线
  5. 结束语

1. CI/CD 在嵌入式工作流中的优势

在嵌入式系统开发中实施持续集成和持续部署 (CI/CD) 具有变革性优势,尤其是在使用 MCUXpresso SDK 等复杂工具链和特定硬件限制时。以下是主要优势:

自动构建和测试

CI/CD 管道通过自动编译、链接和闪存流程,消除了手动构建步骤。这可确保每次代码更改都能在一致的构建环境中得到验证,从而降低人为错误的风险,节省宝贵的工程时间。

及早发现问题

通过将自动单元测试、静态分析和在环硬件 (HIL) 测试集成到管道中,开发者可以在错误和回归进入生产硬件前及早发现。这将使固件更加稳定,减少集成过程中的意外情况。

使用 Docker 实现一致的环境

使用 Docker 对构建环境进行容器化,可确保开发机器和 CI 运行程序之间的一致性。开发人员不再需要担心工具链版本不匹配或依赖项缺失的问题,一切都已定义并可重现。

改善协作和代码质量

CI/CD 鼓励频繁提交和拉取请求,这些请求会自动验证。这促进了团队成员间更好的协作,执行编码标准,并确保只有经过测试的代码被合并到主分支中。

更快的迭代和部署

借助自动化管道,固件更新可以快速构建、测试并部署到目标设备或暂存环境中。这加快了开发周期,实现了快速原型开发,尤其适用于敏捷或迭代开发模式。

可追溯性和可审计性

CI/CD 系统会记录每一次构建、测试结果和部署,从而提供清晰的更改历史记录。这对于在汽车或医疗设备等受监管行业中进行调试、确保合规性和维持高质量标准至关重要。

跨项目的可扩展性

管道一旦建立,就可以在多个嵌入式项目中重复使用或调整。这种可扩展性减少了新板或应用程序的设置时间,并促进了团队之间的最佳实践。


2. 容器 - Docker

什么是容器?

容器是轻量级、可移植的软件单元,它将代码与其所有依赖项、库和配置文件组成一个代码包,因此可以在不同的计算环境中可靠地运行。

将容器视为一个独立的盒子,其中包含应用程序运行所需的一切。有几个平台可以用来容器化工作区。本指南将重点介绍 Docker。

Docker是什么?

Docker 是一个开源平台,它使开发人员能够在容器中构建、打包和运行应用程序。它简化了创建隔离环境的过程,该环境包括应用程序在不同系统上持续运行所需的代码、库、工具和设置等所有内容。

Docker 的核心是确保开发、测试和部署环境相同,无论您是在本地还是在云中工作,都能帮助解决“它在我的机器上运行”的问题。

使用 Docker 对 MCUXpresso SDK 和构建系统进行容器化的步骤

使用 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. 创建一个新的存储库。暂时留空。稍后,它将包含以下项目:

  • .github/workflows/docker-build.yml
  • my_app
  • dockerfile
  • README.md

2. 生成个人访问令牌(PAT)。这将允许您访问 GitHub API。

- 点击“我的”图标

joseOcampoHernandez_0-1760392547685.png


- 选择设置 > 开发者设置 > 个人访问令牌 > 令牌(经典版)

joseOcampoHernandez_2-1760392708201.png


- 选择“生成新令牌(经典)

- 范围可以根据您的需求自定义。请在本指南中使用以下范围:delete:packages、repo、write:packages

- 点击“生成令牌”。生成令牌后,请务必复制并保存该令牌。

- 然后,将个人访问令牌 (PAT) 存储为 GitHub 密钥。GitHub 密钥将用于工作流文件中的身份验证。这样做是为了在不修改工作流文件的情况下提高可重用性、安全性和轮换性。


- 导航到已创建的存储库,然后单击“设置”。

joseOcampoHernandez_3-1760393083849.png


- 选择密钥和变量,然后单击操作。

- 我们将在此处添加 2 个密钥。一个是用户名,另一个是个人访问令牌。点击“新建存储库密钥”

  • 用户名的密钥 - 这可以个性化定制。然而,在本指南稍后将介绍的工作流文件中,该变量设置为 GH_USERNAME。将名称设置为 GH_USERNAME。在 “密钥” 字段中输入您的 GitHub 用户名。

  • 令牌的密钥 - 工作流已将变量设置为 GH_PAT。将名称设置为 GH_PAT。在 “密钥” 字段中粘贴您的个人访问令牌。

joseOcampoHernandez_0-1760393296107.png

3. 现在我们可以通过命令行构建容器镜像。

- 克隆存储库的本地副本。打开该位置的命令行界面。

- 将 dockerfile 保存到克隆存储库的根目录下。

登录到 GitHub 容器注册表。运行:

echo  | docker login ghcr.io -u  --password-stdin

输出:joseOcampoHernandez_1-1760393609136.png

-构建容器镜像。这是本指南中最长的步骤,但只需构建一次镜像,就能将其推送到 ghcr 以供使用。运行:

docker build -t  .

输出:

joseOcampoHernandez_3-1760393769087.png


- 要验证您的镜像详细信息,请运行:

docker images

标记 Docker 镜像。此命令不会创建新镜像;它只为现有镜像提供新名称和标签。当你准备将镜像推送到像 GHCR 这样的注册表时尤其有用。Docker 要求在推送镜像前必须标记注册表 URL 和存储库名称。运行:

docker tag  

- 将镜像推送到容器注册表。运行:

docker push 

**注意:由于服务器错误,输出可能显示为失败。如果出现这种情况,只需再次运行该命令即可。

joseOcampoHernandez_0-1760394102481.png

再次运行该命令:

joseOcampoHernandez_1-1760394158501.png

恭喜!MCUXpresso SDK 和构建系统现已集成在容器镜像中,可以用于构建项目。接下来,我们将配置 GitHub 以实现自动化。


3. 自动化 - GitHub Actions

为什么要使用 GitHub Actions?

GitHub Actions 是 GitHub 内置的自动化工具,允许你定义工作流,根据推送或拉取请求等事件来构建、测试和部署代码。它使用 YAML 文件来配置这些工作流,从而可以直接在存储库中轻松设置 CI/CD 管道。

1. 在本地克隆您的存储库。然后导航到其根目录。

- 在项目根目录内创建 .github/workflows 目录。

- 导航至 VS 代码并创建一个新文件。将其命名为:docker-build.yml

- 我们在下面提供了一个模板,您可以将其复制并粘贴到 docker-build.ymll 中。

该模板的用途:

  • 在推送或 PR 时运行
  • 使用包含 MCUXpresso SDK 工具的容器
  • 检查您的存储库
  • 将您的应用复制到 West 工作区
  • 使用 West 为 FRDM-MCXA153 构建它

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

4. 使用管道

完成您的工作区设置

该过程的最后一步是创建一个项目以用于我们的管道。

1. 打开适用于 VS Code 的 MCUXpresso

2. 点击“从存储库导入示例”

joseOcampoHernandez_0-1760642379145.png

3. MCUXpresso SDK 24.12 或更高版本导入一个项目,作为独立示例。将导入位置设置为克隆存储库的根目录。

joseOcampoHernandez_1-1760642544479.png

4. 将更改暂存、提交并推送到您的存储库。现在,您的存储库中应该包含:

joseOcampoHernandez_2-1760643602809.png

*注意:如果在本地构建项目,您将看到 .vscode 目录。将此目录推送到存储库是完全可选的。

5. 推送完成后,在 GitHub 上启用工作流。启用工作流后。连续的推送或拉取请求将触发自动项目构建。

6. 检查构建细节。

- 导航至 GitHub 上的“操作”选项卡

joseOcampoHernandez_3-1760643944715.png


- “操作”选项卡将显示工作流已运行的所有实例。

joseOcampoHernandez_4-1760644181055.png


- 点击“构建”查看详细信息。

joseOcampoHernandez_0-1760644351578.png


- 显示的详细信息是构建过程中执行的各个步骤。点击步骤以查看具体详情。

joseOcampoHernandez_1-1760644531717.png


5. 结论

本指南中概述的 CI/CD 管道为使用 Docker、MCUXpresso SDK 和 GitHub Actions 自动构建提供了一个简单而有效的起点。虽然该示例以基本工作流为重点,但可对其进行广泛自定义,以满足项目的特定需求,例如集成自动测试、添加质量检查或使用自定义 MCUXpresso SDK 清单。利用这些工具,团队可以简化开发流程,确保一致性,并以最少的人工干预来扩展流程。


MCUXpresso SDK
Tags (1)
No ratings
Version history
Last update:
‎11-19-2025 04:30 PM
Updated by: