From 7fe29dcf01c306c126afafb46fcd3c948eafed64 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Wed, 5 Aug 2026 11:52:38 +0800 Subject: [PATCH] Fix Gitea quality gate portability --- .gitea/workflows/backend-quality-gate.yml | 23 +++++++++++++++++++ frontend/src/components/chat-message-row.tsx | 4 +++- .../tests/staging-backend-workflows.test.ts | 14 +++++++++-- requirements-dev.txt | 1 + 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/backend-quality-gate.yml b/.gitea/workflows/backend-quality-gate.yml index 3e430e22..a09520c1 100644 --- a/.gitea/workflows/backend-quality-gate.yml +++ b/.gitea/workflows/backend-quality-gate.yml @@ -53,8 +53,31 @@ jobs: python3 --version node --version npm --version + curl --version docker version + - name: Install and verify Docker Compose v2 + env: + DOCKER_COMPOSE_VERSION: v2.39.1 + run: | + set -euo pipefail + case "$(uname -m)" in + x86_64) compose_arch=x86_64; compose_sha=a5ea28722d5da628b59226626f7d6c33c89a7ed19e39f750645925242044c9d2 ;; + aarch64|arm64) compose_arch=aarch64; compose_sha=7b2627ed76f7dcb0d93f649f185af912372229b4c09762a3cd1db5be5255632b ;; + *) echo "Unsupported Docker Compose architecture: $(uname -m)" >&2; exit 1 ;; + esac + compose_dir="${DOCKER_CONFIG:-$HOME/.docker}/cli-plugins" + compose_bin="$compose_dir/docker-compose" + mkdir -p "$compose_dir" + curl -fsSL \ + "https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-linux-$compose_arch" \ + -o "$compose_bin" + printf '%s %s\n' "$compose_sha" "$compose_bin" | sha256sum -c - + chmod +x "$compose_bin" + docker compose version + docker compose version --short | grep -Eq '^v?2\.' + docker compose --help | grep -q -- '--project-name' + - name: Install dependencies run: | set -euo pipefail diff --git a/frontend/src/components/chat-message-row.tsx b/frontend/src/components/chat-message-row.tsx index 82537dbf..367719e0 100644 --- a/frontend/src/components/chat-message-row.tsx +++ b/frontend/src/components/chat-message-row.tsx @@ -1,13 +1,15 @@ "use client"; import { useGSAP } from "@gsap/react"; -import { gsap } from "gsap"; +import gsapModule from "gsap"; import { useRef } from "react"; import { AgentActivityStatus } from "@/components/agent-activity-status"; import { ChatMessageContent } from "@/components/chat-message-content"; import type { ChatMessageView } from "@/lib/chat-message-view"; +const gsap = (gsapModule as typeof gsapModule & { gsap?: typeof gsapModule }).gsap ?? gsapModule; + gsap.registerPlugin(useGSAP); export function AgentAvatar() { diff --git a/frontend/tests/staging-backend-workflows.test.ts b/frontend/tests/staging-backend-workflows.test.ts index 7433ed09..1173503a 100644 --- a/frontend/tests/staging-backend-workflows.test.ts +++ b/frontend/tests/staging-backend-workflows.test.ts @@ -83,10 +83,15 @@ test("changed staging workflows are syntactically valid YAML", () => { giteaMigrationWorkflow, ]) { const result = spawnSync( - "ruby", - ["-e", "require 'yaml'; YAML.parse_file(ARGV.fetch(0))", fileURLToPath(workflow)], + "python", + [ + "-c", + "import sys,yaml; yaml.safe_load(open(sys.argv[1], encoding='utf-8'))", + fileURLToPath(workflow), + ], { encoding: "utf8" }, ); + assert.ifError(result.error); assert.equal(result.status, 0, result.stderr); } }); @@ -126,6 +131,11 @@ test("Gitea quality gate validates before publishing an immutable ACR manifest", assert.equal((workflow.match(/git status --porcelain --untracked-files=all/g) ?? []).length, 2); assert.match(workflow, /python3 -m venv \.venv/); assert.match(workflow, /python -m playwright install --with-deps chromium/); + assert.match(workflow, /DOCKER_COMPOSE_VERSION: v2\.39\.1/); + assert.match(workflow, /docker-compose-linux-\$compose_arch/); + assert.match(workflow, /sha256sum -c -/); + assert.match(workflow, /docker compose version --short/); + assert.match(workflow, /docker compose --help \| grep -q -- '--project-name'/); assert.equal((workflow.match(/npm test --prefix frontend/g) ?? []).length, 1); assert.equal((workflow.match(/npm run lint --prefix frontend/g) ?? []).length, 1); assert.equal((workflow.match(/npm run build --prefix frontend/g) ?? []).length, 1); diff --git a/requirements-dev.txt b/requirements-dev.txt index ec217dc8..82952da8 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -6,3 +6,4 @@ ruff>=0.6.0 build>=0.9 twine>=4.0 wheel>=0.40 +PyYAML>=6.0