Skip to content

Commit 599ca39

Browse files
committed
update workflows
1 parent f0582ff commit 599ca39

File tree

1 file changed

+196
-0
lines changed

1 file changed

+196
-0
lines changed
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
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

Comments
 (0)