1+ # 定义工作流名称
2+ name : build many lvgl_micropython
3+
4+ # 触发条件:仅手动触发
5+ on :
6+ workflow_dispatch : # 仅手动触发
7+
8+ jobs :
9+ build_esp32 :
10+ runs-on : ubuntu-latest
11+ strategy :
12+ fail-fast : false
13+ matrix :
14+ include :
15+ - board : ESP32_GENERIC_S3
16+ variant : SPIRAM_OCT
17+ flash_size : 16
18+ display : ili9341
19+ indev : gt911
20+ - board : ESP32_GENERIC_C3
21+ variant : " "
22+ flash_size : 8
23+ display : st7789
24+ indev : ft6x36
25+ - board : ESP32_GENERIC
26+ variant : SPIRAM
27+ flash_size : 4
28+ display : st7735
29+ indev : " "
30+ - board : ESP32_GENERIC
31+ variant : SPIRAM
32+ flash_size : 4
33+ display : ili9341
34+ indev : xpt2046
35+
36+ steps :
37+ # 1. 检出源码
38+ - name : 1.检出 lvgl_micropython 主仓库(含全部子模块)
39+ uses : actions/checkout@v4
40+ with :
41+ submodules : recursive # 递归拉取所有子模块
42+ fetch-depth : 0 # 拉取完整历史,便于后续版本识别
43+
44+ # 2. 安装系统依赖
45+ - name : 2.安装 Ubuntu 系统级编译依赖
46+ run : |
47+ sudo apt-get update # 更新软件包索引
48+ sudo apt-get install -y build-essential pkg-config \ # 编译工具链
49+ cmake ninja-build ccache # 构建&缓存工具
50+
51+ # 3. 设置 Python
52+ - name : 3.配置 Python 3.11 运行环境
53+ uses : actions/setup-python@v5
54+ with :
55+ python-version : ' 3.11' # ESP-IDF 与 MicroPython 均推荐 3.11
56+
57+ # 4. 初始化子模块(项目依赖)
58+ - name : 4.按需浅克隆关键子模块(加速下载)
59+ run : |
60+ # 仅拉取编译必需的子模块,深度=1 减少体积
61+ git submodule update --init --depth 1 -- lib/pycparser
62+ git submodule update --init --depth 1 --jobs 4 -- lib/micropython
63+ git submodule update --init --depth 1 --jobs 4 -- lib/lvgl
64+
65+ # 5. 缓存 ESP-IDF
66+ - name : 5.加载或创建 ESP-IDF 缓存
67+ id : cache-deps
68+ uses : actions/cache@v4
69+ with :
70+ path : |
71+ lib/esp-idf # ESP-IDF 主目录
72+ ~/.espressif # 工具链、Python 虚拟环境
73+ key : ${{ runner.os }}-v4-deps # 缓存键,可随版本调整
74+
75+ # 6. 若缓存未命中,拉取 ESP-IDF
76+ - name : 6.缓存未命中时完整拉取 ESP-IDF 及其子模块
77+ if : steps.cache-deps.outputs.cache-hit != 'true'
78+ run : |
79+ # 拉取 ESP-IDF 主仓库
80+ git submodule update --init --depth 1 --jobs 4 -- lib/esp-idf
81+ cd lib/esp-idf
82+ # 按需浅克隆 ESP-IDF 自身需要的子模块
83+ git submodule update --init --depth 1 --jobs 4 -- \
84+ components/bt/host/nimble/nimble \
85+ components/esp_wifi \
86+ components/esptool_py/esptool \
87+ components/lwip/lwip \
88+ components/mbedtls/mbedtls \
89+ components/bt/controller/lib_esp32 \
90+ components/bt/controller/lib_esp32c3_family
91+ cd ../..
92+ # 安装 ESP-IDF 全部工具链(all 代表支持所有芯片)
93+ export "IDF_PATH=$GITHUB_WORKSPACE/lib/esp-idf"
94+ ./lib/esp-idf/install.sh all
95+
96+ # 7. 设置 ESP-IDF 环境
97+ - name : 7.激活 ESP-IDF 环境变量(每个 step 都需重新执行)
98+ run : |
99+ export "IDF_PATH=$GITHUB_WORKSPACE/lib/esp-idf"
100+ . ./lib/esp-idf/export.sh # source export.sh,使 idf.py 可用
101+ env :
102+ IDF_PATH : ${{ github.workspace }}/lib/esp-idf
103+
104+ # 8. 构建固件
105+ - name : 8.使用 make.py 编译指定板型/Flash/显示/触摸配置
106+ run : |
107+ # 组装 make.py 参数数组
108+ opts=()
109+ [[ -n "${{ matrix.variant }}" ]] && opts+=("BOARD_VARIANT=${{ matrix.variant }}")
110+ opts+=("BOARD=${{ matrix.board }}")
111+ opts+=("--flash-size=${{ matrix.flash_size }}")
112+ opts+=("DISPLAY=${{ matrix.display }}")
113+ [[ -n "${{ matrix.indev }}" ]] && opts+=("INDEV=${{ matrix.indev }}")
114+ # 调用 make.py 进行编译
115+ python3 make.py esp32 "${opts[@]}"
116+
117+ # 9. 收集固件到统一目录
118+ - name : 9.重命名并收集所有固件到 ~/artifacts
119+ run : |
120+ # 定义最终存放固件的目录,固定放到 $HOME/artifacts
121+ ARTIFACTS_DIR="$HOME/artifacts"
122+ mkdir -p "$ARTIFACTS_DIR" # 如果目录不存在则自动创建
123+ # 拼出 ESP-IDF 实际编译输出目录的前缀
124+ BUILD_DIR="${{ github.workspace }}/lib/micropython/ports/esp32"
125+ # 拼出构建目录名:board 与可选 variant 用 “-” 连接
126+ BOARD_NAME="${{ matrix.board }}"
127+ [[ -n "${{ matrix.variant }}" ]] && BOARD_NAME+="-${{ matrix.variant }}"
128+ # 计算固件真正所在路径
129+ FW_PATH="${BUILD_DIR}/build-${BOARD_NAME}/firmware.bin"
130+
131+ # 组合最终文件名:板型_可选variant_FlashMB_显示_触摸.bin
132+ OUT_NAME="lvgl_mpy_${{ matrix.board }}${{ matrix.variant && format('_{0}', matrix.variant) || '' }}_${{ matrix.flash_size }}MB${{ matrix.display && format('_{0}', matrix.display) || '' }}${{ matrix.indev && format('_{0}', matrix.indev) || '' }}.bin"
133+
134+ # 如果固件存在则复制并重命名;不存在则报错退出
135+ if [[ -f "$FW_PATH" ]]; then
136+ cp "$FW_PATH" "$ARTIFACTS_DIR/$OUT_NAME"
137+ else
138+ echo "Firmware not found at $FW_PATH"
139+ exit 1
140+ fi
141+
142+ # 10. 上传构建产物
143+ - name : 10.上传重命名后的固件到 GitHub Actions 产物区
144+ uses : actions/upload-artifact@v4
145+ with :
146+ # 产物名与文件名保持一致,便于识别
147+ name : lvgl_mpy_${{ matrix.board }}${{ matrix.variant && format('_{0}', matrix.variant) || '' }}_${{ matrix.flash_size }}MB${{ matrix.display && format('_{0}', matrix.display) || '' }}${{ matrix.indev && format('_{0}', matrix.indev) || '' }}
148+ path : ~/artifacts/*.bin
0 commit comments