# Test that local testnet starts successfully. name: local testnet on: push: branches: - unstable pull_request: merge_group: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: dockerfile-ubuntu: runs-on: ${{ github.repository == 'sigp/lighthouse' && fromJson('["self-hosted", "linux", "CI", "large"]') || 'ubuntu-latest' }} steps: - uses: actions/checkout@v5 - name: Build Docker image run: | docker build --build-arg FEATURES=portable,spec-minimal -t lighthouse:local . docker save lighthouse:local -o lighthouse-docker.tar - name: Upload Docker image artifact uses: actions/upload-artifact@v4 with: name: lighthouse-docker path: lighthouse-docker.tar retention-days: 3 run-local-testnet: runs-on: ubuntu-22.04 needs: dockerfile-ubuntu steps: - uses: actions/checkout@v5 - name: Install Kurtosis run: | echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list sudo apt update sudo apt install -y kurtosis-cli kurtosis analytics disable - name: Download Docker image artifact uses: actions/download-artifact@v4 with: name: lighthouse-docker path: . - name: Load Docker image run: docker load -i lighthouse-docker.tar - name: Start local testnet with Assertoor run: ./start_local_testnet.sh -e local-assertoor -c -a -b false && sleep 60 working-directory: scripts/local_testnet - name: Await Assertoor test result id: assertoor_test_result uses: ethpandaops/assertoor-github-action@v1 with: kurtosis_enclave_name: local-assertoor - name: Stop local testnet and dump logs run: ./stop_local_testnet.sh local-assertoor working-directory: scripts/local_testnet - name: Upload logs artifact if: always() uses: actions/upload-artifact@v4 with: name: logs-local-testnet path: | scripts/local_testnet/logs retention-days: 3 - name: Return Assertoor test result shell: bash run: | test_result="${{ steps.assertoor_test_result.outputs.result }}" test_status=$( cat <<"EOF" ${{ steps.assertoor_test_result.outputs.test_overview }} EOF ) failed_test_status=$( cat <<"EOF" ${{ steps.assertoor_test_result.outputs.failed_test_details }} EOF ) echo "Test Result: $test_result" echo "$test_status" if ! [ "$test_result" == "success" ]; then echo "Failed Test Task Status:" echo "$failed_test_status" exit 1 fi doppelganger-protection-success-test: needs: dockerfile-ubuntu runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v5 - name: Install Kurtosis run: | echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list sudo apt update sudo apt install -y kurtosis-cli kurtosis analytics disable - name: Download Docker image artifact uses: actions/download-artifact@v4 with: name: lighthouse-docker path: . - name: Load Docker image run: docker load -i lighthouse-docker.tar - name: Run the doppelganger protection success test script run: | ./doppelganger_protection.sh success working-directory: scripts/tests - name: Upload logs artifact if: always() uses: actions/upload-artifact@v4 with: name: logs-doppelganger-protection-success path: | scripts/local_testnet/logs retention-days: 3 doppelganger-protection-failure-test: needs: dockerfile-ubuntu runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v5 - name: Install Kurtosis run: | echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list sudo apt update sudo apt install -y kurtosis-cli kurtosis analytics disable - name: Download Docker image artifact uses: actions/download-artifact@v4 with: name: lighthouse-docker path: . - name: Load Docker image run: docker load -i lighthouse-docker.tar - name: Run the doppelganger protection failure test script run: | ./doppelganger_protection.sh failure working-directory: scripts/tests - name: Upload logs artifact if: always() uses: actions/upload-artifact@v4 with: name: logs-doppelganger-protection-failure path: | scripts/local_testnet/logs retention-days: 3 # Tests checkpoint syncing to a live network (current fork) and a running devnet (usually next scheduled fork) checkpoint-sync-test: name: checkpoint-sync-test-${{ matrix.network }} runs-on: ubuntu-latest needs: dockerfile-ubuntu if: contains(github.event.pull_request.labels.*.name, 'syncing') continue-on-error: true strategy: matrix: network: [sepolia, devnet] steps: - uses: actions/checkout@v5 - name: Install Kurtosis run: | echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list sudo apt update sudo apt install -y kurtosis-cli kurtosis analytics disable - name: Download Docker image artifact uses: actions/download-artifact@v4 with: name: lighthouse-docker path: . - name: Load Docker image run: docker load -i lighthouse-docker.tar - name: Run the checkpoint sync test script run: | ./checkpoint-sync.sh "sync-${{ matrix.network }}" "checkpoint-sync-config-${{ matrix.network }}.yaml" working-directory: scripts/tests - name: Upload logs artifact if: always() uses: actions/upload-artifact@v4 with: name: logs-checkpoint-sync-${{ matrix.network }} path: | scripts/local_testnet/logs retention-days: 3 # Test syncing from genesis on a local testnet. Aims to cover forward syncing both short and long distances. genesis-sync-test: name: genesis-sync-test-${{ matrix.fork }}-${{ matrix.offline_secs }}s runs-on: ubuntu-latest needs: dockerfile-ubuntu if: contains(github.event.pull_request.labels.*.name, 'syncing') strategy: matrix: fork: [electra, fulu] offline_secs: [120, 300] steps: - uses: actions/checkout@v5 - name: Install Kurtosis run: | echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list sudo apt update sudo apt install -y kurtosis-cli kurtosis analytics disable - name: Download Docker image artifact uses: actions/download-artifact@v4 with: name: lighthouse-docker path: . - name: Load Docker image run: docker load -i lighthouse-docker.tar - name: Run the genesis sync test script run: | ./genesis-sync.sh "sync-${{ matrix.fork }}-${{ matrix.offline_secs }}s" "genesis-sync-config-${{ matrix.fork }}.yaml" "${{ matrix.fork }}" "${{ matrix.offline_secs }}" working-directory: scripts/tests - name: Upload logs artifact if: always() uses: actions/upload-artifact@v4 with: name: logs-genesis-sync-${{ matrix.fork }}-${{ matrix.offline_secs }}s path: | scripts/local_testnet/logs retention-days: 3 # This job succeeds ONLY IF all others succeed. It is used by the merge queue to determine whether # a PR is safe to merge. New jobs should be added here. local-testnet-success: name: local-testnet-success runs-on: ubuntu-latest needs: [ 'dockerfile-ubuntu', 'run-local-testnet', 'doppelganger-protection-success-test', 'doppelganger-protection-failure-test', ] steps: - uses: actions/checkout@v5 - name: Check that success job is dependent on all others run: | exclude_jobs='checkpoint-sync-test|genesis-sync-test' ./scripts/ci/check-success-job.sh ./.github/workflows/local-testnet.yml local-testnet-success "$exclude_jobs"