1
+ # 定义工作流名称
2
+ name : build mpy with camera
3
+
4
+ # 触发条件:仅手动触发
5
+ on :
6
+ workflow_dispatch :
7
+
8
+ # 并发控制:同一分支仅保留最新一次运行
9
+ concurrency :
10
+ group : ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress : true
12
+
13
+ jobs :
14
+ # 第一步:准备编译环境(ESP-IDF、MicroPython、摄像头驱动)
15
+ setup-environment :
16
+ runs-on : ubuntu-24.04
17
+ steps :
18
+ # 1. 获取 MicroPython 最新发布版本号
19
+ - name : 1.获取 MicroPython 最新版本
20
+ run : |
21
+ MPY_RELEASE=$(curl --silent "https://api.github.com/repos/micropython/micropython/releases/latest" | jq -r .tag_name)
22
+ echo "MPY_RELEASE=${MPY_RELEASE}" >> $GITHUB_ENV
23
+
24
+ # 2. 缓存 ESP-IDF、MicroPython 及相关依赖
25
+ - name : 2.缓存 ESP-IDF 与 MicroPython
26
+ id : cache_esp_idf
27
+ uses : actions/cache@v4
28
+ with :
29
+ lookup-only : true
30
+ path : |
31
+ ~/esp-idf/
32
+ ~/.espressif/
33
+ !~/.espressif/dist/
34
+ ~/.cache/pip/
35
+ ~/micropython/
36
+ key : mpy-${{ env.MPY_RELEASE }}
37
+ restore-keys : mpy-
38
+
39
+ # 3. 若缓存未命中,安装系统依赖
40
+ - name : 3.安装系统依赖(未缓存时)
41
+ if : steps.cache_esp_idf.outputs.cache-hit != 'true'
42
+ run : |
43
+ sudo apt-get update
44
+ sudo apt-get install -y git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
45
+
46
+ # 4. 若缓存未命中,克隆并配置 ESP-IDF
47
+ - name : 4.设置 ESP-IDF(未缓存时)
48
+ id : export-idf
49
+ if : steps.cache_esp_idf.outputs.cache-hit != 'true'
50
+ run : |
51
+ cd ~
52
+ git clone --depth 1 --branch v5.4.1 https://github.com/espressif/esp-idf.git
53
+ git -C esp-idf submodule update --init --recursive --filter=tree:0
54
+ cd esp-idf
55
+ ./install.sh all
56
+ cd components
57
+ # 使用 cnadler86 的 esp32-camera 分支(适配 MicroPython)
58
+ git clone https://github.com/cnadler86/esp32-camera.git
59
+ cd ~/esp-idf/
60
+ source ./export.sh
61
+ cd ~
62
+ # 拷贝 esp-adf-libs 中的 esp_new_jpeg 组件
63
+ git clone https://github.com/espressif/esp-adf-libs.git
64
+ cp -r ~/esp-adf-libs/esp_new_jpeg ~/esp-idf/components/
65
+
66
+ # 5. 若缓存未命中,克隆并准备 MicroPython
67
+ - name : 5.克隆 MicroPython(未缓存时)
68
+ id : clone-micropython
69
+ if : steps.cache_esp_idf.outputs.cache-hit != 'true'
70
+ run : |
71
+ echo "Cloning MicroPython release: $MPY_RELEASE"
72
+ cd ~/esp-idf/
73
+ source ./export.sh
74
+ cd ~
75
+ git clone --depth 1 --branch ${{ env.MPY_RELEASE }} https://github.com/micropython/micropython.git
76
+ cd micropython
77
+ cd mpy-cross
78
+ make
79
+ cd ~/micropython/ports/esp32
80
+ make submodules
81
+ echo "MicroPython 准备完成"
82
+ source ~/micropython/tools/ci.sh && echo "IDF_VER=$IDF_VER" >> $GITHUB_ENV
83
+
84
+ # 第二步:并行构建各开发板固件
85
+ build :
86
+ needs : setup-environment
87
+ runs-on : ubuntu-24.04
88
+ strategy :
89
+ fail-fast : false
90
+ matrix :
91
+ board :
92
+ - ESP32_GENERIC-SPIRAM
93
+ - ESP32_GENERIC_S2
94
+ - ESP32_GENERIC_S3
95
+ - ESP32_GENERIC_S3-SPIRAM_OCT
96
+ - ESP32_GENERIC_S3-FLASH_4M
97
+ - ESP32_GENERIC-SPIRAM@WROVER_KIT
98
+ - ESP32_GENERIC-SPIRAM@ESP_EYE
99
+ - ESP32_GENERIC-SPIRAM@M5STACK_PSRAM
100
+ - ESP32_GENERIC-SPIRAM@M5STACK_V2_PSRAM
101
+ - ESP32_GENERIC-SPIRAM@M5STACK_WIDE
102
+ - ESP32_GENERIC-SPIRAM@M5STACK_ESP32CAM
103
+ - ESP32_GENERIC-SPIRAM@M5STACK_UNITCAM
104
+ - ESP32_GENERIC-SPIRAM@AI_THINKER
105
+ - ESP32_GENERIC-SPIRAM@TTGO_T_JOURNAL
106
+ - ESP32_GENERIC-SPIRAM@TTGO_T_CAMERA_PLUS
107
+ - ESP32_GENERIC_S3-SPIRAM_OCT@M5STACK_CAMS3_UNIT
108
+ - ESP32_GENERIC_S3-SPIRAM_OCT@M5STACK_ATOM_S3R
109
+ - ESP32_GENERIC_S3-SPIRAM_OCT@XIAO_ESP32S3
110
+ - ESP32_GENERIC_S3-SPIRAM_OCT@ESP32S3_CAM_LCD
111
+ - ESP32_GENERIC_S3-SPIRAM_OCT@ESP32S3_EYE
112
+ - ESP32_GENERIC_S3-SPIRAM_OCT@FREENOVE_ESP32S3_CAM
113
+ - ESP32_GENERIC_S3-SPIRAM_OCT@DFRobot_ESP32S3
114
+ - ESP32_GENERIC_S3-SPIRAM_OCT@NEW_ESPS3_RE1_0
115
+ - ESP32_GENERIC_S3-SPIRAM_OCT@XENOIONEX
116
+
117
+ steps :
118
+ # 1. 再次获取 MicroPython 版本(避免缓存缺失)
119
+ - name : 1.获取 MicroPython 最新版本
120
+ run : |
121
+ MPY_RELEASE=$(curl --silent "https://api.github.com/repos/micropython/micropython/releases/latest" | jq -r .tag_name)
122
+ echo "MPY_RELEASE=${MPY_RELEASE}" >> $GITHUB_ENV
123
+
124
+ # 2. 恢复缓存
125
+ - name : 2.恢复 ESP-IDF 与 MicroPython 缓存
126
+ uses : actions/cache@v4
127
+ with :
128
+ path : |
129
+ ~/esp-idf/
130
+ ~/.espressif/
131
+ !~/.espressif/dist/
132
+ ~/.cache/pip/
133
+ ~/micropython/
134
+ key : mpy-${{ env.MPY_RELEASE }}
135
+ restore-keys : mpy-
136
+
137
+ # 3. 检出当前仓库(包含自定义 C 模块与脚本)
138
+ - name : 3.检出当前仓库
139
+ uses : actions/checkout@v4
140
+
141
+ # 4. 安装系统依赖(确保完整)
142
+ - name : 4.安装系统依赖
143
+ run : |
144
+ sudo apt-get update
145
+ sudo apt-get install -y git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 build-essential pkg-config
146
+
147
+ # 5. 克隆 JPEG 模块
148
+ - name : 5.克隆 JPEG 模块
149
+ run : |
150
+ cd ${{ github.workspace }}
151
+ git clone https://github.com/cnadler86/mp_jpeg.git
152
+
153
+ # 6. 构建固件
154
+ - name : 6.构建 MicroPython 固件
155
+ run : |
156
+ cd ~/esp-idf/components/esp32-camera
157
+ CAM_DRIVER=$(git describe --tags --always --dirty)
158
+ cd ~/micropython/ports/esp32
159
+ source ~/esp-idf/export.sh
160
+
161
+ # 解析 board@camera 格式
162
+ IFS='@' read -r BUILD_TARGET CAMERA_MODEL <<< "${{ matrix.board }}"
163
+ IFS='-' read -r BOARD_NAME BOARD_VARIANT <<< "${BUILD_TARGET}"
164
+
165
+ # 构造 idf.py 命令
166
+ if [ -n "${BOARD_VARIANT}" ]; then
167
+ IDF_CMD="idf.py -D MICROPY_BOARD=$BOARD_NAME -D USER_C_MODULES=${{ github.workspace }}/src/micropython.cmake -D MICROPY_BOARD_VARIANT=$BOARD_VARIANT -B build-$BUILD_TARGET -D MP_CAMERA_DRIVER_VERSION=$CAM_DRIVER -D MP_JPEG_DIR=${{ github.workspace }}/mp_jpeg"
168
+ else
169
+ IDF_CMD="idf.py -D MICROPY_BOARD=$BOARD_NAME -D USER_C_MODULES=${{ github.workspace }}/src/micropython.cmake -B build-$BUILD_TARGET -D MP_CAMERA_DRIVER_VERSION=$CAM_DRIVER -D MP_JPEG_DIR=${{ github.workspace }}/mp_jpeg"
170
+ fi
171
+
172
+ if [ -n "${CAMERA_MODEL}" ]; then
173
+ echo "FW_NAME=${CAMERA_MODEL}" >> $GITHUB_ENV
174
+ FINAL_CMD="${IDF_CMD} -D MICROPY_CAMERA_MODEL=${CAMERA_MODEL} build"
175
+ else
176
+ echo "FW_NAME=${BUILD_TARGET}" >> $GITHUB_ENV
177
+ FINAL_CMD="${IDF_CMD} build"
178
+ fi
179
+
180
+ make USER_C_MODULES=${{ github.workspace }}/src/micropython.cmake BOARD=$BOARD_NAME submodules
181
+ echo "执行命令: $FINAL_CMD"
182
+ eval $FINAL_CMD
183
+
184
+ # 生成合并固件 & uf2
185
+ cd ~/micropython/ports/esp32/build-${BUILD_TARGET}
186
+ python ../makeimg.py sdkconfig bootloader/bootloader.bin partition_table/partition-table.bin micropython.bin firmware.bin micropython.uf2
187
+ mkdir -p ~/artifacts
188
+ mv ~/micropython/ports/esp32/build-${BUILD_TARGET}/firmware.bin ~/artifacts/firmware.bin
189
+
190
+ # 7. 上传固件
191
+ - name : 7.上传固件产物
192
+ uses : actions/upload-artifact@v4
193
+ with :
194
+ name : mpy_cam-${{ env.MPY_RELEASE }}-${{ env.FW_NAME }}
195
+ path : ~/artifacts/**
196
+ retention-days : 5
0 commit comments