Skip to content

Commit 4b6051a

Browse files
authored
Parallel Erase (#9)
1 parent e6a7698 commit 4b6051a

File tree

6 files changed

+322
-102
lines changed

6 files changed

+322
-102
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
name: 'Setup JLink Network'
2+
description: 'Build Docker image and setup JLink RemoteServer containers'
3+
inputs:
4+
serials-file:
5+
description: 'Path to file with serial numbers (one per line)'
6+
required: true
7+
vnet-base:
8+
description: 'Base IP address for virtual network (e.g., 192.168.3)'
9+
required: true
10+
vnet-mask:
11+
description: 'Network mask (e.g., 24)'
12+
required: true
13+
default: '24'
14+
runs:
15+
using: 'composite'
16+
steps:
17+
- name: Build JLinkRemoteServer Docker image
18+
shell: bash
19+
run: |
20+
docker build -t my-jlink-image -f .github/workflows/jlinkRemoteServerEmu.dockerfile .
21+
22+
- name: Setup JLinkRemoteServer Docker containers
23+
shell: bash
24+
run: |
25+
docker network rm jlink-net 2>/dev/null || true
26+
docker network create --driver bridge --subnet=${{ inputs.vnet-base }}.0/${{ inputs.vnet-mask }} --gateway=${{ inputs.vnet-base }}.1 jlink-net
27+
28+
serial1=$(sed -n '1p' ${{ inputs.serials-file }})
29+
serial2=$(sed -n '2p' ${{ inputs.serials-file }})
30+
serial3=$(sed -n '3p' ${{ inputs.serials-file }})
31+
32+
docker run -d --rm \
33+
--device=/dev/bus/usb:/dev/bus/usb \
34+
--name jlink100 \
35+
--network jlink-net \
36+
--ip ${{ inputs.vnet-base }}.100 \
37+
my-jlink-image \
38+
-select usb=$serial1 -device STM32F103RE -endian little -speed 4000 -if swd
39+
sleep 3
40+
41+
docker run -d --rm \
42+
--device=/dev/bus/usb:/dev/bus/usb \
43+
--name jlink101 \
44+
--network jlink-net \
45+
--ip ${{ inputs.vnet-base }}.101 \
46+
my-jlink-image \
47+
-select usb=$serial2 -device STM32F103RE -endian little -speed 4000 -if swd
48+
sleep 3
49+
50+
docker run -d --rm \
51+
--device=/dev/bus/usb:/dev/bus/usb \
52+
--name jlink102 \
53+
--network jlink-net \
54+
--ip ${{ inputs.vnet-base }}.102 \
55+
my-jlink-image \
56+
-select usb=$serial3 -device STM32F103RE -endian little -speed 4000 -if swd
57+
sleep 3

.github/workflows/test-erase.yml

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
name: Test Erase
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
workflow_dispatch:
8+
9+
env:
10+
VNET_BASE: 192.168.3
11+
VNET_MASK: 24
12+
13+
jobs:
14+
test-erase:
15+
runs-on: self-hosted
16+
17+
steps:
18+
- name: Cleanup before start
19+
if: always()
20+
run: |
21+
pkill -9 -f JLinkRemoteServer || true
22+
docker rm -f jlink100 jlink101 jlink102 2>/dev/null || true
23+
docker network rm jlink-net 2>/dev/null || true
24+
sleep 2
25+
26+
- uses: actions/checkout@v4
27+
28+
- name: Install package
29+
run: |
30+
python3 -m venv .venv
31+
. .venv/bin/activate
32+
pip install -e ".[dev]"
33+
34+
- name: Detect devices and save serials
35+
run: |
36+
. .venv/bin/activate
37+
bmlab-scan | tee scan.txt
38+
count=$(grep -c "Target: *STM32F103RE" scan.txt)
39+
awk '/JLink Programmer/ {serial=""} /Serial:/ {serial=$2} /Target: *STM32F103RE/ && serial {print serial}' scan.txt | sort | uniq > serials.txt
40+
41+
if [ "$count" -ne 3 ]; then
42+
echo "Test failed: expected 3 STM32F103RE, found $count"
43+
cat scan.txt
44+
exit 1
45+
fi
46+
47+
- name: Test 1 — Erase single device by serial
48+
run: |
49+
. .venv/bin/activate
50+
serial=$(sed -n '1p' serials.txt)
51+
bmlab-erase --serial $serial --mcu STM32F103RE | tee erase-serial1.txt
52+
53+
if ! grep -q "Success" erase-serial1.txt; then
54+
echo "Test 1 failed: erase not successful"
55+
cat erase-serial1.txt
56+
exit 1
57+
fi
58+
59+
- name: Test 2 — Erase without mcu (auto-detect target)
60+
run: |
61+
. .venv/bin/activate
62+
serial=$(sed -n '1p' serials.txt)
63+
bmlab-erase --serial $serial | tee erase-serial2.txt
64+
65+
if ! grep -q "Success" erase-serial2.txt; then
66+
echo "Test 2 failed: erase not successful"
67+
cat erase-serial2.txt
68+
exit 1
69+
fi
70+
71+
- name: Test 3 — Erase multiple by serial
72+
run: |
73+
. .venv/bin/activate
74+
serial1=$(sed -n '1p' serials.txt)
75+
serial2=$(sed -n '2p' serials.txt)
76+
serial3=$(sed -n '3p' serials.txt)
77+
78+
bmlab-erase --serial $serial1 $serial2 $serial3 --mcu STM32F103RE | tee erase-serial3.txt
79+
80+
success_count=$(grep -c "Success" erase-serial3.txt || echo 0)
81+
82+
if [ "$success_count" -ne 3 ]; then
83+
echo "Test 3 failed: expected 3 successful erases, found $success_count"
84+
cat erase-serial3.txt
85+
exit 1
86+
fi
87+
88+
- name: Setup JLink network containers
89+
uses: ./.github/actions/setup-jlink-network
90+
with:
91+
serials-file: serials.txt
92+
vnet-base: ${{ env.VNET_BASE }}
93+
vnet-mask: ${{ env.VNET_MASK }}
94+
95+
- name: Test 4 — Erase single device by IP
96+
run: |
97+
. .venv/bin/activate
98+
bmlab-erase --ip $VNET_BASE.100 --mcu STM32F103RE | tee erase-ip1.txt
99+
100+
if ! grep -q "Success" erase-ip1.txt; then
101+
echo "Test 4 failed: erase not successful"
102+
cat erase-ip1.txt
103+
exit 1
104+
fi
105+
106+
- name: Test 5 — Erase three devices in parallel by IP
107+
run: |
108+
. .venv/bin/activate
109+
bmlab-erase --ip $VNET_BASE.100 $VNET_BASE.101 $VNET_BASE.102 --mcu STM32F103RE | tee erase-ip3.txt
110+
111+
success_count=$(grep -c "Success" erase-ip3.txt || echo 0)
112+
113+
if [ "$success_count" -ne 3 ]; then
114+
echo "Test 5 failed: expected 3 successful erases, found $success_count"
115+
cat erase-ip3.txt
116+
exit 1
117+
fi
118+
119+
for ip in 100 101 102; do
120+
if ! grep -q "$VNET_BASE\.$ip" erase-ip3.txt; then
121+
echo "Test 5 failed: no result for $VNET_BASE.$ip"
122+
cat erase-ip3.txt
123+
exit 1
124+
fi
125+
done
126+
127+
- name: Cleanup after tests
128+
if: always()
129+
run: |
130+
docker rm -f jlink100 jlink101 jlink102 || true
131+
docker network rm jlink-net || true
132+
pkill -9 -f JLinkRemoteServer || true
133+
sleep 2

.github/workflows/test-flash.yml

Lines changed: 15 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -95,45 +95,25 @@ jobs:
9595
exit 1
9696
fi
9797
98-
- name: Build JLinkRemoteServer Docker image
99-
run: |
100-
docker build -t my-jlink-image -f .github/workflows/jlinkRemoteServerEmu.dockerfile .
98+
- name: Setup JLink network containers
99+
uses: ./.github/actions/setup-jlink-network
100+
with:
101+
serials-file: serials.txt
102+
vnet-base: ${{ env.VNET_BASE }}
103+
vnet-mask: ${{ env.VNET_MASK }}
101104

102-
- name: Setup JLinkRemoteServer Docker containers
105+
- name: Test 3.1 — Erase three devices before flashing
103106
run: |
104-
docker network rm jlink-net 2>/dev/null || true
105-
docker network create --driver bridge --subnet=$VNET_BASE.0/$VNET_MASK --gateway=$VNET_BASE.1 jlink-net
106-
107-
serial1=$(sed -n '1p' serials.txt)
108-
serial2=$(sed -n '2p' serials.txt)
109-
serial3=$(sed -n '3p' serials.txt)
110-
111-
docker run -d --rm \
112-
--device=/dev/bus/usb:/dev/bus/usb \
113-
--name jlink100 \
114-
--network jlink-net \
115-
--ip $VNET_BASE.100 \
116-
my-jlink-image \
117-
-select usb=$serial1 -device STM32F103RE -endian little -speed 4000 -if swd
118-
sleep 3
107+
. .venv/bin/activate
108+
bmlab-erase --ip $VNET_BASE.100 $VNET_BASE.101 $VNET_BASE.102 --mcu STM32F103RE | tee erase-before-flash.txt
119109
120-
docker run -d --rm \
121-
--device=/dev/bus/usb:/dev/bus/usb \
122-
--name jlink101 \
123-
--network jlink-net \
124-
--ip $VNET_BASE.101 \
125-
my-jlink-image \
126-
-select usb=$serial2 -device STM32F103RE -endian little -speed 4000 -if swd
127-
sleep 3
110+
success_count=$(grep -c "Success" erase-before-flash.txt || echo 0)
128111
129-
docker run -d --rm \
130-
--device=/dev/bus/usb:/dev/bus/usb \
131-
--name jlink102 \
132-
--network jlink-net \
133-
--ip $VNET_BASE.102 \
134-
my-jlink-image \
135-
-select usb=$serial3 -device STM32F103RE -endian little -speed 4000 -if swd
136-
sleep 3
112+
if [ "$success_count" -ne 3 ]; then
113+
echo "Test 3.1 failed: expected 3 successful erases, found $success_count"
114+
cat erase-before-flash.txt
115+
exit 1
116+
fi
137117
138118
- name: Test 4 — Flash three devices in parallel
139119
run: |

.github/workflows/test-scan.yml

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -79,51 +79,13 @@ jobs:
7979
! bmlab-scan --network 127.0.0.2/32 | tee scan5.txt | grep -q "STM32F103RE"
8080
grep -qi "No JLink Remote Servers found on the network." scan5.txt
8181
82-
- name: Build JLinkRemoteServer Docker image
83-
run: |
84-
docker build -t my-jlink-image -f .github/workflows/jlinkRemoteServerEmu.dockerfile .
85-
86-
- name: Cleanup jlink-net Docker network
87-
run: |
88-
docker rm -f jlink100 jlink101 jlink102 2>/dev/null || true
89-
docker network rm jlink-net 2>/dev/null || true
82+
- name: Setup JLink network containers
83+
uses: ./.github/actions/setup-jlink-network
84+
with:
85+
serials-file: serials.txt
86+
vnet-base: ${{ env.VNET_BASE }}
87+
vnet-mask: ${{ env.VNET_MASK }}
9088

91-
- name: Setup JLinkRemoteServer Docker containers
92-
run: |
93-
docker network rm jlink-net 2>/dev/null || true
94-
docker network create --driver bridge --subnet=$VNET_BASE.0/$VNET_MASK --gateway=$VNET_BASE.1 jlink-net
95-
96-
serial1=$(sed -n '1p' serials.txt)
97-
serial2=$(sed -n '2p' serials.txt)
98-
serial3=$(sed -n '3p' serials.txt)
99-
100-
docker run -d --rm \
101-
--device=/dev/bus/usb:/dev/bus/usb \
102-
--name jlink100 \
103-
--network jlink-net \
104-
--ip $VNET_BASE.100 \
105-
my-jlink-image \
106-
-select usb=$serial1 -device STM32F103RE -endian little -speed 4000 -if swd
107-
sleep 3
108-
109-
docker run -d --rm \
110-
--device=/dev/bus/usb:/dev/bus/usb \
111-
--name jlink101 \
112-
--network jlink-net \
113-
--ip $VNET_BASE.101 \
114-
my-jlink-image \
115-
-select usb=$serial2 -device STM32F103RE -endian little -speed 4000 -if swd
116-
sleep 3
117-
118-
docker run -d --rm \
119-
--device=/dev/bus/usb:/dev/bus/usb \
120-
--name jlink102 \
121-
--network jlink-net \
122-
--ip $VNET_BASE.102 \
123-
my-jlink-image \
124-
-select usb=$serial3 -device STM32F103RE -endian little -speed 4000 -if swd
125-
sleep 3
126-
12789
- name: Test 6 — Multiple RemoteServers network scan
12890
run: |
12991
. .venv/bin/activate

0 commit comments

Comments
 (0)