Extend per-board CI settings #24
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
on: | |
push: | |
branches: | |
- master | |
- develop | |
- feature/multi-board-ci | |
pull_request: | |
branches: | |
- master | |
- develop | |
types: [opened, reopened, synchronize] | |
workflow_call: # When another workflow invokes this one. | |
outputs: | |
matrix: | |
description: "Strategy matrix" | |
value: ${{ jobs.get-targets.outputs.matrix }} | |
workflow_dispatch: # Manually invoked by user. | |
name: ci-build | |
env: | |
NODE_VERSION: 16 | |
PYTHON_VERSION: 3.11 | |
OPENSHOCK_API_DOMAIN: api.shocklink.net | |
OPENSHOCK_FW_VERSION: master-${{ github.sha }} | |
jobs: | |
# Read platformio.ini and extract all specific targets. See the referenced file for more info. | |
get-targets: | |
uses: ./.github/workflows/targets.yml | |
build-captive-portal: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
sparse-checkout: | | |
WebUI | |
path: . | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ env.NODE_VERSION }} | |
cache: 'npm' | |
cache-dependency-path: ./WebUI/package-lock.json | |
- name: Install dependencies | |
working-directory: ./WebUI | |
run: npm ci | |
- name: Build | |
working-directory: ./WebUI | |
run: npm run build | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
name: captive-portal | |
path: WebUI/build/* | |
retention-days: 1 | |
if-no-files-found: error | |
build-filesystem: | |
runs-on: ubuntu-latest | |
needs: build-captive-portal | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/cache@v3 | |
with: | |
path: | | |
~/.platformio/platforms | |
~/.platformio/packages | |
~/.platformio/cache | |
key: ${{ runner.os }}-arch | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_VERSION }} | |
cache: "pip" | |
- name: Install dependencies | |
run: pip install -r requirements.txt | |
- name: Download built captive portal | |
uses: actions/download-artifact@v3 | |
with: | |
name: captive-portal | |
path: WebUI/build/ | |
- name: Build filesystem | |
run: pio run --target buildfs -e fs | |
- name: Upload internal filesystem artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: filesystem | |
path: .pio/build/fs/littlefs.bin | |
retention-days: 1 | |
if-no-files-found: error | |
build-firmware: | |
runs-on: ubuntu-latest | |
needs: get-targets | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJSON(needs.get-targets.outputs.matrix) }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/cache@v3 | |
with: | |
path: | | |
~/.platformio/platforms | |
~/.platformio/packages | |
~/.platformio/cache | |
key: ${{ runner.os }}-arch | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_VERSION }} | |
cache: "pip" | |
- name: Install dependencies | |
run: pip install -r requirements.txt | |
- name: Install board definition overrides | |
run: | | |
mkdir -p ~/.platformio/boards | |
find boards/ | grep board.json | sed -r -n 's|./([-a-zA-Z0-9\\-]*)/board.json|\0\n~/.platformio/boards/\1.json|p' | xargs -n 2 mv | |
- name: Build firmware | |
run: pio run -e ${{ matrix.board }} | |
- name: Upload internal firmware binaries | |
uses: actions/upload-artifact@v3 | |
with: | |
name: firmware_${{ matrix.board }} | |
path: .pio/build/${{ matrix.board }}/*.bin | |
retention-days: 1 | |
if-no-files-found: error | |
merge-images: | |
runs-on: ubuntu-latest | |
needs: [get-targets, build-filesystem, build-firmware] | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJSON(needs.get-targets.outputs.matrix )}} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
sparse-checkout: | | |
requirements.txt | |
path: . | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ env.PYTHON_VERSION }} | |
cache: "pip" | |
- name: Install dependencies | |
run: pip install esptool | |
- name: Download filesystem image | |
uses: actions/download-artifact@v3 | |
with: | |
name: filesystem | |
path: . | |
- name: Download firmware images | |
uses: actions/download-artifact@v3 | |
with: | |
name: firmware_${{ matrix.board }} | |
path: . | |
- name: Merge flash image | |
working-directory: . | |
run: | | |
python -m esptool \ | |
--chip esp32 \ | |
merge_bin \ | |
-o OpenShock.${{ matrix.board }}.bin \ | |
--flash_mode dio \ | |
--flash_freq 40m \ | |
--flash_size 4MB \ | |
0x1000 ./bootloader.bin \ | |
0x8000 ./partitions.bin \ | |
0x10000 ./firmware.bin \ | |
0x310000 ./littlefs.bin | |
- name: Upload merged flashable image | |
uses: actions/upload-artifact@v3 | |
with: | |
name: OpenShock_${{ matrix.board }} | |
path: OpenShock.${{ matrix.board }}.bin | |
retention-days: 1 | |
if-no-files-found: error |