From 79dbf77c54dda7db24002ddd3d2c2034ba8daa1c Mon Sep 17 00:00:00 2001 From: Gorka Date: Tue, 28 Jul 2026 17:14:18 -0300 Subject: [PATCH 1/2] fix(compose): pin all deno images to 2.7.9, drop floating latest The frontend console services in every compose suite ran denoland/deno:latest while the backend platforms pin 2.7.9. deno:latest now resolves to 2.9.x, where the minimum dependency age policy (default 24h) is enforced at install and esbuild deno-loader resolution, even with a committed deno.lock. This broke the invite-gate suite on moonlight-pay PR 44: jsr @moonlight/moonlight-sdk 0.13.0 was published less than 24h before the run, the moonlight-pay container failed deno install and deno task build, served without a fresh bundle, and the connect button never rendered. The same footgun applies to every suite here on any bump PR opened within 24h of a JSR publish. Pin every denoland/deno image to 2.7.9 to match the backends and the 2.7.x pins in repo CI workflows, so a floating tag cannot silently change dependency resolution behavior again. --- docker-compose.e2e.yml | 4 ++-- docker-compose.governance.yml | 4 ++-- docker-compose.invite-gate.yml | 6 +++--- docker-compose.lifecycle.yml | 4 ++-- docker-compose.multi-asset.yml | 2 +- docker-compose.otel.yml | 4 ++-- docker-compose.playwright.yml | 6 +++--- docker-compose.pos-instant.yml | 4 ++-- e2e/docker-compose.yml | 2 +- lifecycle/docker-compose.yml | 4 ++-- multi-asset/docker-compose.yml | 2 +- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docker-compose.e2e.yml b/docker-compose.e2e.yml index 3086652..75455fc 100644 --- a/docker-compose.e2e.yml +++ b/docker-compose.e2e.yml @@ -50,7 +50,7 @@ services: retries: 15 setup: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: stellar: condition: service_healthy @@ -139,7 +139,7 @@ services: start_period: 10s test-runner: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_healthy diff --git a/docker-compose.governance.yml b/docker-compose.governance.yml index 40cbbca..9d427f8 100644 --- a/docker-compose.governance.yml +++ b/docker-compose.governance.yml @@ -50,7 +50,7 @@ services: retries: 15 setup: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: stellar: condition: service_healthy @@ -139,7 +139,7 @@ services: start_period: 10s test-runner: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_healthy diff --git a/docker-compose.invite-gate.yml b/docker-compose.invite-gate.yml index 7c57445..86b0bec 100644 --- a/docker-compose.invite-gate.yml +++ b/docker-compose.invite-gate.yml @@ -196,7 +196,7 @@ services: # both blocked (random key) and allowed (derived key) paths. provider-console: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_healthy @@ -241,7 +241,7 @@ services: start_period: 30s council-console: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: council: condition: service_healthy @@ -288,7 +288,7 @@ services: start_period: 60s moonlight-pay: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: pay: condition: service_healthy diff --git a/docker-compose.lifecycle.yml b/docker-compose.lifecycle.yml index 87c31f4..a141a21 100644 --- a/docker-compose.lifecycle.yml +++ b/docker-compose.lifecycle.yml @@ -51,7 +51,7 @@ services: retries: 15 setup: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: stellar: condition: service_healthy @@ -137,7 +137,7 @@ services: start_period: 10s test-runner: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_healthy diff --git a/docker-compose.multi-asset.yml b/docker-compose.multi-asset.yml index 162e368..497d087 100644 --- a/docker-compose.multi-asset.yml +++ b/docker-compose.multi-asset.yml @@ -55,7 +55,7 @@ services: retries: 15 setup: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: stellar: condition: service_healthy diff --git a/docker-compose.otel.yml b/docker-compose.otel.yml index 9be1f55..60950fd 100644 --- a/docker-compose.otel.yml +++ b/docker-compose.otel.yml @@ -50,7 +50,7 @@ services: retries: 15 setup: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: stellar: condition: service_healthy @@ -139,7 +139,7 @@ services: start_period: 10s test-runner: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_healthy diff --git a/docker-compose.playwright.yml b/docker-compose.playwright.yml index d93af04..24b5b25 100644 --- a/docker-compose.playwright.yml +++ b/docker-compose.playwright.yml @@ -195,7 +195,7 @@ services: # ── Frontend services ────────────────────────────────────────── provider-console: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_healthy @@ -240,7 +240,7 @@ services: start_period: 30s council-console: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: council: condition: service_healthy @@ -287,7 +287,7 @@ services: start_period: 60s moonlight-pay: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: pay: condition: service_healthy diff --git a/docker-compose.pos-instant.yml b/docker-compose.pos-instant.yml index 3e11979..06ef9bf 100644 --- a/docker-compose.pos-instant.yml +++ b/docker-compose.pos-instant.yml @@ -52,7 +52,7 @@ services: retries: 15 setup: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: stellar: condition: service_healthy @@ -182,7 +182,7 @@ services: start_period: 60s test-runner: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_healthy diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml index 9ff412b..94c4204 100644 --- a/e2e/docker-compose.yml +++ b/e2e/docker-compose.yml @@ -85,7 +85,7 @@ services: OTEL_EXPORTER_OTLP_PROTOCOL: "http/protobuf" test-runner: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_started diff --git a/lifecycle/docker-compose.yml b/lifecycle/docker-compose.yml index a086f80..1da51c7 100644 --- a/lifecycle/docker-compose.yml +++ b/lifecycle/docker-compose.yml @@ -43,7 +43,7 @@ services: retries: 5 setup: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: stellar: condition: service_healthy @@ -117,7 +117,7 @@ services: DATABASE_URL: postgresql://admin:devpass@db:5432/lifecycle_db test-runner: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: provider: condition: service_started diff --git a/multi-asset/docker-compose.yml b/multi-asset/docker-compose.yml index cd72c49..667a323 100644 --- a/multi-asset/docker-compose.yml +++ b/multi-asset/docker-compose.yml @@ -52,7 +52,7 @@ services: retries: 5 setup: - image: denoland/deno:latest + image: denoland/deno:2.7.9 depends_on: stellar: condition: service_healthy From ebe178c5ea72afd697a7c3115187258e398350af Mon Sep 17 00:00:00 2001 From: Gorka Date: Tue, 28 Jul 2026 17:35:36 -0300 Subject: [PATCH 2/2] ci(invite-gate): upload Playwright test-results as run artifact The reusable invite-gate workflow dumped container logs but discarded the Playwright test-results directory when the compose stack came down, so error-context.md, failure screenshots, and traces (which carry the browser console) were unrecoverable. Copy them out of the stopped test-runner container and upload as a run artifact so browser-side failures like the moonlight-pay connect button regression can be diagnosed directly. --- .github/workflows/invite-gate-reusable.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/invite-gate-reusable.yml b/.github/workflows/invite-gate-reusable.yml index 2a2ede1..c64fc7c 100644 --- a/.github/workflows/invite-gate-reusable.yml +++ b/.github/workflows/invite-gate-reusable.yml @@ -179,5 +179,20 @@ jobs: docker compose -f docker-compose.invite-gate.yml logs moonlight-pay echo "--- test-runner logs ---" docker compose -f docker-compose.invite-gate.yml logs test-runner + # Copy Playwright results (error-context.md, screenshots, traces with + # console logs) out of the stopped test-runner before down removes it, + # so failures can be diagnosed from the uploaded artifact instead of + # log archaeology. + docker compose -f docker-compose.invite-gate.yml cp \ + test-runner:/app/test-results ./invite-gate-test-results || true docker compose -f docker-compose.invite-gate.yml down exit $EXIT_CODE + + - name: Upload Playwright test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: invite-gate-test-results + path: invite-gate-test-results/ + if-no-files-found: ignore + retention-days: 14