-
Notifications
You must be signed in to change notification settings - Fork 71
237 lines (193 loc) · 9.59 KB
/
hil-unity-checks.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
name: Hil unity library checks
# on which event should we start push, pull request or schedule dispatches
on:
- push
env:
TEST_VERSION: 1.0.0
permissions:
contents: write
# This template runes multiple workflows
jobs:
#############################################################################
# This action sets common variables for the flow and
# identifies the libs 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
with:
token: ${{ secrets.UNITY_TOKEN }}
submodules: recursive
# 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
# arduino-cli core install "infineon:xmc"
- name: Install/Update Arduino Platform
run: |
arduino-cli core update-index
arduino-cli core install "arduino:avr"
# Fetch variables and move them to the GITHUB_OUTPUT and fetch HIL information
- id: startup
run: |
# switch on the HIL
cd /opt/runner_support/
REPO="$(basename "$GITHUB_REPOSITORY")"
./py_checkusb.py --switch repo --namelist $REPO --onoff on
# set the hil-unity-checks
hil=$(./py_checkusb.py --readyaml $GITHUB_WORKSPACE/tests/hil-unity-checklist.yaml --json)
echo "hil=${hil}" >> $GITHUB_OUTPUT
# fetch unity libraries
readarray -t data < <(echo $hil | jq -r '.|keys[]')
export dev=$(jq --compact-output --null-input '$ARGS.positional' --args -- "${data[@]}")
echo "devices=${dev}" >> $GITHUB_OUTPUT
echo "devices=${dev}"
# Connect the GITHUB_OUTPUT to the variables and the workflow output mechanism
outputs:
hil: ${{ steps.startup.outputs.hil }}
devices: ${{ steps.startup.outputs.devices }}
#############################################################################
# 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]
# 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
device: ${{ fromJson(needs.setup.outputs.devices) }}
# These are the steps which should run for each combination of fqbn and lib code
steps:
# checkout the latest github action code
- name: Checkout actions
uses: actions/checkout@v4
with:
token: ${{ secrets.UNITY_TOKEN }}
submodules: recursive
# setup environment
- name: Environment
run: |
cd $HOME
rm -rf ~/.arduino15/packages/Infineon/hardware/xmc/*
ln -s $GITHUB_WORKSPACE ~/.arduino15/packages/Infineon/hardware/xmc/$TEST_VERSION
hil=${{ toJson(needs.setup.outputs.hil) }}
REPO="$(basename "$GITHUB_REPOSITORY")"
DEVICE="$(basename ${{ matrix.device }} )"
LIBRARY=$(echo $hil | jq ".\"${DEVICE}\"" -r --compact-output)
FQBN=`tr '.' ':' <<<"${DEVICE}"`
echo "repo=$REPO" >> $GITHUB_ENV
echo "device=$DEVICE" >> $GITHUB_ENV
echo "version=$TEST_VERSION" >> $GITHUB_ENV
echo "library=$LIBRARY" >> $GITHUB_ENV
echo "fqbn=$FQBN" >> $GITHUB_ENV
echo "Repo " $REPO
echo "Device " $DEVICE
echo "Library " $LIBRARY
echo "FQBN " $FQBN
echo "Version " ${TEST_VERSION}
# Build the test code with make and flash it to the board
# runs via nested loops:
# - first loop over the libraries mentioned for a device in the yaml file
# - selects the serial ids and ports for all devices connected with this device and library
# - second loop over the examples mentioned below the selected device for a library in the yaml file
# - third loop over the tests mentioned below the selected example for a device and library in the yaml file
# - fourth loop over the make commands mentioned below the selected test for a device, example and library in the yaml file
- name: Build
run: |
export TMPDIR=$HOME/tmp
mkdir -p $TMPDIR
rm -rf $HOME/artefact
mkdir -p $HOME/artefact
lib=${{ toJson(env.library) }}
readarray -t LIBS < <(echo ${lib} | jq ".|keys[]" -r --compact-output)
# loop over all libs in the unity test yaml
for LIB in "${LIBS[@]}"; do
cd /opt/runner_support/
readarray -t SERIALS < <(echo $(./py_checkusb.py --type ${LIB} --json) | jq ".\"${LIB}\".\"${{ env.device }}\"|keys[]" -r)
# check if we have one or more serial numbers for this lib or stop here
if [[ -z $SERIALS ]]; then
echo "No serial or library information found"
exit 0
fi
# loop over all serials and fetch the ports
declare -a PORTS
for SERIAL in "${SERIALS[@]}"; do
PORTS+=($(/opt/runner_support/find_usb.sh $SERIAL))
done
# loop over all examples for one library
readarray -t EXAMPLES < <(echo $lib | jq ".\"${LIB}\"|keys[]" -r --compact-output)
for EXAMPLE in "${EXAMPLES[@]}"; do
echo "=============================================================================================================="
echo "Run for EXAMPLE: ${EXAMPLE} under LIB: ${LIB}"
echo "=============================================================================================================="
# loop over all tests for one example and compile7flash the devices
readarray -t TESTS < <(echo $lib | jq ".\"${LIB}\".\"${EXAMPLE}\"[]" -r --compact-output)
for ((idx=0; idx<${#TESTS[@]}; ++idx)); do
cd $GITHUB_WORKSPACE/tests/arduino-core-tests/
echo "=============================================================================================================="
echo "Run on index $idx for TEST: ${TESTS[idx]} under EXAMPLE: ${EXAMPLE} and LIB: ${LIB} on port: ${PORTS[idx]}"
echo "=============================================================================================================="
make FQBN=${{ env.fqbn }} PORT=${PORTS[idx]} UNITY_PATH=/opt/Unity ${TESTS[idx]}
mkdir -p ~/artefact/${LIB}/${EXAMPLE}/${TESTS[idx]}/
mv ./build/build/* ~/artefact/${LIB}/${EXAMPLE}/${TESTS[idx]}/.
echo "=============================================================================================================="
done # end of TEST loop flash
# loop over all tests for one example and monitor the serial output
for ((idx=0; idx<${#TESTS[@]}; ++idx)); do
echo "=============================================================================================================="
echo "Monitor on index $idx for TEST: ${TESTS[idx]} under EXAMPLE: ${EXAMPLE} and LIB: ${LIB}"
timeout 1m \
/opt/runner_support/py_console.py \
--port ${PORTS[idx]} \
--baud 115200 \
--report ~/artefact/${LIB}/${EXAMPLE}/${TESTS[idx]}/${{ env.device }}/report.json
echo "=============================================================================================================="
done # end of TEST loop monitor
done # end of EXAMPLE loop
done # end of LIB loop
# Upload the compiled HEX files to the GitHub server
- name: Artefact
uses: actions/upload-artifact@v4
with:
name: ${{ env.device }}
path: ~/artefact/*
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