Skip to content

Syncoor - Devnet 2

Syncoor - Devnet 2 #88

name: Syncoor - Devnet 2
on:
#schedule:
# - cron: '30 2 * * *' # Daily at 02:30 UTC
workflow_dispatch:
inputs:
el-client:
description: 'Comma-separated list of execution layer clients (geth,besu,nethermind,erigon,reth)'
required: false
default: '"geth","reth","nethermind","besu","erigon"'
type: string
cl-client:
description: 'Comma-separated list of consensus layer clients (lighthouse,teku,prysm,nimbus,lodestar,grandine)'
required: false
default: '"lighthouse","teku","prysm","nimbus","lodestar","grandine"'
type: string
run-timeout:
description: 'Timeout for the sync test'
required: false
default: '70h'
type: string
el-image:
description: 'Execution layer client images as JSON (e.g., {"geth": "ethereum/client-go:latest", "besu": "hyperledger/besu:latest"})'
required: false
default: >-
{
"geth": "ethpandaops/geth:performance",
"besu": "ethpandaops/besu:performance",
"nethermind": "nethermindeth/nethermind:performance",
"erigon": "ethpandaops/erigon:performance",
"reth": "ethpandaops/reth:performance"
}
type: string
cl-image:
description: 'Consensus layer client images as JSON (e.g., {"lighthouse": "sigp/lighthouse:latest", "teku": "consensys/teku:latest"})'
required: false
default: >-
{
"lighthouse": "ethpandaops/lighthouse:unstable",
"teku": "ethpandaops/teku:master",
"prysm": "ethpandaops/prysm-beacon-chain:develop",
"nimbus": "ethpandaops/nimbus-eth2:unstable",
"lodestar": "ethpandaops/lodestar:latest",
"grandine": "ethpandaops/grandine:latest"
}
type: string
log-level-cl:
description: 'Log level for consensus layer clients (debug, info, warn, error)'
required: false
default: 'info'
type: string
log-level-el:
description: 'Log level for execution layer clients (debug, info, warn, error)'
required: false
default: 'info'
type: string
env:
INSTALL_RCLONE_VERSION: v1.68.2
S3_BUCKET: ethpandaops-syncoor-data
jobs:
sync:
# Timeouts from h to minutes:
# - 4h -> 240m
# - 6h -> 360m
# - 8h -> 480m
# - 12h -> 720m
# - 24h -> 1440m
# - 48h -> 2880m
# - 72h -> 4320m
timeout-minutes: 4320 # 72h
# Self-hosted runner sizes:
# - ccx13: 2 cores, 8GB, 80GB disk
# - ccx23: 4 cores, 16GB, 160GB disk
# - ccx33: 8 cores, 32GB, 240GB disk
# - ccx43: 16 cores, 64GB, 360GB disk
runs-on:
group: synctest
#concurrency:
# group: >-
# ${{ matrix.network }}-${{ matrix.el-client }}-${{ matrix.cl-client }}
strategy:
fail-fast: false
matrix:
network: ["perf-devnet-2"]
el-client: >-
${{
fromJSON(format('[{0}]', inputs.el-client || '
"besu",
"erigon",
"geth",
"nethermind",
"reth"
'))}}
cl-client: >-
${{
fromJSON(format('[{0}]', inputs.cl-client || '
"lighthouse",
"teku",
"prysm",
"nimbus",
"lodestar",
"grandine"
'))}}
steps:
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Parse client images
id: parse-images
run: |
# Parse EL images
EL_IMAGES='${{ inputs.el-image }}'
if [ "$EL_IMAGES" != '{}' ] && [ -n "$EL_IMAGES" ]; then
EL_CLIENT="${{ matrix.el-client }}"
EL_IMAGE=$(echo "$EL_IMAGES" | jq -r --arg client "$EL_CLIENT" '.[$client] // ""')
echo "el-image=$EL_IMAGE" >> $GITHUB_OUTPUT
else
echo "el-image=" >> $GITHUB_OUTPUT
fi
# Parse CL images
CL_IMAGES='${{ inputs.cl-image }}'
if [ "$CL_IMAGES" != '{}' ] && [ -n "$CL_IMAGES" ]; then
CL_CLIENT="${{ matrix.cl-client }}"
CL_IMAGE=$(echo "$CL_IMAGES" | jq -r --arg client "$CL_CLIENT" '.[$client] // ""')
echo "cl-image=$CL_IMAGE" >> $GITHUB_OUTPUT
else
echo "cl-image=" >> $GITHUB_OUTPUT
fi
- name: Run Syncoor Test
uses: ethpandaops/syncoor@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
git-ref: master
server: https://syncoor-api.perf-devnet-2.ethpandaops.io
server-auth: ${{ secrets.SYNCOOR_SERVER_AUTH }}
log-force-colors: true
public: true
client-logs: ${{ inputs.log-level-cl != 'debug' && inputs.log-level-el != 'debug' }}
log-level-cl: ${{ inputs.log-level-cl || 'info' }}
log-level-el: ${{ inputs.log-level-el || 'info' }}
network: ${{ matrix.network }}
el-client: ${{ matrix.el-client }}
cl-client: ${{ matrix.cl-client }}
el-image: ${{ steps.parse-images.outputs.el-image }}
cl-image: ${{ steps.parse-images.outputs.cl-image }}
ethereum-package: github.com/ethpandaops/ethereum-package@main
el-env-vars: >-
${{
(matrix.el-client == 'erigon') && '[
"SNAPS_GIT_BRANCH=perfnet2_shadow_fork_main"
]' ||
''
}}
el-extra-args: >-
${{
(matrix.el-client == 'besu') && '[
"--network-id=12159"
]' ||
(matrix.el-client == 'erigon') && '[
"--prune.mode=full",
"--networkid=12159"
]' ||
(matrix.el-client == 'geth') && '[
"--networkid=12159"
]' ||
(matrix.el-client == 'nethermind') && '[
"--Init.NetworkId=12159"
]' ||
(matrix.el-client == 'reth') && '[
"--full",
"--network-id=12159"
]' ||
''
}}
check-interval: 30s
run-timeout: ${{ inputs.run-timeout || '70h' }}
log-level: info
s3-upload: true
s3-bucket: ${{ env.S3_BUCKET }}
s3-path: devnets/${{ matrix.network }}
rclone-config: ${{ secrets.SYNCOOR_RCLONE_CONFIG }}
rclone-version: ${{ env.INSTALL_RCLONE_VERSION }}
enclave: ${{ github.run_id }}
- name: Update test results index
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'syncoor-generate-index.yaml',
ref: context.ref,
inputs: {
's3-path': 'devnets/${{ matrix.network }}'
}
});