Skip to content
Closed
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
cb3a6f4
feat(fhevm-cli): port fhevm-cli from Bash to Bun
Eikix Mar 9, 2026
2b37e0a
fix(fhevm-cli): hard-cut release targets at the simple-acl boundary
Eikix Mar 11, 2026
2d2e0b3
refactor(fhevm-cli): split runtime into pipeline and services
Eikix Mar 16, 2026
135f1e5
refactor(fhevm-cli): adopt @effect/cli for the command surface
Eikix Mar 16, 2026
1ce8a05
refactor(fhevm-cli): add scenarios and normalize runtime artifacts
Eikix Mar 17, 2026
0132b36
refactor(fhevm-cli): port coprocessor drift injector to Bun
Eikix Mar 17, 2026
ee0d92d
refactor(fhevm-cli): align workflows and runtime around scenarios
Eikix Mar 17, 2026
08e6b8a
fix(fhevm-cli): track env templates in CI
Eikix Mar 17, 2026
b8c7ba3
fix(fhevm-cli): make generated address artifacts writable
Eikix Mar 17, 2026
0d9d770
fix(fhevm-cli): tighten workflow parity and drift validation
Eikix Mar 17, 2026
33daf6e
refactor(fhevm-cli): deduplicate workflow compat resolution
Eikix Mar 17, 2026
3104cf4
fix(ci): invoke compat helper through bash
Eikix Mar 17, 2026
7f04ff1
refactor(fhevm-cli): move workflow compat resolution into the cli
Eikix Mar 18, 2026
53f5ddc
refactor(fhevm-cli): model latest-supported as a tracked profile
Eikix Mar 18, 2026
586873d
refactor(fhevm-cli): align e2e workflows with latest-main builds
Eikix Mar 18, 2026
a7cade2
docs(fhevm-cli): sync docs with latest-main workflow model
Eikix Mar 18, 2026
123d810
refactor(fhevm-cli): cut dead paths and move workflow args into CLI
Eikix Mar 18, 2026
449fa75
refactor(fhevm-cli): tighten runtime state and service coverage
Eikix Mar 18, 2026
c13ffaa
refactor(fhevm-cli): simplify mainline CI version selection
Eikix Mar 18, 2026
c00a581
refactor(fhevm-cli): make merge queue test candidate images only
Eikix Mar 18, 2026
4505aa1
refactor(fhevm-cli): drop unused cli compatibility exports
Eikix Mar 18, 2026
38a77ea
refactor(ci): fall back to base images for skipped builds
Eikix Mar 18, 2026
202865d
fix(ci): install gh on operators runner
Eikix Mar 18, 2026
89296fd
refactor(ci): drop workflow up-arg planning
Eikix Mar 18, 2026
f5c82fe
refactor(ci): inline orchestrate image selection
Eikix Mar 18, 2026
4929656
fix(ci): default manual e2e dispatches to build
Eikix Mar 18, 2026
23f1c28
fix(ci): keep e2e workflow inputs explicit
Eikix Mar 18, 2026
f3c0bfa
refactor(ci): make orchestrate opt out of builds
Eikix Mar 18, 2026
6aa9808
refactor(ci): dedupe e2e workflow inputs
Eikix Mar 18, 2026
bccebbe
docs(fhevm-cli): fix stale qa prompt expectation
Eikix Mar 18, 2026
d50fe21
refactor(fhevm-cli): move mainline defaults out of compat
Eikix Mar 18, 2026
a10aeda
docs(fhevm-cli): clarify default mainline path
Eikix Mar 18, 2026
2bdad94
docs(fhevm-cli): prefer surgical local overrides
Eikix Mar 18, 2026
ebad152
ci(fhevm-cli): run e2e on pull requests
Eikix Mar 18, 2026
4fc70c2
fix(fhevm-cli): surface resolve progress earlier
Eikix Mar 18, 2026
c31cee1
fix(fhevm-cli): let latest-supported bypass gh
Eikix Mar 18, 2026
e8ac73e
fix(fhevm-cli): show pipeline step progress
Eikix Mar 18, 2026
aa0042a
Fix early runtime artifact generation
Eikix Mar 18, 2026
b8e4f2c
Tighten drift checks and resume UX
Eikix Mar 18, 2026
f6bb209
Drop gw-listener docker healthcheck
Eikix Mar 18, 2026
6ddf56f
Merge origin/main into codex/bun-fhevm-cli
Eikix Mar 18, 2026
738b167
Trim unused fhevm CLI exports
Eikix Mar 18, 2026
dbfeeab
Drop QA agent prompt from PR
Eikix Mar 18, 2026
c6a60a4
Drop unused fhevm scenarios
Eikix Mar 18, 2026
0f78c9c
Sync fhevm CLI docs with current scenario set
Eikix Mar 18, 2026
9387b15
Fix forced rebuilds in fhevm upgrade
Eikix Mar 18, 2026
2fa9f2a
Fix fhevm CLI lifecycle and drift guards
Eikix Mar 18, 2026
cb67f34
Fix fhevm test command failure handling
Eikix Mar 18, 2026
899718f
Tighten fhevm CLI review follow-ups
Eikix Mar 18, 2026
a8d9a11
Tighten fhevm lock and CI guards
Eikix Mar 18, 2026
2af0175
Improve fhevm CLI scenario and lifecycle UX
Eikix Mar 19, 2026
b5be714
Refine fhevm runtime state and logs
Eikix Mar 19, 2026
8e9cbaf
ci(test-suite): restore release orchestrate gating
Eikix Mar 19, 2026
168eb7c
fix(test-suite): tighten compat and upgrade guards
Eikix Mar 19, 2026
3894613
refactor(test-suite): drop dead no-relayer flag
Eikix Mar 19, 2026
1c31abc
fix(ci): run orchestrated e2e on merge-queue PRs
Eikix Mar 19, 2026
5957258
refactor(test-suite): hard cutover to lean bun cli
Eikix Mar 19, 2026
38db8af
chore(test-suite): trim dead exports and refresh docs
Eikix Mar 19, 2026
7349c1a
fix(test-suite): tighten lean cli edge cases
Eikix Mar 19, 2026
d14fab9
refactor(test-suite): flatten cli source layout
Eikix Mar 19, 2026
888881a
fix(test-suite): tighten lean cli review findings
Eikix Mar 19, 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
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ charts/
# -----------------------------------------------------------------------------
# Git-related (keep .git/ for build metadata, exclude others)
# -----------------------------------------------------------------------------
.git/lfs/
.gitignore
.gitattributes
**/.gitkeep
Expand Down
101 changes: 64 additions & 37 deletions .github/workflows/test-suite-e2e-operators-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: test-suite-e2e-operators-tests

# Github does not support more than 10 inputs for workflow_dispatch:
# https://docs.github.com/en/actions/reference/events-that-trigger-workflows#providing-inputs
# Core, relayer and test-suite will use the default versions defined in the `fhevm-cli` script
# Core, relayer and test-suite follow the latest-main defaults unless explicitly pinned
on:
workflow_dispatch:
inputs:
Expand Down Expand Up @@ -82,6 +82,21 @@ jobs:
contents: 'read' # Required to checkout repository code
id-token: 'write' # Required for OIDC authentication
packages: 'read' # Required to read GitHub packages/container registry
env:
GH_TOKEN: ${{ secrets.GHCR_READ_TOKEN || github.token }}
CONNECTOR_DB_MIGRATION_VERSION: ${{ inputs.connector_version }}
CONNECTOR_GW_LISTENER_VERSION: ${{ inputs.connector_version }}
CONNECTOR_KMS_WORKER_VERSION: ${{ inputs.connector_version }}
CONNECTOR_TX_SENDER_VERSION: ${{ inputs.connector_version }}
COPROCESSOR_DB_MIGRATION_VERSION: ${{ inputs.db_migration_version }}
HOST_VERSION: ${{ inputs.host_version }}
GATEWAY_VERSION: ${{ inputs.gateway_version }}
COPROCESSOR_HOST_LISTENER_VERSION: ${{ inputs.host_listener_version }}
COPROCESSOR_GW_LISTENER_VERSION: ${{ inputs.gateway_listener_version }}
COPROCESSOR_TX_SENDER_VERSION: ${{ inputs.tx_sender_version }}
COPROCESSOR_TFHE_WORKER_VERSION: ${{ inputs.tfhe_worker_version }}
COPROCESSOR_SNS_WORKER_VERSION: ${{ inputs.sns_worker_version }}
COPROCESSOR_ZKPROOF_WORKER_VERSION: ${{ inputs.zkproof_worker_version }}
runs-on: ${{ needs.setup-instance.outputs.runner-name }}
needs: setup-instance
timeout-minutes: 1440
Expand All @@ -90,11 +105,25 @@ jobs:
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: 'false'
fetch-depth: 0

- name: Setup Docker
uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0

- name: Install Foundry
- name: Install unzip
run: |
sudo apt-get update
sudo apt-get install -y unzip

- name: Install GitHub CLI
run: |
sudo apt-get update
sudo apt-get install -y gh

- name: Setup Bun
uses: oven-sh/setup-bun@ecf28ddc73e819eb6fa29df6b34ef8921c743461 # v2.1.3

- name: Install foundry
uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de # v1.4.0

- name: Login to GitHub Container Registry
Expand All @@ -111,24 +140,15 @@ jobs:
username: ${{ secrets.CGR_USERNAME }}
password: ${{ secrets.CGR_PASSWORD }}

- name: Install CLI deps
working-directory: test-suite/fhevm
run: |
bun install --frozen-lockfile

- name: Deploy fhevm Stack
working-directory: test-suite/fhevm
env:
CONNECTOR_DB_MIGRATION_VERSION: ${{ inputs.connector_version }}
CONNECTOR_GW_LISTENER_VERSION: ${{ inputs.connector_version }}
CONNECTOR_KMS_WORKER_VERSION: ${{ inputs.connector_version }}
CONNECTOR_TX_SENDER_VERSION: ${{ inputs.connector_version }}
DB_MIGRATION_VERSION: ${{ inputs.db_migration_version }}
HOST_VERSION: ${{ inputs.host_version }}
GATEWAY_VERSION: ${{ inputs.gateway_version }}
HOST_LISTENER_VERSION: ${{ inputs.host_listener_version }}
GW_LISTENER_VERSION: ${{ inputs.gateway_listener_version }}
TX_SENDER_VERSION: ${{ inputs.tx_sender_version }}
TFHE_WORKER_VERSION: ${{ inputs.tfhe_worker_version }}
SNS_WORKER_VERSION: ${{ inputs.sns_worker_version }}
ZKPROOF_WORKER_VERSION: ${{ inputs.zkproof_worker_version }}
run: |
./fhevm-cli deploy --coprocessors 2 --coprocessor-threshold 2
./fhevm-cli up --target latest-main --scenario ./scenarios/two-of-two.yaml
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we use the short form here ./fhevm-cli up --target latest-main --scenario two-of-two


- name: All operators tests
working-directory: test-suite/fhevm
Expand All @@ -142,32 +162,39 @@ jobs:

- name: Show logs on test failure
working-directory: test-suite/fhevm
if: always()
if: failure()
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use always()

run: |
echo "::group::Relayer Logs"
./fhevm-cli logs relayer
echo "::endgroup::"
echo "::group::SNS Worker Logs"
./fhevm-cli logs sns-worker | grep -v "Selected 0 rows to process"
echo "::endgroup::"
echo "::group::Transaction Sender Logs (filtered)"
./fhevm-cli logs transaction-sender | grep -v "Selected 0 rows to process"
echo "::endgroup::"
echo "::group::Coprocessor 2 - SNS Worker"
./fhevm-cli logs coprocessor-2-sns-worker 2>/dev/null | grep -v "Selected 0 rows to process" || true
echo "::endgroup::"
echo "::group::Coprocessor 2 - Transaction Sender (filtered)"
./fhevm-cli logs coprocessor-2-transaction-sender 2>/dev/null | grep -v "Selected 0 rows to process" || true
echo "::endgroup::"
echo "::group::Coprocessor 2 - TFHE Worker"
./fhevm-cli logs coprocessor-2-tfhe-worker 2>/dev/null || true
echo "::endgroup::"
snapshot_logs() {
local group="$1"
local container="$2"
local filter="${3:-}"
echo "::group::${group}"
if [ -n "$filter" ]; then
docker logs --tail 200 "${container}" 2>&1 | grep -v "$filter" || true
else
docker logs --tail 200 "${container}" 2>&1 || true
fi
echo "::endgroup::"
}
snapshot_logs "Relayer Logs" fhevm-relayer
snapshot_logs "Host Listener" coprocessor-host-listener
snapshot_logs "Gateway Listener" coprocessor-gw-listener
snapshot_logs "SNS Worker Logs" coprocessor-sns-worker "Selected 0 rows to process"
snapshot_logs "Transaction Sender Logs (filtered)" coprocessor-transaction-sender "Selected 0 rows to process"
snapshot_logs "ZKProof Worker" coprocessor-zkproof-worker
snapshot_logs "TFHE Worker" coprocessor-tfhe-worker
snapshot_logs "Coprocessor 2 - Host Listener" coprocessor1-host-listener
snapshot_logs "Coprocessor 2 - Gateway Listener" coprocessor1-gw-listener
snapshot_logs "Coprocessor 2 - SNS Worker" coprocessor1-sns-worker "Selected 0 rows to process"
snapshot_logs "Coprocessor 2 - Transaction Sender (filtered)" coprocessor1-transaction-sender "Selected 0 rows to process"
snapshot_logs "Coprocessor 2 - ZKProof Worker" coprocessor1-zkproof-worker
snapshot_logs "Coprocessor 2 - TFHE Worker" coprocessor1-tfhe-worker

- name: Cleanup
working-directory: test-suite/fhevm
if: always()
run: |
./fhevm-cli clean
./fhevm-cli clean --images

teardown-instance:
name: test-suite-e2e-operators-tests/teardown
Expand Down
119 changes: 58 additions & 61 deletions .github/workflows/test-suite-e2e-tests.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
name: test-suite-e2e-tests

on:
pull_request:
workflow_dispatch:
inputs: &workflow_inputs
build:
description: "Build repo-owned images from the checked out branch on the runner"
default: true
type: boolean
coprocessor-db-migration-version:
description: "Coprocessor DB Migration Image Version"
default: ""
Expand Down Expand Up @@ -59,18 +64,6 @@ on:
description: "Test suite version"
default: ""
type: string
relayer-version:
description: "Relayer version"
default: ""
type: string
kms-core-version:
description: "KMS Core version"
default: ""
type: string
deploy-build:
description: "Build local Docker images from the checked out repository before deploy"
default: false
type: boolean
workflow_call:
secrets:
GHCR_READ_TOKEN:
Expand All @@ -83,10 +76,10 @@ on:

permissions: {}

# Allow to run multiple instances of the same workflow in parallel when triggered manually
# Cancel stale PR runs on new pushes while keeping manual dispatches independent.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name == 'workflow_dispatch' && github.run_id || 'auto' }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref }}-${{ github.event_name == 'workflow_dispatch' && github.run_id || 'auto' }}
cancel-in-progress: ${{ github.event_name == 'pull_request' || github.ref != 'refs/heads/main' }}

jobs:
fhevm-e2e-test:
Expand All @@ -95,6 +88,8 @@ jobs:
id-token: 'write' # Required for OIDC authentication
packages: 'read' # Required to read GitHub packages/container registry
env:
GH_TOKEN: ${{ secrets.GHCR_READ_TOKEN || github.token }}
BUILD: ${{ github.event_name == 'pull_request' && 'true' || (inputs.build && 'true' || 'false') }}
COPROCESSOR_DB_MIGRATION_VERSION: ${{ inputs.coprocessor-db-migration-version }}
COPROCESSOR_HOST_LISTENER_VERSION: ${{ inputs.coprocessor-host-listener-version }}
COPROCESSOR_GW_LISTENER_VERSION: ${{ inputs.coprocessor-gw-listener-version }}
Expand All @@ -109,19 +104,21 @@ jobs:
CONNECTOR_KMS_WORKER_VERSION: ${{ inputs.connector-kms-worker-version }}
CONNECTOR_TX_SENDER_VERSION: ${{ inputs.connector-tx-sender-version }}
TEST_SUITE_VERSION: ${{ inputs.test-suite-version }}
RELAYER_VERSION: ${{ inputs.relayer-version }}
CORE_VERSION: ${{ inputs.kms-core-version }}
runs-on: large_ubuntu_32
steps:
- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: 'false'
fetch-depth: 0

- name: Setup Docker
uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0

- name: Install Foundry
- name: Setup Bun
uses: oven-sh/setup-bun@ecf28ddc73e819eb6fa29df6b34ef8921c743461 # v2.1.3

- name: Install foundry
uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de # v1.4.0

- name: Login to GitHub Container Registry
Expand All @@ -138,22 +135,27 @@ jobs:
username: ${{ secrets.CGR_USERNAME }}
password: ${{ secrets.CGR_PASSWORD }}

- name: Display component versions
env:
JSON_INPUT: ${{ toJSON(inputs) }}
- name: Install CLI deps
working-directory: test-suite/fhevm
run: bun install --frozen-lockfile

- name: Dry run
working-directory: test-suite/fhevm
run: |
echo "Component versions: $JSON_INPUT"
args=(--target latest-main --scenario ./scenarios/two-of-two.yaml)
if [ "$BUILD" = "true" ]; then
args+=(--build)
fi
./fhevm-cli up "${args[@]}" --dry-run

- name: Deploy fhevm Stack
- name: Boot fhevm Stack
working-directory: test-suite/fhevm
env:
DEPLOY_BUILD: ${{ inputs.deploy-build }}
run: |
if [[ "$DEPLOY_BUILD" == 'true' ]]; then
./fhevm-cli deploy --build --coprocessors 2 --coprocessor-threshold 2
else
./fhevm-cli deploy --coprocessors 2 --coprocessor-threshold 2
args=(--target latest-main --scenario ./scenarios/two-of-two.yaml)
if [ "$BUILD" = "true" ]; then
args+=(--build)
fi
./fhevm-cli up "${args[@]}"

# E2E tests on pausing the Host contracts
- name: Pause Host Contracts
Expand Down Expand Up @@ -252,41 +254,36 @@ jobs:

- name: Show logs on test failure
working-directory: test-suite/fhevm
if: always()
if: failure()
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Go back to always()

run: |
echo "::group::Relayer Logs"
./fhevm-cli logs fhevm-relayer
echo "::endgroup::"
echo "::group::SNS Worker Logs"
./fhevm-cli logs coprocessor-sns-worker | grep -v "Selected 0 rows to process"
echo "::endgroup::"
echo "::group::Transaction Sender Logs (filtered)"
./fhevm-cli logs coprocessor-transaction-sender | grep -v "Selected 0 rows to process"
echo "::endgroup::"
echo "::group::Host Listener"
./fhevm-cli logs coprocessor-host-listener
echo "::endgroup::"
echo "::group::Gateway Listener"
./fhevm-cli logs coprocessor-gw-listener
echo "::endgroup::"
echo "::group::ZKProof Worker"
./fhevm-cli logs coprocessor-zkproof-worker
echo "::endgroup::"
echo "::group::TFHE Worker"
./fhevm-cli logs coprocessor-tfhe-worker
echo "::endgroup::"
echo "::group::Coprocessor 2 - SNS Worker"
./fhevm-cli logs coprocessor-2-sns-worker 2>/dev/null | grep -v "Selected 0 rows to process" || true
echo "::endgroup::"
echo "::group::Coprocessor 2 - Transaction Sender (filtered)"
./fhevm-cli logs coprocessor-2-transaction-sender 2>/dev/null | grep -v "Selected 0 rows to process" || true
echo "::endgroup::"
echo "::group::Coprocessor 2 - TFHE Worker"
./fhevm-cli logs coprocessor-2-tfhe-worker 2>/dev/null || true
echo "::endgroup::"
snapshot_logs() {
local group="$1"
local container="$2"
local filter="${3:-}"
echo "::group::${group}"
if [ -n "$filter" ]; then
docker logs --tail 200 "${container}" 2>&1 | grep -v "$filter" || true
else
docker logs --tail 200 "${container}" 2>&1 || true
fi
echo "::endgroup::"
}
snapshot_logs "Relayer Logs" fhevm-relayer
snapshot_logs "SNS Worker Logs" coprocessor-sns-worker "Selected 0 rows to process"
snapshot_logs "Transaction Sender Logs (filtered)" coprocessor-transaction-sender "Selected 0 rows to process"
snapshot_logs "Host Listener" coprocessor-host-listener
snapshot_logs "Gateway Listener" coprocessor-gw-listener
snapshot_logs "ZKProof Worker" coprocessor-zkproof-worker
snapshot_logs "TFHE Worker" coprocessor-tfhe-worker
snapshot_logs "Coprocessor 2 - Host Listener" coprocessor1-host-listener
snapshot_logs "Coprocessor 2 - Gateway Listener" coprocessor1-gw-listener
snapshot_logs "Coprocessor 2 - SNS Worker" coprocessor1-sns-worker "Selected 0 rows to process"
snapshot_logs "Coprocessor 2 - Transaction Sender (filtered)" coprocessor1-transaction-sender "Selected 0 rows to process"
snapshot_logs "Coprocessor 2 - ZKProof Worker" coprocessor1-zkproof-worker
snapshot_logs "Coprocessor 2 - TFHE Worker" coprocessor1-tfhe-worker

- name: Cleanup
working-directory: test-suite/fhevm
if: always()
run: |
./fhevm-cli clean
./fhevm-cli clean --images
Loading
Loading