Test 6: with arduino compile #526
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
name: Arduino CI | |
# on which event should we start push, pull request or schedule dispatches | |
on: | |
- push | |
- pull_request | |
# This template runes multiple workflows | |
jobs: | |
############################################################################# | |
# This action sets common variables for the flow and | |
# identifies the examples to compile | |
setup: | |
# we run this on self hosted runner, use labels to be more specific | |
# add specific names if there are some, otherwise self-hosted, X64, Linux are the default ones | |
runs-on: | |
- self-hosted | |
- X64 | |
- Linux | |
steps: | |
# checkout the latest github action code | |
- name: Checkout actions | |
uses: actions/checkout@v4 | |
# checkout the latest arduino-cli compiler | |
- name: Setup Arduino CLI | |
uses: arduino/setup-arduino-cli@master | |
# Update the arduino code. Attention this does not setup XMC packages as this are set inside the self hosted runner | |
# the arduino board support packages can be updated automatically | |
# the XMC board support package is only linked inside the self hosted runner, which allows | |
# to use none official and beta versions | |
- name: Install/Update Arduino Platform | |
run: | | |
arduino-cli core update-index | |
arduino-cli core install "arduino:avr" | |
arduino-cli core install "infineon:xmc" | |
# Fetch variables and move them to the GITHUB_OUTPUT and fetch HIL information | |
- id: startup | |
run: | | |
export $(xfp-dev arduino workspace-setup project-name) | |
cd /opt/runner_support/ | |
REPO="$(basename "$GITHUB_REPOSITORY")" | |
echo "project=$PROJECTNAME" >> $GITHUB_OUTPUT | |
serials=$(echo $(./py_checkusb.py --repo ${REPO} --list serial --json) | jq ".\"${REPO}\"" --compact-output ) | |
echo "serials=${serials}" >> $GITHUB_OUTPUT | |
./py_checkusb.py --switch repo --namelist $REPO --onoff on | |
declare -a data | |
cd $GITHUB_WORKSPACE/src/framework/arduino/ | |
for x in examples/*; | |
do | |
data+=($x); | |
done; | |
export examples=$(jq --compact-output --null-input '$ARGS.positional' --args -- "${data[@]}") | |
echo examples="$examples" >> $GITHUB_OUTPUT | |
xfp=$(/opt/runner_support/py_checkusb.py --readyaml $GITHUB_WORKSPACE/.github/fqbn.yml --json) | |
echo "xfp=${xfp}" >> $GITHUB_OUTPUT | |
# Connect the GITHUB_OUTPUT to the variables and the workflow output mechanism | |
outputs: | |
project: ${{ steps.startup.outputs.project }} | |
serials: ${{ steps.startup.outputs.serials }} | |
examples: ${{ steps.startup.outputs.examples }} | |
xfp: ${{ steps.startup.outputs.xfp }} | |
############################################################################# | |
# The build job compiles the sample code for different boards | |
build-ard: | |
# wait on first setup run before starting main function | |
needs: setup | |
# we run this on self hosted runner, use labels to be more specific | |
# add specific names if there are some, otherwise self-hosted, X64, Linux are the default ones | |
runs-on: | |
- self-hosted | |
- X64 | |
- Linux | |
# which combination of sample code and boards should run | |
# for this example of 2 sample codes and 3 boards a total of 2x3=6 runners have to work. | |
# if we have only 4 runner then these 4 are started and the last 2 are waiting until they can start | |
strategy: | |
matrix: | |
# List of all examples in the lib to compile | |
example: ${{ fromJson(needs.setup.outputs.examples) }} | |
# These are the steps which should run for each combination of fqbn and example code | |
steps: | |
# checkout the latest github action code | |
- name: Checkout actions | |
uses: actions/checkout@v4 | |
# checkout the latest arduino-cli compiler | |
- name: Setup Arduino CLI | |
uses: arduino/setup-arduino-cli@master | |
# prepare the runner for the repo data | |
# setup links inside the self hosted runner for correct directory setup | |
# REPO is the base name of the library which is linked to the right directory structure | |
# check wether the .arduino15 packages dir is available | |
# ln -sf $GITHUB_WORKSPACE/$REPO/build/ $HOME/Arduino/libraries/$REPO | |
- name: Generate Arduino Library | |
run: | | |
ln -sfn /opt/XMC-for-Arduino $HOME/.arduino15/packages/Infineon | |
mkdir -p "$HOME/Arduino/libraries" | |
cd $GITHUB_WORKSPACE/ | |
xfp-dev arduino workspace-setup --path $HOME/Arduino/libraries | |
# Compile the sample code for the selected board and board support package with the arduino compiler | |
# ln -sf $GITHUB_WORKSPACE/ $HOME/Arduino/libraries/$REPO | |
- name: Compile | |
run: | | |
echo $HOME | |
export TMPDIR=$HOME/tmp | |
mkdir -p $TMPDIR | |
cd $HOME/Arduino/libraries/${{ needs.setup.outputs.project }} | |
xfp=${{ toJson(needs.setup.outputs.xfp) }} | |
export fqbn=$(echo ${xfp} | jq ".\"fqbn\"" -r --compact-output ) | |
arduino-cli compile ${fqbn} --libraries="." --libraries="$HOME/Arduino/libraries/." ${{ matrix.example }} --verbose | |
# ############################################################################# | |
# # The build job compiles the sample code for different boards | |
# build-plt: | |
# # wait on first setup run before starting main function | |
# needs: setup | |
# # we run this on self hosted runner, use labels to be more specific | |
# # add specific names if there are some, otherwise self-hosted, X64, Linux are the default ones | |
# runs-on: | |
# - self-hosted | |
# - X64 | |
# - Linux | |
# # which combination of sample code and boards should run | |
# # for this example of 2 sample codes and 3 boards a total of 2x3=6 runners have to work. | |
# # if we have only 4 runner then these 4 are started and the last 2 are waiting until they can start | |
# strategy: | |
# matrix: | |
# # List of all examples in the lib to compile | |
# example: ${{ fromJson(needs.setup.outputs.matrix_example) }} | |
# steps: | |
# # checkout the latest github action code | |
# - name: Checkout actions | |
# uses: actions/checkout@v4 | |
# # checkout the latest arduino-cli compiler | |
# - name: Setup Arduino CLI | |
# uses: arduino/setup-arduino-cli@master | |
# # prepare the runner for the repo data | |
# # setup links inside the self hosted runner for correct directory setup | |
# # REPO is the base name of the library which is linked to the right directory structure | |
# # check wether the .arduino15 packages dir is available | |
# # export REPO=${{ needs.setup.outputs.repo }} | |
# # ln -sf $GITHUB_WORKSPACE/$REPO/build/ $HOME/Arduino/libraries/$REPO | |
# - name: Set and check environment, install repos | |
# run: | | |
# ln -sfn /opt/XMC-for-Arduino $HOME/.arduino15/packages/Infineon | |
# mkdir -p "$HOME/Arduino/libraries" | |
# cd $GITHUB_WORKSPACE/ | |
# xfp-dev arduino workspace-setup --path $HOME/Arduino/libraries | |
# - name: Install PlatformIO | |
# run: | | |
# python -m pip install --upgrade pip | |
# pip install --upgrade platformio | |
# platformio platform install -f infineonxmc | |
# platformio platform install -f atmelavr | |
# # PlatformIO uses python for compiling and it does multiple board compiles | |
# # at once. PlatformIO is used here to check compatibility, but is not needed for the the flash step | |
# - name: Run PlatformIO | |
# run: | | |
# cd $HOME/Arduino/libraries/${{ needs.setup.outputs.project }} | |
# # boards="${{ needs.setup.outputs.fqbn_example }}" | |
# # export board=`echo $boards | perl -pe 's/fqbn\=\w+:\w+:/board /gx'` | |
# # export board=`echo $board | perl -ne 'print lc'` | |
# # pio ci --lib="." ${board} --project-option="lib_deps=Wire" | |
# pio ci --lib="." --board=uno --project-option="lib_deps=Wire" | |
# env: | |
# PLATFORMIO_CI_SRC: ${{ matrix.example }} | |
############################################################################# | |
# This step allows HIL (Hardware in the loop), therefore | |
# is searches for the given board/sensor combination and tries to find the actual port | |
# on the self hosted runner. (see documentation for the board2port finder) | |
flash: | |
# We need a successful build before we can run the deploy | |
needs: [setup, build-ard] | |
# we run this on self hosted runner, use labels to be more specific | |
# add specific names if there are some, otherwise self-hosted, X64, Linux are the default ones | |
runs-on: | |
- self-hosted | |
- X64 | |
- Linux | |
# do not stop if a single job fails | |
continue-on-error: true | |
strategy: | |
# the code to flash | |
matrix: | |
# the serials of the hardware boards | |
serials: ${{ fromJson(needs.setup.outputs.serials) }} | |
# These are the steps which should run for each combination of fqbn and example code | |
steps: | |
- name: Environment | |
run: | | |
cd /opt/runner_support/ | |
REPO="$(basename "$GITHUB_REPOSITORY")" | |
PROJECT=${{ needs.setup.outputs.project }} | |
SERIALID=${{ matrix.serials }} | |
xfp=${{ toJson(needs.setup.outputs.xfp) }} | |
echo "xfp=${xfp}" | |
echo $(echo ${xfp} | jq ".\"hil\".\"example\"" -r --compact-output ) | |
PORT=$( echo $(./py_checkusb.py --serial ${SERIALID} --list comport --json) | jq ".\"${SERIALID}\"" -r) | |
TYPE=$( echo $(./py_checkusb.py --serial ${SERIALID} --list type --json) | jq ".\"${SERIALID}\"|.[0]" -r) | |
DEVTYPE=$( echo $(./py_checkusb.py --serial ${SERIALID} --list devtype --json) | jq ".\"${SERIALID}\"|.[0]" -r) | |
DEVICE=$(echo $(./py_checkusb.py --serial ${SERIALID} --list device --json) | jq ".\"${SERIALID}\"|.[0]" -r) | |
FQBN=`tr '.' ':' <<<"${DEVICE}"` | |
echo "repo=$REPO" >> $GITHUB_ENV | |
echo "project=$PROJECT" >> $GITHUB_ENV | |
echo "serials=$SERIALID" >> $GITHUB_ENV | |
echo "port=$PORT" >> $GITHUB_ENV | |
echo "type=$TYPE" >> $GITHUB_ENV | |
echo "devtype=$DEVTYPE" >> $GITHUB_ENV | |
echo "fqbn=$FQBN" >> $GITHUB_ENV | |
echo "device=$DEVICE" >> $GITHUB_ENV | |
echo "example="$(echo ${xfp} | jq ".\"hil.example\"" -r --compact-output ) >> $GITHUB_ENV | |
echo "baud="$(echo ${xfp} | jq ".\"hil.baud\"" -r --compact-output ) >> $GITHUB_ENV | |
echo "Repository name: " $REPO | |
echo "Project name: " $PROJECT | |
echo "Device Serial ID: " $SERIALID | |
echo "Port found: " $PORT | |
echo "Type: " $TYPE | |
echo "Device Type: " $DEVTYPE | |
echo "FQBN: " $FQBN | |
echo "Device: " $DEVICE | |
echo "Example: " $(echo ${xfp} | jq ".\"hil.example\"" -r --compact-output ) | |
echo "Baud example: " $(echo ${xfp} | jq ".\"hil.baud\"" -r --compact-output ) | |
# Compile the code which we want to flash | |
# REPO: the name of the repository which is also the link name | |
# check/set the arduino15 package library | |
# link the repo to the correct place for compiling under arduino-cli | |
# compile the code with the arduino-cli and export the binary files for flashing | |
# ln -sf $GITHUB_WORKSPACE/ $HOME/Arduino/libraries/$REPO | |
- name: Compile Sketch | |
run: | | |
export TMPDIR=$HOME/tmp | |
mkdir -p $TMPDIR | |
ln -sfn /opt/XMC-for-Arduino $HOME/.arduino15/packages/Infineon | |
mkdir -p "$HOME/Arduino/libraries" | |
cd $HOME/Arduino/libraries/${{ env.project }} | |
arduino-cli compile --clean --log --warnings all \ | |
--fqbn ${{ env.fqbn }} \ | |
--libraries="." \ | |
--libraries="$HOME/Arduino/libraries/." ${{ env.example }} \ | |
--export-binaries | |
# Flashes the compiled HEX file onto the selected MCU | |
# REPO: the name of the repository which is also the link name | |
# HEXNAME: the board depended name of the HEX files | |
# SERIALID: the unique serial number of the hardware board according the board2port.yaml | |
# DEVICE: the flashing device according the board2port.yaml | |
# PORT: real PORT name of the attached hardware based on the SERIALID | |
# use the python based XMC flasher | |
- name: Flash | |
run: | | |
cd $HOME | |
python $HOME/.arduino15/packages/Infineon/hardware/xmc/3.2.0/tools/xmc-flasher.py upload -d ${{ env.devtype }} -p ${{ env.port }} -f $HOME/Arduino/libraries/${{ env.project }}/${{ env.example }}/build/${{ env.device }}/*.hex | |
# Monitoring the serial output from the attached and flashed hardware and collecting | |
# ERROR, Warning and statistical data for reporting | |
- name: Monitor | |
run: | | |
if [ "${{ env.port }}" != 'null' ]; then | |
echo "need to monitor" | |
timeout 1m /opt/runner_support/py_console.py --port ${{ env.port }} --baud ${{ env.baud }} --report ${HOME}/Arduino/libraries/${{ env.project }}/${{ env.example }}/build/${{ env.device }}/report.txt | |
else | |
echo "No port found" | |
fi | |
# Upload the compiled HEX files to the GitHub server | |
- name: Artefact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ env.type }}_${{ env.serials }} | |
path: $HOME/Arduino/libraries/${{ env.project }}/${{ env.example }}/build/${{ env.device }}/* | |
if-no-files-found: ignore | |
############################################################################# | |
# Switch off the HIL after all tests are done | |
post: | |
# we run this no matter if before fails | |
if: always() | |
# wait on first setup run before starting main function | |
needs: [setup, flash] | |
# we run this on self hosted runner, use labels to be more specific | |
# add specific names if there are some, otherwise self-hosted, X64, Linux are the default ones | |
runs-on: | |
- self-hosted | |
- X64 | |
- Linux | |
steps: | |
- name: Switch off HIL | |
run: | | |
cd /opt/runner_support/ | |
REPO="$(basename "$GITHUB_REPOSITORY")" | |
./py_checkusb.py --switch repo --namelist $REPO --onoff off |