From 68b743f18b5b5af5087aa4724f38c936bb672fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Sat, 5 Sep 2026 00:23:56 +0800 Subject: [PATCH] =?UTF-8?q?task-216:=20CI=20=E6=8E=A5=E5=85=A5=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=98=B6=E6=AE=B5=EF=BC=88.gitea/workflows/build.yml?= =?UTF-8?q?=20=E8=BF=BD=E5=8A=A0=20mvn=20test=20=E5=A5=91=E7=BA=A6+ArchUni?= =?UTF-8?q?t=20=E9=98=B6=E6=AE=B5=E5=85=88=E4=BA=8E=E6=89=93=E5=8C=85?= =?UTF-8?q?=E3=80=81=E6=96=B0=E5=A2=9E=20frontend-test=20job=20=E8=B7=91?= =?UTF-8?q?=20vue-tsc+npm=20test=EF=BC=8C=E5=A4=B1=E8=B4=A5=E5=8D=B3?= =?UTF-8?q?=E7=BA=A2/=E8=B6=85=E6=97=B6/=E5=8F=8C=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=EF=BC=89+=208=20=E6=9D=A1=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 26 ++++++++++- frontend-vue/tests/ci-workflow.test.ts | 60 ++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 frontend-vue/tests/ci-workflow.test.ts diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index a7409437..3ea9fcdf 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -14,13 +14,35 @@ jobs: build: runs-on: ubuntu-latest container: maven:3.9-eclipse-temurin-21 + timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v4 - - name: Build with Maven + - name: Test (Java: unit + contract + ArchUnit) + working-directory: backend-java + run: mvn test -q + - name: Package + working-directory: backend-java run: mvn clean package -DskipTests -q - name: Upload artifact uses: actions/upload-artifact@v4 with: name: backend-jar - path: target/*.jar + path: backend-java/target/*.jar + + frontend-test: + runs-on: ubuntu-latest + container: node:24-alpine + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Install dependencies + working-directory: frontend-vue + run: npm ci + - name: Type check (vue-tsc) + working-directory: frontend-vue + run: npm run build + - name: Frontend contract tests (node --test) + working-directory: frontend-vue + run: node --test tests/*.test.ts diff --git a/frontend-vue/tests/ci-workflow.test.ts b/frontend-vue/tests/ci-workflow.test.ts new file mode 100644 index 00000000..afc05021 --- /dev/null +++ b/frontend-vue/tests/ci-workflow.test.ts @@ -0,0 +1,60 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +/** task-216:CI 接入测试阶段契约。.gitea/workflows/build.yml 含 Java 测试与前端测试,失败即红。 */ + +const YML = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '.gitea', 'workflows', 'build.yml') + +function text(): string { + return fs.readFileSync(YML, 'utf8') +} + +test('CI 工作流存在', () => { + assert.ok(fs.existsSync(YML), 'build.yml 应存在') +}) + +test('含 Java 测试阶段(mvn test 跑单元+契约+ArchUnit)', () => { + const t = text() + assert.ok(/Test \(Java: unit \+ contract \+ ArchUnit\)/.test(t), t) + assert.ok(/mvn test/.test(t), t) + assert.ok(!/mvn clean package -DskipTests.*\n\s*run: mvn test/.test(t), '测试应先于打包') +}) + +test('测试在打包之前执行(失败即红,阻断产物上传)', () => { + const t = text() + const testIdx = t.indexOf('mvn test') + const packageIdx = t.indexOf('mvn clean package -DskipTests') + assert.ok(testIdx !== -1 && packageIdx !== -1 && testIdx < packageIdx, 'mvn test 必须先于 package') +}) + +test('含前端测试 job(node --test 契约测试)', () => { + const t = text() + assert.ok(/frontend-test/.test(t), t) + assert.ok(/node --test tests\/\*\.test\.ts/.test(t), t) + assert.ok(/npm ci/.test(t), t) +}) + +test('前端含类型检查(vue-tsc)', () => { + const t = text() + assert.ok(/npm run build/.test(t), '应执行 npm run build(vue-tsc + vite)') +}) + +test('有超时与容器环境配置', () => { + const t = text() + assert.ok(/timeout-minutes:\s*\d+/.test(t), '应有超时配置') + assert.ok(/maven:3\.9-eclipse-temurin-21/.test(t), 'Java 容器应存在') + assert.ok(/node:24-alpine/.test(t), '前端容器应存在') +}) + +test('产物上传保留且路径指向 backend-java', () => { + const t = text() + assert.ok(/backend-java\/target\/\*\.jar/.test(t), 'jar 产物路径应对') + assert.ok(/Upload artifact/.test(t)) +}) + +test('可重复、内容稳定(两次读取一致)', () => { + assert.equal(text(), text()) +})