Skip to content
Merged
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
22f27b6
Add ACT4 nightly compliance test workflow against zkevm-test-monitor
gabrielbosio May 28, 2026
b30c8ce
Temporary label-gated manual trigger for ACT4 nightly testing
gabrielbosio May 28, 2026
dbb1e05
Propagate pipeline exit code so build/test failures fail the workflow
gabrielbosio May 28, 2026
0ec5513
Treat missing ACT4 summary files as workflow failure
gabrielbosio May 28, 2026
1e71209
Use PR head SHA on pull_request events so the SHA exists in the lambd…
gabrielbosio May 28, 2026
c08c619
Consolidate pass/fail decision and job failure into the summary step
gabrielbosio May 28, 2026
048c7b2
Use single act4-nightly label on opened issues
gabrielbosio May 28, 2026
296a0b1
Scrub root-owned Docker leftovers before checkout
gabrielbosio May 28, 2026
6eeb42b
Drop stale SHA from ACT4 issue title
gabrielbosio May 28, 2026
ed29f4f
Address bot-review findings: pin upstream SHA, split exec/report jobs…
gabrielbosio May 28, 2026
5a3bcc2
Pin action SHAs and fail summary step when ./run exits non-zero
gabrielbosio May 28, 2026
53cf696
Remove temporary pull_request label trigger
gabrielbosio May 28, 2026
1bf370b
Pin ubuntu image by digest, pass step outcome via env, tolerate missi…
gabrielbosio May 28, 2026
f813789
Pin build Dockerfile ubuntu base image to digest
gabrielbosio May 28, 2026
b4aa43a
Temporarily re-add label trigger for a dry run
gabrielbosio May 28, 2026
d9339ca
Remove temporary label trigger
gabrielbosio May 28, 2026
40fadf9
Merge branch 'main' into act4-nightly
gabrielbosio May 28, 2026
e8ea2b1
Comment on bench vs nightly decision
gabrielbosio May 28, 2026
eb12895
Clean root-owned Docker leftovers at end of ACT4 job
gabrielbosio May 28, 2026
2e0e9ae
Merge branch 'main' into act4-nightly
gabrielbosio May 29, 2026
3bced9a
Merge branch 'main' into act4-nightly
gabrielbosio Jun 2, 2026
970bda9
ci(act4-nightly): run regardless of benchmark conclusion
MauroToscano Jun 2, 2026
73f615a
ci(act4-nightly): notify Slack on failure instead of opening an issue
MauroToscano Jun 2, 2026
cbee95e
Merge branch 'main' into act4-nightly
MauroToscano Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions .github/workflows/act4-nightly.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
name: ACT4 Nightly

on:
workflow_run:
# Runs after Bench Vs Nightly to make sure the self-hosted runner is available
workflows: ["Bench Vs Nightly"]
types: [completed]
Comment thread
gabrielbosio marked this conversation as resolved.
branches: [main]
workflow_dispatch:

concurrency:
group: act4-nightly
cancel-in-progress: false

jobs:
test:
# ACT4 is independent of the benchmark outcome; the workflow_run trigger is
# only used to serialize on the shared bench runner. Run on any benchmark
# conclusion, skipping only cases where re-running is pointless: 'cancelled'
# (a newer bench run is already on its way) and 'skipped' (nothing ran).
if: >-
github.event_name == 'workflow_dispatch' ||
(github.event.workflow_run.conclusion != 'cancelled' &&
github.event.workflow_run.conclusion != 'skipped')
runs-on: [self-hosted, bench]
timeout-minutes: 360
permissions:
contents: read
env:
LAMBDAVM_SHA: ${{ github.event.workflow_run.head_sha || github.sha }}
# ubuntu:24.04 linux/amd64 manifest digest (bench runner is x64).
UBUNTU_IMAGE: ubuntu@sha256:cdb5fd928fced577cfecf12c8966e830fcdf42ee481fb0b91904eeddc2fe5eff
steps:
- name: Validate LAMBDAVM_SHA format
run: |
if [[ ! "$LAMBDAVM_SHA" =~ ^[0-9a-f]{40}$ ]]; then
echo "Invalid LAMBDAVM_SHA: $LAMBDAVM_SHA"
exit 1
fi

- name: Scrub root-owned leftovers from previous Docker runs
run: |
if [ -d test-results ] || [ -d out ]; then
docker run --rm -v "$PWD:/work" -w /work "$UBUNTU_IMAGE" rm -rf test-results out
fi

- name: Checkout zkevm-test-monitor
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
repository: eth-act/zkevm-test-monitor
ref: c9e710b43448576920f7e841a2b68bab8b7a20f8

- name: Pin lambdavm.commit to current main SHA
run: |
echo "Pinning lambdavm.commit to $LAMBDAVM_SHA"
jq --arg sha "$LAMBDAVM_SHA" '.zkvms.lambdavm.commit = $sha' config.json > config.json.tmp
mv config.json.tmp config.json
jq '.zkvms.lambdavm' config.json

- name: Pin Dockerfile base image to digest
run: |
dockerfile=docker/build-lambdavm/Dockerfile
sed -i "s|^FROM ubuntu:24.04|FROM ${UBUNTU_IMAGE}|" "$dockerfile"
if grep -qE '^FROM .*ubuntu:24\.04' "$dockerfile"; then
echo "Unpinned ubuntu:24.04 still present in $dockerfile"
exit 1
fi

- name: Build + test lambdavm
id: run
continue-on-error: true
run: |
set -o pipefail
mkdir -p out
./run all lambdavm 2>&1 | tee out/run.log
Comment thread
gabrielbosio marked this conversation as resolved.

- name: Compute pass/fail from summaries
id: summary
if: always()
env:
STEP_RUN_OUTCOME: ${{ steps.run.outcome }}
run: |
mkdir -p out
shopt -s nullglob
summaries=(test-results/lambdavm/summary-act4-*.json)

# No summaries means the build/test pipeline failed to produce results.
if [ ${#summaries[@]} -eq 0 ]; then
msg="No ACT4 summary files were produced. See run.log."
echo "$msg" | tee out/summary.md
echo "$msg" >> "$GITHUB_STEP_SUMMARY"
exit 1
fi

{
echo "## ACT4 results for lambdavm @ $LAMBDAVM_SHA"
echo ""
for f in "${summaries[@]}"; do
jq -r '"- **\(.suite)**: \(.passed)/\(.total) passed (\(.failed) failed)"' "$f"
done
} | tee out/summary.md >> "$GITHUB_STEP_SUMMARY"

FAILED=0
for f in "${summaries[@]}"; do
n=$(jq '.failed // 0' "$f")
FAILED=$((FAILED + n))
done
echo "Total failed tests: $FAILED"
if [ "$STEP_RUN_OUTCOME" = "failure" ]; then
echo "./run exited non-zero"
exit 1
fi
[ "$FAILED" -eq 0 ]

- name: Upload artifacts
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: act4-results-${{ github.run_id }}
path: |
out/
test-results/lambdavm/
retention-days: 30

- name: Remove root-owned Docker leftovers
# Leave the shared runner workspace clean for other workflows.
if: always()
run: |
if [ -d test-results ] || [ -d out ]; then
docker run --rm -v "$PWD:/work" -w /work "$UBUNTU_IMAGE" rm -rf test-results out
fi

report:
needs: test
if: failure()
runs-on: ubuntu-latest
permissions:
contents: read
env:
LAMBDAVM_SHA: ${{ github.event.workflow_run.head_sha || github.sha }}
steps:
- name: Validate LAMBDAVM_SHA format
run: |
if [[ ! "$LAMBDAVM_SHA" =~ ^[0-9a-f]{40}$ ]]; then
echo "Invalid LAMBDAVM_SHA: $LAMBDAVM_SHA"
exit 1
fi

- name: Download test artifacts
# An early test-job failure may upload nothing. Still notify Slack,
# falling back to a placeholder when out/summary.md is absent.
continue-on-error: true
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: act4-results-${{ github.run_id }}

- name: Post failure to Slack
env:
# Reuse the nightly benchmark webhook so failures land in the channel
# the team already watches. Manual runs use the test webhook so smoke
# tests don't ping the real channel.
SLACK_WEBHOOK: ${{ github.event_name == 'workflow_dispatch' && secrets.BENCH_VS_SLACK_WEBHOOK_TEST || secrets.BENCH_VS_SLACK_WEBHOOK }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: |
if [ -z "$SLACK_WEBHOOK" ]; then
echo "SLACK_WEBHOOK not configured, skipping notification."
exit 0
fi

summary="$(cat out/summary.md 2>/dev/null || echo '_summary not available_')"

payload="$(jq -n \
--arg sha "$LAMBDAVM_SHA" \
--arg run "$RUN_URL" \
--arg rid "$GITHUB_RUN_ID" \
--arg summary "$summary" \
'{
blocks: [
{type: "header", text: {type: "plain_text", text: ":x: ACT4 nightly failed", emoji: true}},
{type: "section", text: {type: "mrkdwn", text: ("*Commit:* `" + $sha + "`\n*Run:* <" + $run + "|workflow run>\n*Artifacts:* `act4-results-" + $rid + "` (attached to the run)")}},
{type: "section", text: {type: "mrkdwn", text: ("```" + $summary + "```")}}
]
}')"

curl -fsS -X POST "$SLACK_WEBHOOK" \
-H 'Content-Type: application/json; charset=utf-8' \
--data "$payload"
Loading