MULTI Test, Build, Deploy, Release #226
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
# Workflow for testing MULTI-Module firmware builds | |
name: MULTI Automated Test, Build, Deploy | |
on: | |
# Trigger the workflow on pushes, except those that are tagged (avoids double-testing releases) | |
push: | |
branches: | |
- '**' | |
tags-ignore: | |
- '**' | |
paths: | |
- '.github/workflows/**' | |
- 'buildroot/bin/**' | |
- 'Multiprotocol/**' | |
# Trigger the workflow on pull requests to the master branch | |
pull_request: | |
branches: | |
- master | |
paths: | |
- '.github/workflows/**' | |
- 'buildroot/bin/**' | |
- 'Multiprotocol/**' | |
# Triggers the workflow on release creation | |
release: | |
types: | |
- created | |
# Allows the workflow to be triggered manually from the Actions tab | |
workflow_dispatch: | |
jobs: | |
test: | |
runs-on: ubuntu-latest | |
# Configure the board matrix | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- board: "multi4in1:avr:multiatmega328p:bootloader=none" | |
name: "ATmega328p" | |
- board: "multi4in1:avr:multiatmega328p:bootloader=optiboot" | |
name: "ATmega328p (Optiboot)" | |
- board: "multi4in1:avr:multixmega32d4" | |
name: "OrangeRX" | |
- board: "multi4in1:STM32F1:multistm32f103c8:debug_option=none" | |
name: "STM32F103 (64KB)" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=none" | |
name: "STM32F103 (128KB)" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=native" | |
name: "STM32F103 (128KB, USB Debug)" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=ftdi" | |
name: "STM32F103 (128KB, Serial Debug)" | |
- board: "multi4in1:STM32F1:multi5in1t18int" | |
name: "T18 5-in-1 (128KB)" | |
# Set the build name using the friendly board name | |
name: "[Test] ${{ matrix.name }}" | |
# Set the environment variables | |
env: | |
BOARD: ${{ matrix.board }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Arduino CLI | |
uses: arduino/setup-arduino-cli@v1.1.2 | |
with: | |
version: "0.32.2" | |
- name: Prepare build environment | |
run: | | |
echo "Github Ref: $GITHUB_REF" | |
echo "Event name: ${{ github.event_name }}" | |
echo "Event action: ${{ github.event.action }}" | |
echo "Tag name: ${{ github.event.release.tag_name }}" | |
arduino-cli config init --additional-urls https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/master/package_multi_4in1_board_index.json,https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/devel/source/package_multi_4in1_board_devel_index.json | |
arduino-cli core update-index | |
if [[ "$BOARD" =~ ":avr:" ]]; then | |
arduino-cli core install arduino:avr; | |
fi | |
if [[ "$BOARD" =~ "multi4in1-devel:avr" ]]; then | |
arduino-cli core install multi4in1-devel:avr | |
elif [[ "$BOARD" =~ "multi4in1:avr" ]]; then | |
arduino-cli core install multi4in1:avr | |
fi | |
if [[ "$BOARD" =~ "multi4in1-devel:STM32F1:" ]]; then | |
arduino-cli core install multi4in1-devel:STM32F1 | |
elif [[ "$BOARD" =~ "multi4in1:STM32F1:" ]]; then | |
arduino-cli core install multi4in1:STM32F1 | |
fi | |
chmod +x ${GITHUB_WORKSPACE}/buildroot/bin/* | |
echo "${GITHUB_WORKSPACE}/buildroot/bin" >> $GITHUB_PATH | |
mkdir ./build | |
mkdir ./binaries | |
- name: Configure MULTI-Module firmware options | |
run: | | |
# Load the build functions | |
source ./buildroot/bin/buildFunctions; | |
# Get the version | |
getMultiVersion | |
echo "MULTI_VERSION=$(echo $MULTI_VERSION)" >> $GITHUB_ENV | |
# Get all the protocols for this board | |
getAllProtocols | |
echo "A7105_PROTOCOLS=$(echo $A7105_PROTOCOLS)" >> $GITHUB_ENV | |
echo "CC2500_PROTOCOLS=$(echo $CC2500_PROTOCOLS)" >> $GITHUB_ENV | |
echo "CYRF6936_PROTOCOLS=$(echo $CYRF6936_PROTOCOLS)" >> $GITHUB_ENV | |
echo "NRF24L01_PROTOCOLS=$(echo $NRF24L01_PROTOCOLS)" >> $GITHUB_ENV | |
echo "SX1276_PROTOCOLS=$(echo $SX1276_PROTOCOLS)" >> $GITHUB_ENV | |
echo "CCNRF_INO_PROTOCOLS=$(echo $CCNRF_INO_PROTOCOLS)" >> $GITHUB_ENV | |
echo "ALL_PROTOCOLS=$(echo $ALL_PROTOCOLS)" >> $GITHUB_ENV | |
# Get all the RF modules for this board | |
getAllRFModules | |
echo "ALL_RFMODULES=$(echo $ALL_RFMODULES)" >> $GITHUB_ENV | |
# Disable CHECK_FOR_BOOTLOADER when not needed | |
if [[ "$BOARD" =~ ":avr:multiatmega328p:bootloader=none" ]]; then | |
opt_disable CHECK_FOR_BOOTLOADER; | |
fi | |
# Trim the build down for the Atmega328p board | |
if [[ "$BOARD" =~ ":avr:multiatmega328p:" ]]; then | |
opt_disable $ALL_PROTOCOLS | |
opt_enable FRSKYX_CC2500_INO AFHDS2A_A7105_INO MJXQ_NRF24L01_INO DSM_CYRF6936_INO; | |
fi | |
# Trim the enabled protocols down for the STM32F103CB board with debugging or the STM32F103C8 board in general | |
if [[ "$BOARD" =~ ":STM32F1:multistm32f103cb:debug_option=ftdi" ]] || [[ "$BOARD" =~ ":STM32F1:multistm32f103cb:debug_option=native" ]] || [[ "$BOARD" =~ ":STM32F1:multistm32f103c8" ]]; then | |
opt_disable $ALL_PROTOCOLS; | |
opt_enable FRSKYX_CC2500_INO AFHDS2A_A7105_INO MJXQ_NRF24L01_INO DSM_CYRF6936_INO; | |
fi | |
- name: Save default firmware configuration | |
run: | | |
cat Multiprotocol/_Config.h | |
cp Multiprotocol/_Config.h ./_Config.h.bak | |
- name: Build default configuration | |
run: | | |
# Skip the default build for boards where it's too large now | |
if [[ "$BOARD" =~ ":STM32F1:multistm32f103cb:debug_option=none" ]] || [[ "$BOARD" =~ ":STM32F1:multi5in1t18int" ]]; then | |
printf "Not testing default build for $BOARD."; | |
else | |
source ./buildroot/bin/buildFunctions; | |
buildMulti | |
fi | |
- name: Build serial only | |
run: | | |
# Skip the serial-only build for boards where it's too large now | |
if [[ "$BOARD" =~ ":STM32F1:multistm32f103cb:debug_option=none" ]] || [[ "$BOARD" =~ ":STM32F1:multi5in1t18int" ]]; then | |
printf "Not testing serial-only build for $BOARD."; | |
else | |
source ./buildroot/bin/buildFunctions; | |
cp ./_Config.h.bak Multiprotocol/_Config.h | |
opt_disable ENABLE_PPM; | |
buildMulti; | |
fi | |
- name: Build PPM only | |
run: | | |
# Skip the PPM-only build for boards where it's too large now | |
if [[ "$BOARD" =~ ":STM32F1:multistm32f103cb:debug_option=none" ]] || [[ "$BOARD" =~ ":STM32F1:multi5in1t18int" ]]; then | |
printf "Not testing PPM-only build for $BOARD."; | |
else | |
source ./buildroot/bin/buildFunctions; | |
cp ./_Config.h.bak Multiprotocol/_Config.h | |
opt_disable ENABLE_SERIAL; | |
buildMulti; | |
fi | |
- name: Build each RF module individually | |
run: | | |
# Skip the per-RF module builds for boards which have fixed modules | |
if [[ "$BOARD" =~ ":STM32F1:multi5in1t18int" ]]; then | |
printf "Not testing individual RF module builds for $BOARD."; | |
else | |
source ./buildroot/bin/buildFunctions; | |
cp ./_Config.h.bak Multiprotocol/_Config.h; | |
buildEachRFModule; | |
fi | |
- name: Build each protocol individually | |
run: | | |
source ./buildroot/bin/buildFunctions; | |
cp ./_Config.h.bak Multiprotocol/_Config.h; | |
buildEachProtocol; | |
build: | |
runs-on: ubuntu-latest | |
# Configure the board matrix | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- board: "multi4in1:avr:multiatmega328p:bootloader=none" | |
name: "ATmega328p" | |
release: "atmega328p" | |
- board: "multi4in1:avr:multiatmega328p:bootloader=optiboot" | |
name: "ATmega328p (Optiboot)" | |
release: "atmega328p-optiboot" | |
- board: "multi4in1:avr:multixmega32d4" | |
name: "OrangeRX" | |
release: "orangerx" | |
- board: "multi4in1:STM32F1:multistm32f103c8:debug_option=none" | |
name: "STM32F103 CC2500 (64KB)" | |
release: "stm32f103-cc2500-64k" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=none" | |
name: "STM32F103 CC2500 (128KB)" | |
release: "stm32f103-cc2500-128k" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=none" | |
name: "STM32F103 (128KB)" | |
release: "stm32f103-128k-4in1" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=native" | |
name: "STM32F103 (128KB, USB Debug)" | |
release: "stm32f103-128k-usb-debug" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=ftdi" | |
name: "STM32F103 (128KB, Serial Debug)" | |
release: "stm32f103-128k-serial-debug" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=none" | |
name: "STM32F103 5-in-1 (128KB)" | |
release: "stm32f103-128k-5in1" | |
- board: "multi4in1:STM32F1:multistm32f103cb:debug_option=none" | |
name: "T-Lite 5-in-1 (128KB)" | |
release: "tlite-5in1" | |
- board: "multi4in1:STM32F1:multi5in1t18int" | |
name: "T18 5-in-1 (128KB)" | |
release: "t18-5in1" | |
- board: "none" | |
name: "Extras" | |
release: "extras" | |
# Set the build name using the friendly board name | |
name: "[Build] ${{ matrix.name }}" | |
# Set the environment variables | |
env: | |
BOARD: ${{ matrix.board }} | |
RELEASE: ${{ matrix.release }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Arduino CLI | |
uses: arduino/setup-arduino-cli@v1.1.2 | |
with: | |
version: "0.32.2" | |
- name: Prepare build environment | |
run: | | |
echo "Github Ref: $GITHUB_REF" | |
echo "Event name: ${{ github.event_name }}" | |
echo "Event action: ${{ github.event.action }}" | |
echo "Tag name: ${{ github.event.release.tag_name }}" | |
arduino-cli config init --additional-urls https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/master/package_multi_4in1_board_index.json,https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-Module-Boards/devel/source/package_multi_4in1_board_devel_index.json | |
arduino-cli core update-index | |
if [[ "$BOARD" =~ ":avr:" ]]; then | |
arduino-cli core install arduino:avr; | |
fi | |
if [[ "$BOARD" =~ "multi4in1-devel:avr" ]]; then | |
arduino-cli core install multi4in1-devel:avr | |
elif [[ "$BOARD" =~ "multi4in1:avr" ]]; then | |
arduino-cli core install multi4in1:avr | |
fi | |
if [[ "$BOARD" =~ "multi4in1-devel:STM32F1:" ]]; then | |
arduino-cli core install multi4in1-devel:STM32F1 | |
elif [[ "$BOARD" =~ "multi4in1:STM32F1:" ]]; then | |
arduino-cli core install multi4in1:STM32F1 | |
fi | |
chmod +x ${GITHUB_WORKSPACE}/buildroot/bin/* | |
echo "${GITHUB_WORKSPACE}/buildroot/bin" >> $GITHUB_PATH | |
mkdir ./build | |
mkdir ./binaries | |
- name: Configure MULTI-Module firmware options | |
run: | | |
# Load the build functions | |
source ./buildroot/bin/buildFunctions; | |
# Get the version | |
getMultiVersion | |
echo "MULTI_VERSION=$(echo $MULTI_VERSION)" >> $GITHUB_ENV | |
# Get all the protocols for this board | |
getAllProtocols | |
echo "A7105_PROTOCOLS=$(echo $A7105_PROTOCOLS)" >> $GITHUB_ENV | |
echo "CC2500_PROTOCOLS=$(echo $CC2500_PROTOCOLS)" >> $GITHUB_ENV | |
echo "CYRF6936_PROTOCOLS=$(echo $CYRF6936_PROTOCOLS)" >> $GITHUB_ENV | |
echo "NRF24L01_PROTOCOLS=$(echo $NRF24L01_PROTOCOLS)" >> $GITHUB_ENV | |
echo "SX1276_PROTOCOLS=$(echo $SX1276_PROTOCOLS)" >> $GITHUB_ENV | |
echo "CCNRF_INO_PROTOCOLS=$(echo $CCNRF_INO_PROTOCOLS)" >> $GITHUB_ENV | |
echo "ALL_PROTOCOLS=$(echo $ALL_PROTOCOLS)" >> $GITHUB_ENV | |
# Disable CHECK_FOR_BOOTLOADER when not needed | |
if [[ "$BOARD" =~ ":avr:multiatmega328p:bootloader=none" ]]; then | |
opt_disable CHECK_FOR_BOOTLOADER; | |
fi | |
- name: Save default firmware configuration | |
run: | | |
cat Multiprotocol/_Config.h | |
cp Multiprotocol/_Config.h ./_Config.h.bak | |
- name: Build release files | |
run: | | |
source ./buildroot/bin/buildFunctions; | |
cp ./_Config.h.bak Multiprotocol/_Config.h; | |
buildReleaseFiles; | |
ls -al ./binaries; | |
NUM_FILES=$(ls -l ./binaries | grep ^- | wc -l); | |
if [ $NUM_FILES -gt 0 ]; then | |
echo "HAVE_FILES=true" >> $GITHUB_ENV | |
else | |
echo "HAVE_FILES=false" >> $GITHUB_ENV | |
fi | |
- name: 'Upload Artifacts' | |
if: env.HAVE_FILES == 'true' | |
uses: actions/upload-artifact/@v4 | |
with: | |
name: multi-${{ matrix.release }} | |
path: ./binaries/ | |
combine: | |
name: "[Deploy] Attach Files" | |
runs-on: ubuntu-latest | |
needs: [test, build] | |
steps: | |
- name: Combine build artifacts | |
uses: actions/upload-artifact/merge@v4 | |
with: | |
name: multi-test-build | |
pattern: multi-* | |
delete-merged: true | |
retention-days: 90 | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: multi-test-build | |
path: ./artifacts/ | |
- name: Display structure of downloaded files | |
run: ls -R ./artifacts/ | |
- name: Deploy files to release | |
if: github.event_name == 'release' && github.event.action == 'created' | |
uses: AButler/upload-release-assets@v3.0 | |
with: | |
files: './artifacts/*' | |
repo-token: ${{ secrets.GITHUB_TOKEN }} |