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///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