Skip to content

Commit f73f7e0

Browse files
committed
ci: add a chaotic devnet job
Signed-off-by: ljedrz <ljedrz@users.noreply.github.com>
1 parent 402de83 commit f73f7e0

File tree

2 files changed

+156
-0
lines changed

2 files changed

+156
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
name: Chaotic Devnet Test
2+
3+
on: # TODO: adjust
4+
pull_request:
5+
push:
6+
7+
env:
8+
RUST_BACKTRACE: 1
9+
CARGO_INCREMENTAL: 0
10+
11+
jobs:
12+
build-snarkos:
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
- name: Checkout Code
17+
uses: actions/checkout@v4
18+
19+
- name: Cache Cargo Registry & target
20+
uses: swatinem/rust-cache@v2
21+
22+
- name: Install Rust
23+
uses: dtolnay/rust-toolchain@1.88.0
24+
25+
- name: Install Dependencies
26+
run: |
27+
sudo apt-get update
28+
sudo apt-get install -y --no-install-recommends clang llvm-dev llvm lld pkg-config xz-utils make libssl-dev
29+
30+
- name: Build snarkOS
31+
run: |
32+
echo "Building snarkOS..."
33+
cargo install --locked --path . --features test_network
34+
35+
- name: Upload Binary Artifact
36+
uses: actions/upload-artifact@v4
37+
with:
38+
name: built-snarkos # The key used to retrieve the built binary
39+
path: ~/.cargo/bin/snarkos # The actual folder to save
40+
retention-days: 1 # Keep it briefly to save space
41+
42+
chaos-test:
43+
runs-on: ubuntu-latest
44+
needs: build-snarkos
45+
46+
steps:
47+
- name: Checkout Code
48+
uses: actions/checkout@v4
49+
50+
- name: Download snarkOS
51+
uses: actions/download-artifact@v4
52+
with:
53+
name: built-snarkos
54+
path: bin # Where to put it
55+
56+
- name: Setup Path and Permissions
57+
run: |
58+
# Make it executable (permissions may get lost)
59+
chmod +x bin/snarkos
60+
61+
# Add the 'bin' folder to the system PATH
62+
echo "$(pwd)/bin" >> $GITHUB_PATH
63+
64+
- name: Run Tests with Chaos
65+
# Arguments: <PORT_RANGE> <TEST_COMMAND>
66+
run: ./scripts/chaotic-network-runner.sh 5000-5003 ./.ci/devnet_ci.sh 4 0 0 45

scripts/chaotic-network-runner.sh

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#!/bin/bash
2+
3+
# ==========================================
4+
# CONFIGURATION
5+
# ==========================================
6+
7+
# 1. Require Port Range (Argument 1)
8+
TARGET_PORTS=$1
9+
10+
if [ -z "$TARGET_PORTS" ]; then
11+
echo "Error: No port range provided."
12+
echo "Usage: ./chaos-runner.sh <PORT-RANGE> <COMMAND>"
13+
echo "Example: ./chaotic-network-runner.sh 5000-5003 ./devnet.sh"
14+
exit 1
15+
fi
16+
17+
# Shift arguments so "$@" now only contains the command to run
18+
shift
19+
20+
# Check if there is a command to run left
21+
if [ $# -eq 0 ]; then
22+
echo "Error: No test command provided."
23+
exit 1
24+
fi
25+
26+
# Chaos Timing (in seconds)
27+
MIN_WAIT=10
28+
MAX_WAIT=30
29+
MIN_DURATION=15
30+
MAX_DURATION=30
31+
32+
# Presets from delay-network.sh
33+
PRESETS=("lan" "wan" "spikes") # "bad-wifi" might be too volatile for a generic test
34+
NETWORK_SCRIPT="./scripts/delay-network.sh"
35+
36+
# ==========================================
37+
# CHAOS LOGIC
38+
# ==========================================
39+
40+
reset_network() {
41+
echo "[Chaos Runner] 🧹 Clearing network rules..."
42+
sudo $NETWORK_SCRIPT clear > /dev/null
43+
}
44+
45+
trap reset_network EXIT
46+
47+
chaos_loop() {
48+
echo "[Chaotic Network Runner] 🎲 Background chaos loop started on ports $TARGET_PORTS."
49+
50+
while true; do
51+
# 1. Stay Clean
52+
WAIT_TIME=$(shuf -i $MIN_WAIT-$MAX_WAIT -n 1)
53+
echo "[Chaos Runner] 🟢 Network healthy for ${WAIT_TIME}s..."
54+
sleep $WAIT_TIME
55+
56+
# 2. Select Random Preset
57+
RANDOM_PRESET=${PRESETS[$RANDOM % ${#PRESETS[@]}]}
58+
59+
# 3. Apply Chaos
60+
CHAOS_DURATION=$(shuf -i $MIN_DURATION-$MAX_DURATION -n 1)
61+
echo "[Chaos Runner] 💥 Applying '$RANDOM_PRESET' on ports $TARGET_PORTS for ${CHAOS_DURATION}s..."
62+
63+
sudo $NETWORK_SCRIPT $RANDOM_PRESET $TARGET_PORTS
64+
65+
sleep $CHAOS_DURATION
66+
67+
# 4. Reset
68+
reset_network
69+
done
70+
}
71+
72+
# ==========================================
73+
# MAIN EXECUTION
74+
# ==========================================
75+
76+
# Start chaos in background
77+
chaos_loop &
78+
CHAOS_PID=$!
79+
80+
# Run the actual test command (passed as arguments)
81+
echo "[Chaos Runner] 🚀 Starting main test command: $@"
82+
"$@"
83+
EXIT_CODE=$?
84+
85+
# Cleanup
86+
echo "[Chaos Runner] 🏁 Main command finished with exit code $EXIT_CODE."
87+
kill $CHAOS_PID 2>/dev/null
88+
wait $CHAOS_PID 2>/dev/null
89+
90+
exit $EXIT_CODE

0 commit comments

Comments
 (0)