This repository has been archived by the owner on Nov 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[CI] Add bootnode checking CI jobs (#6889)
* Add check_bootnode script and github action * fix mktemp for linux machines * Update check_bootnodes.sh show logs to see what's going wrong * fix ephemeral ports and fetch polkadot * fix check-bootnodes.yml * increase node spawn holdoff * disable fail-fast * refactor, separate out check_bootnodes and make it posix-compliant * add new job for detecting new bootnodes * fix check-bootnodes.yml * only check all bootnodes on release * Add test bad bootnode REVERT ME before merging PR. Should cause the test to fail, then when we remove it, we should succeed. Sadly doesn't account for a new successful bootnode, should ask if we have one we can use for testing. * fix paths * fix paths and git... hopefully * this better work... * fix * test * last test * Revert "Add test bad bootnode" This reverts commit 540dd97. * Update check_bootnodes.sh * optimisations Begin polling the RPC node right after spawning, allowing us to break early on detecting peers * increase holdoff to 5 seconds * dont delete chainspec til we kill the node * Update check-bootnodes.yml * Remove checking bootnodes on pushing of this branch --------- Co-authored-by: parity-processbot <>
- Loading branch information
Showing
5 changed files
with
226 additions
and
0 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# checks all networks we care about (kusama, polkadot, westend) and ensures | ||
# the bootnodes in their respective chainspecs are contactable | ||
|
||
name: Check all bootnodes | ||
on: | ||
push: | ||
branches: | ||
# Catches v1.2.3 and v1.2.3-rc1 | ||
- release-v[0-9]+.[0-9]+.[0-9]+* | ||
|
||
jobs: | ||
check_bootnodes: | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
runtime: [westend, kusama, polkadot] | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout sources | ||
uses: actions/checkout@v3 | ||
- name: Install polkadot | ||
shell: bash | ||
run: | | ||
curl -L "$(curl -s https://api.github.com/repos/paritytech/polkadot/releases/latest \ | ||
| jq -r '.assets | .[] | select(.name == "polkadot").browser_download_url')" \ | ||
| sudo tee /usr/local/bin/polkadot > /dev/null | ||
sudo chmod +x /usr/local/bin/polkadot | ||
polkadot --version | ||
- name: Check ${{ matrix.runtime }} bootnodes | ||
shell: bash | ||
run: scripts/ci/github/check_bootnodes.sh node/service/chain-specs/${{ matrix.runtime }}.json |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# If a chainspec file is updated with new bootnodes, we check to make sure those bootnodes are contactable | ||
|
||
name: Check new bootnodes | ||
on: | ||
pull_request: | ||
paths: | ||
- 'node/service/chain-specs/*.json' | ||
|
||
jobs: | ||
check_bootnodes: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout sources | ||
uses: actions/checkout@v3 | ||
with: | ||
fetch-depth: 0 | ||
- name: Install polkadot | ||
shell: bash | ||
run: | | ||
curl -L "$(curl -s https://api.github.com/repos/paritytech/polkadot/releases/latest \ | ||
| jq -r '.assets | .[] | select(.name == "polkadot").browser_download_url')" \ | ||
| sudo tee /usr/local/bin/polkadot > /dev/null | ||
sudo chmod +x /usr/local/bin/polkadot | ||
polkadot --version | ||
- name: Check new bootnodes | ||
shell: bash | ||
run: | | ||
scripts/ci/github/check_new_bootnodes.sh |
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#!/usr/bin/env bash | ||
|
||
# In this script, we check each bootnode for a given chainspec file and ensure they are contactable. | ||
# We do this by removing every bootnode from the chainspec with the exception of the one | ||
# we want to check. Then we spin up a node using this new chainspec, wait a little while | ||
# and then check our local node's RPC endpoint for the number of peers. If the node hasn't | ||
# been able to contact any other nodes, we can reason that the bootnode we used is not well-connected | ||
# or is otherwise uncontactable. | ||
|
||
# shellcheck source=scripts/ci/common/lib.sh | ||
source "$(dirname "${0}")/../common/lib.sh" | ||
CHAINSPEC_FILE="$1" | ||
RUNTIME=$(basename "$CHAINSPEC_FILE" | cut -d '.' -f 1) | ||
|
||
trap cleanup EXIT INT TERM | ||
|
||
cleanup(){ | ||
echo "[+] Script interrupted or ended. Cleaning up..." | ||
# Kill all the polkadot processes | ||
killall polkadot > /dev/null 2>&1 | ||
exit $1 | ||
} | ||
|
||
# count the number of bootnodes | ||
BOOTNODES=$( jq -r '.bootNodes | length' "$CHAINSPEC_FILE" ) | ||
# Make a temporary dir for chainspec files | ||
# Store an array of the bad bootnodes | ||
BAD_BOOTNODES=() | ||
GOOD_BOOTNODES=() | ||
PIDS=() | ||
|
||
echo "[+] Checking $BOOTNODES bootnodes for $RUNTIME" | ||
for i in $(seq 0 $((BOOTNODES-1))); do | ||
BOOTNODE=$( jq -r .bootNodes["$i"] < "$CHAINSPEC_FILE" ) | ||
# Check each bootnode in parallel | ||
check_bootnode "$BOOTNODE" "$CHAINSPEC_FILE" & | ||
PIDS+=($!) | ||
# Hold off 5 seconds between attempting to spawn nodes to stop the machine from getting overloaded | ||
sleep 5 | ||
done | ||
RESPS=() | ||
# Wait for all the nodes to finish | ||
for pid in "${PIDS[@]}"; do | ||
wait "$pid" | ||
RESPS+=($?) | ||
done | ||
echo | ||
# For any bootnodes that failed, add them to the bad bootnodes array | ||
for i in "${!RESPS[@]}"; do | ||
if [ "${RESPS[$i]}" -ne 0 ]; then | ||
BAD_BOOTNODES+=("$( jq -r .bootNodes["$i"] < "$CHAINSPEC_FILE" )") | ||
fi | ||
done | ||
# For any bootnodes that succeeded, add them to the good bootnodes array | ||
for i in "${!RESPS[@]}"; do | ||
if [ "${RESPS[$i]}" -eq 0 ]; then | ||
GOOD_BOOTNODES+=("$( jq -r .bootNodes["$i"] < "$CHAINSPEC_FILE" )") | ||
fi | ||
done | ||
|
||
# If we've got any uncontactable bootnodes for this runtime, print them | ||
if [ ${#BAD_BOOTNODES[@]} -gt 0 ]; then | ||
echo "[!] Bad bootnodes found for $RUNTIME:" | ||
for i in "${BAD_BOOTNODES[@]}"; do | ||
echo " $i" | ||
done | ||
cleanup 1 | ||
else | ||
echo "[+] All bootnodes for $RUNTIME are contactable" | ||
cleanup 0 | ||
fi |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#!/bin/bash | ||
set -e | ||
# shellcheck source=scripts/ci/common/lib.sh | ||
source "$(dirname "${0}")/../common/lib.sh" | ||
|
||
# This script checks any new bootnodes added since the last git commit | ||
|
||
RUNTIMES=( kusama westend polkadot ) | ||
|
||
WAS_ERROR=0 | ||
|
||
for RUNTIME in "${RUNTIMES[@]}"; do | ||
CHAINSPEC_FILE="node/service/chain-specs/$RUNTIME.json" | ||
# Get the bootnodes from master's chainspec | ||
git show origin/master:"$CHAINSPEC_FILE" | jq '{"oldNodes": .bootNodes}' > "$RUNTIME-old-bootnodes.json" | ||
# Get the bootnodes from the current branch's chainspec | ||
git show HEAD:"$CHAINSPEC_FILE" | jq '{"newNodes": .bootNodes}' > "$RUNTIME-new-bootnodes.json" | ||
# Make a chainspec containing only the new bootnodes | ||
jq ".bootNodes = $(jq -rs '.[0] * .[1] | .newNodes-.oldNodes' \ | ||
"$RUNTIME-new-bootnodes.json" "$RUNTIME-old-bootnodes.json")" \ | ||
< "node/service/chain-specs/$RUNTIME.json" \ | ||
> "$RUNTIME-new-chainspec.json" | ||
# exit early if the new chainspec has no bootnodes | ||
if [ "$(jq -r '.bootNodes | length' "$RUNTIME-new-chainspec.json")" -eq 0 ]; then | ||
echo "[+] No new bootnodes for $RUNTIME" | ||
# Clean up the temporary files | ||
rm "$RUNTIME-new-chainspec.json" "$RUNTIME-old-bootnodes.json" "$RUNTIME-new-bootnodes.json" | ||
continue | ||
fi | ||
# Check the new bootnodes | ||
if ! "scripts/ci/github/check_bootnodes.sh" "$RUNTIME-new-chainspec.json"; then | ||
WAS_ERROR=1 | ||
fi | ||
# Clean up the temporary files | ||
rm "$RUNTIME-new-chainspec.json" "$RUNTIME-old-bootnodes.json" "$RUNTIME-new-bootnodes.json" | ||
done | ||
|
||
|
||
if [ $WAS_ERROR -eq 1 ]; then | ||
echo "[!] One of the new bootnodes failed to connect. Please check logs above." | ||
exit 1 | ||
fi |