Files
ZephCore/.github/workflows/build.yml
T
2026-07-09 21:45:58 +02:00

342 lines
10 KiB
YAML

name: build firmware
on:
push:
branches: [ "master" ]
env:
zephyr_sdk: 1.0.1
python_version: 3.12
toolchains: arm-zephyr-eabi:xtensa-espressif_esp32s3_zephyr-elf:xtensa-espressif_esp32_zephyr-elf:riscv64-zephyr-elf
jobs:
setup-zephyr:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '${{ env.python_version }}'
cache: 'pip'
- run: pip install -r requirements.txt
- name: Setup Zephyr project
uses: zephyrproject-rtos/action-zephyr-setup@v1
with:
app-path: zephcore
toolchains: ${{ env.toolchains }}
sdk-version: ${{ env.zephyr_sdk }}
- name: Cache Espressif BLE controller blobs
id: cache-espressif-blobs
uses: actions/cache@v5
with:
path: modules/hal/espressif
key: ${{ runner.os }}-espressif-blobs-${{ hashFiles('modules/hal/espressif/.git/HEAD') }}
- name: Download Espressif BLE controller blobs
if: steps.cache-espressif-blobs.outputs.cache-hit != 'true'
run: west blobs fetch hal_espressif
- uses: actions/cache@v5
with:
path: modules
key: cache-zephyr-modules-${{ github.sha }}
build-nrf:
needs: setup-zephyr
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '${{ env.python_version }}'
cache: 'pip'
- run: pip install -r requirements.txt
- uses: actions/cache/restore@v5
with:
path: modules
key: cache-zephyr-modules-${{ github.sha }}
- name: Setup Zephyr project
uses: zephyrproject-rtos/action-zephyr-setup@v1
with:
app-path: zephcore
toolchains: ${{ env.toolchains }}
sdk-version: ${{ env.zephyr_sdk }}
- name: Cache Espressif BLE controller blobs
id: cache-espressif-blobs
uses: actions/cache@v5
with:
path: modules/hal/espressif
key: ${{ runner.os }}-espressif-blobs-${{ hashFiles('modules/hal/espressif/.git/HEAD') }}
- name: Download Espressif BLE controller blobs
if: steps.cache-espressif-blobs.outputs.cache-hit != 'true'
run: west blobs fetch hal_espressif
- name: build firmwares
run: bash build.sh nrf
- uses: actions/cache@v5
with:
path: firmware
key: cache-firmware-nrf-${{ github.sha }}
build-esp32-repeaters:
needs: setup-zephyr
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '${{ env.python_version }}'
cache: 'pip'
- run: pip install -r requirements.txt
- uses: actions/cache/restore@v5
with:
path: modules
key: cache-zephyr-modules-${{ github.sha }}
- name: Setup Zephyr project
uses: zephyrproject-rtos/action-zephyr-setup@v1
with:
app-path: zephcore
toolchains: ${{ env.toolchains }}
sdk-version: ${{ env.zephyr_sdk }}
- name: Cache Espressif BLE controller blobs
id: cache-espressif-blobs
uses: actions/cache@v5
with:
path: modules/hal/espressif
key: ${{ runner.os }}-espressif-blobs-${{ hashFiles('modules/hal/espressif/.git/HEAD') }}
- name: Download Espressif BLE controller blobs
if: steps.cache-espressif-blobs.outputs.cache-hit != 'true'
run: west blobs fetch hal_espressif
- name: build firmwares
run: bash build.sh esp32 repeaters
- uses: actions/cache@v5
with:
path: firmware
key: cache-firmware-esp32-repeaters-${{ github.sha }}
build-linux:
needs: setup-zephyr
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '${{ env.python_version }}'
cache: 'pip'
- run: pip install -r requirements.txt
- uses: actions/cache/restore@v5
with:
path: modules
key: cache-zephyr-modules-${{ github.sha }}
- name: Setup Zephyr project
uses: zephyrproject-rtos/action-zephyr-setup@v1
with:
app-path: zephcore
toolchains: ${{ env.toolchains }}
sdk-version: ${{ env.zephyr_sdk }}
# native_sim presets are cross-compiled for the target SBC architecture:
# femtofox = ARMv7-A (32-bit), rak6421 / rak6421_pi5 = aarch64 (64-bit).
- name: Install cross-compile toolchains
run: |
sudo apt-get update
sudo apt-get install -y \
gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
- name: build firmwares
run: bash build.sh linux
- uses: actions/cache@v5
with:
path: firmware
key: cache-firmware-linux-${{ github.sha }}
build-esp32-companions:
needs: setup-zephyr
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '${{ env.python_version }}'
cache: 'pip'
- run: pip install -r requirements.txt
- uses: actions/cache/restore@v5
with:
path: modules
key: cache-zephyr-modules-${{ github.sha }}
- name: Setup Zephyr project
uses: zephyrproject-rtos/action-zephyr-setup@v1
with:
app-path: zephcore
toolchains: ${{ env.toolchains }}
sdk-version: ${{ env.zephyr_sdk }}
- name: Cache Espressif BLE controller blobs
id: cache-espressif-blobs
uses: actions/cache@v5
with:
path: modules/hal/espressif
key: ${{ runner.os }}-espressif-blobs-${{ hashFiles('modules/hal/espressif/.git/HEAD') }}
- name: Download Espressif BLE controller blobs
if: steps.cache-espressif-blobs.outputs.cache-hit != 'true'
run: west blobs fetch hal_espressif
- name: build firmwares
run: bash build.sh esp32 companions
- uses: actions/cache@v5
with:
path: firmware
key: cache-firmware-esp32-companions-${{ github.sha }}
create-release:
needs: [build-nrf, build-esp32-companions, build-esp32-repeaters, build-linux]
runs-on: ubuntu-latest
outputs:
release_tag: ${{ steps.tag.outputs.release_tag }}
steps:
- name: generate release tag
id: tag
run: |
version=v$(date +"%Y%m%d.%H%M%S")
echo "release_tag=$version" >> $GITHUB_OUTPUT
- uses: actions/cache/restore@v5
with:
path: firmware
key: cache-firmware-nrf-${{ github.sha }}
- uses: actions/cache/restore@v5
with:
path: firmware
key: cache-firmware-esp32-companions-${{ github.sha }}
- uses: actions/cache/restore@v5
with:
path: firmware
key: cache-firmware-esp32-repeaters-${{ github.sha }}
- uses: actions/cache/restore@v5
with:
path: firmware
key: cache-firmware-linux-${{ github.sha }}
- name: upload firmware artifacts
uses: actions/upload-artifact@v7
with:
name: firmware-${{ steps.tag.outputs.release_tag }}
path: firmware
- name: create release
uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.tag.outputs.release_tag }}
name: Firmware ${{ steps.tag.outputs.release_tag }}
body: ""
draft: false
files: firmware/*
# Publish firmware + provider catalog for the Mesh America configurator
# (apps.meshamerica.com). GitHub Release assets have no CORS header, so the
# browser flasher cannot fetch them; instead we force-push the firmware and a
# generated catalog.json to the `firmware-dist` orphan branch, served from
# CORS-clean hosts (firmware via jsDelivr, catalog via raw.githubusercontent).
# The stable catalog URL registered with Mesh America is:
# https://raw.githubusercontent.com/<owner>/<repo>/firmware-dist/catalog.json
publish-catalog:
needs: create-release
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: '${{ env.python_version }}'
# Pull every board's firmware back into a single firmware/ directory.
- uses: actions/cache/restore@v5
with:
path: firmware
key: cache-firmware-nrf-${{ github.sha }}
- uses: actions/cache/restore@v5
with:
path: firmware
key: cache-firmware-esp32-companions-${{ github.sha }}
- uses: actions/cache/restore@v5
with:
path: firmware
key: cache-firmware-esp32-repeaters-${{ github.sha }}
- uses: actions/cache/restore@v5
with:
path: firmware
key: cache-firmware-linux-${{ github.sha }}
- name: generate provider catalog
run: |
python gen_provider_catalog.py --firmware-dir firmware \
--url-base "https://cdn.jsdelivr.net/gh/${{ github.repository }}@firmware-dist" \
--version "${{ needs.create-release.outputs.release_tag }}" \
--out catalog.json
- name: publish firmware + catalog to firmware-dist branch
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
tag="${{ needs.create-release.outputs.release_tag }}"
work="$(mktemp -d)"
cp catalog.json "$work/"
cp firmware/* "$work/"
{
echo "# ZephCore firmware-dist"
echo
echo "Auto-generated distribution branch for the Mesh America device"
echo "configurator. Force-pushed by the \`build firmware\` workflow each"
echo "release -- do not edit by hand."
echo
echo "- Catalog (register this URL): https://raw.githubusercontent.com/${{ github.repository }}/firmware-dist/catalog.json"
echo "- Firmware (jsDelivr): https://cdn.jsdelivr.net/gh/${{ github.repository }}@firmware-dist/"
echo "- Built from release: $tag"
} > "$work/README.md"
cd "$work"
git init -q -b firmware-dist
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add -A
git commit -q -m "firmware-dist: $tag"
git push -f "https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}.git" firmware-dist