Files
ttstd-infinite-canvas/.github/workflows/quality.yml
AetherNo2332 5045f7a7e1 ci(quality): 后端测试 - 备齐 Postgres/Redis 依赖并禁止依赖用例静默跳过 (#571)
Original-Commit: 6bc6d5701f461a7306fd8171e18968c95d7da124
ci(quality): 后端测试 - 备齐 Postgres/Redis 依赖并禁止依赖用例静默跳过

Backend job 既没有 services 也没有 CANVAS_TEST_POSTGRES_DSN,也没装 redis-server,
于是 5 个用例默认静默跳过:PostgreSQL 迁移、素材字节修复、画布版本历史、Redis 租约、
缓存白名单——这些路径在 CI 上从来没被执行过,而 go test ./... 是全绿的。

- 起 postgres:16-alpine service(pg_isready 健康检查)+ 导出 CANVAS_TEST_POSTGRES_DSN;
- 安装 redis-server 可执行文件(用例自起临时实例)并停掉系统服务;
- 新增守卫:单独跑这 5 个用例,出现 --- SKIP 就 ::error:: 并失败;
- 保留既有的 go test -json | tee 与 timings artifact 上传。
2026-09-21 09:37:20 +08:00

145 lines
5.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Quality checks
on:
pull_request:
workflow_call:
permissions:
contents: read
jobs:
backend:
name: Backend checks
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend
# 后端有 5 个用例默认会静默跳过:3 个需要 CANVAS_TEST_POSTGRES_DSN(PostgreSQL 迁移、
# 素材字节修复、画布版本历史),2 个用 exec.LookPath("redis-server") 自起临时实例
# (Redis 租约、缓存白名单)。只跑 go test ./... 而不备齐这两样,这些路径永远不会被执行。
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_PASSWORD: canvas_test
POSTGRES_DB: canvas_test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres"
--health-interval 5s
--health-timeout 5s
--health-retries 12
env:
CANVAS_TEST_POSTGRES_DSN: postgres://postgres:canvas_test@127.0.0.1:5432/canvas_test?sslmode=disable
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: backend/go.mod
cache-dependency-path: backend/go.sum
cache: true
- name: Install redis-server for integration tests
# 用例自己拉起临时 redis-server(unix socket),所以需要的是可执行文件而不是 redis 服务。
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq redis-server
sudo systemctl stop redis-server || true
- name: Check formatting
run: test -z "$(gofmt -l .)"
- name: Run Go tests
shell: bash
run: |
set -o pipefail
go test -json ./... | tee "$RUNNER_TEMP/go-tests.jsonl"
- name: Ensure dependency-backed tests were not skipped
shell: bash
run: |
set -o pipefail
go test ./internal/database/ ./internal/canvas/ ./internal/repository/ ./internal/platform/ ./internal/app/ \
-run 'TestPostgresAssetIDMigration|TestRepairAssetBytesPostgres|TestCanvasRevision|TestRuntimeCoordinatorRedisLeasePreservesLongestTTL|TestClearAdminRuntimeCacheUsesRedisWhitelist' \
-count=1 -v | tee "$RUNNER_TEMP/dependency-tests.log"
if grep -q -- "--- SKIP" "$RUNNER_TEMP/dependency-tests.log"; then
echo "::error::依赖外部服务的用例被跳过:请检查 CANVAS_TEST_POSTGRES_DSN 与 redis-server"
exit 1
fi
- name: Upload Go test timings
if: always()
uses: actions/upload-artifact@v4
with:
name: go-test-timings
path: ${{ runner.temp }}/go-tests.jsonl
if-no-files-found: ignore
payment-plugins:
name: Payment plugin artifacts
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Verify canonical payment packages
env:
PAYMENT_PLUGIN_SMOKE_TEST: "1"
run: sh plugin-packages/verify-payment-packages.sh --all linux amd64
# 发布时 backend/Dockerfile 会在两种架构的原生 Runner 上执行 smoke。
# PR 仍独立验证双架构,不能因没有发布任务而遗漏 ARM64 验收。
- uses: docker/setup-qemu-action@v3
if: github.event_name == 'pull_request'
- uses: docker/setup-buildx-action@v3
if: github.event_name == 'pull_request'
- name: Build and execute payment packages for every image platform
if: github.event_name == 'pull_request'
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
target: payment-package-smoke
file: backend/Dockerfile
cache-from: type=gha,scope=payment-smoke
cache-to: type=gha,mode=max,scope=payment-smoke
web:
name: Web checks
runs-on: ubuntu-latest
defaults:
run:
working-directory: web
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.9
- name: Reject leftover package manager lockfiles
working-directory: ${{ github.workspace }}
run: |
leftover=0
for file in web/pnpm-lock.yaml web/package-lock.json web/yarn.lock; do
if [ -f "$file" ]; then
echo "forbidden lockfile: $file"
leftover=1
fi
done
if [ "$leftover" -ne 0 ]; then
echo "web installs from bun.lock only"
exit 1
fi
- name: Install dependencies
run: bun install --frozen-lockfile
- name: Check formatting
env:
BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before }}
run: bun scripts/check-changed-formatting.mjs
- name: Typecheck
run: bun run typecheck
- name: Lint retired Ant Design APIs
run: bun run lint
- name: Run tests
run: bun run test
# ubuntu-latest 预装 google-chrome;脚本的解析顺序已覆盖该路径,
# 因此不引入第三方 setup action,也不需要任何 secret。
- name: Director P0 Chrome E2E
run: |
google-chrome --version || chromium --version
bun run test:director:e2e