build(contract): add one check for the openapi spec and the client
ZhenYi committed
Added scripts/contract-check.sh scripts/contract-check.sh +35 −0 View scripts/contract-check.sh
@@ -0,0 +1,35 @@
1#!/usr/bin/env bash
2# 契约闸门:openapi.json 与 packages/apiclient 都必须与源码当前状态一致。
3#
4# scripts/contract-check.sh # spec + 客户端
5# scripts/contract-check.sh --spec-only # 只比 openapi.json(需要 cargo)
6# scripts/contract-check.sh --client-only# 只比生成客户端(需要 pnpm)
7set -euo pipefail
8
9cd "$(dirname "$0")/.."
10
11check_spec() {
12 cargo run -q -p kenapi -- openapi --check
13}
14
15check_client() {
16 local snapshot
17 snapshot="$(mktemp -d)"
18 cp -R packages/apiclient "$snapshot/committed"
19 pnpm exec orval
20 if ! diff -ru "$snapshot/committed" packages/apiclient; then
21 echo "packages/apiclient is out of date; run \`just openapi\` to regenerate" >&2
22 exit 1
23 fi
24 rm -rf "$snapshot"
25}
26
27case "${1:-all}" in
28 --spec-only) check_spec ;;
29 --client-only) check_client ;;
30 all) check_spec && check_client ;;
31 *)
32 echo "usage: $0 [--spec-only|--client-only]" >&2
33 exit 2
34 ;;
35esac
Modified .dockerignore .dockerignore +0 −1 View .dockerignore
@@ -6,7 +6,6 @@
66.env.*
77config/local
88docs
9openapi.json
109*.iml
1110Dockerfile
1211.dockerignore
Modified biome.json biome.json +2 −1 View biome.json
@@ -11,7 +11,8 @@
1111 "**",
1212 "!**/dist",
1313 "!**/node_modules",
14 "!**/target"
14 "!**/target",
15 "!packages/apiclient"
1516 ]
1617 },
1718 "formatter": {
Modified Dockerfile Dockerfile +6 −1 View Dockerfile
@@ -25,8 +25,12 @@
2525RUN pnpm install --frozen-lockfile
2626COPY view ./view
2727COPY packages ./packages
28COPY openapi.json ./
29COPY scripts ./scripts
2830COPY vite.config.ts tsconfig.json tsconfig.app.json tsconfig.node.json \
2931 orval.config.ts steiger.config.ts biome.json ./
32# 契约闸门:生成客户端必须与提交的 packages/apiclient 一致。
33RUN bash scripts/contract-check.sh --client-only
3034RUN pnpm build
3135
3236# ---------------------------------------------------------------------------
@@ -60,7 +64,7 @@
6064COPY rust-toolchain.toml ./
6165RUN rustup show > /dev/null
6266
63COPY Cargo.toml Cargo.lock ./
67COPY Cargo.toml Cargo.lock openapi.json ./
6468COPY lib ./lib
6569COPY app ./app
6670COPY --from=identity-web /web/view/dist ./view/dist
@@ -71,6 +75,7 @@
7175 cargo build --release --locked --workspace --bins \
7276 && mkdir -p /out \
7377 && cp target/release/kenapi /out/ \
78 && /out/kenapi openapi --check \
7479 && strip /out/kenapi
7580
7681# ---------------------------------------------------------------------------
Modified justfile justfile +2 −2 View justfile
@@ -98,9 +98,9 @@
9898openapi:
9999 @cargo run -p kenapi -- openapi && pnpm exec orval
100100
101# 校验 openapi 是否与源码一致
101# 校验 openapi 与 packages/apiclient 是否都与源码一致
102102openapi-check:
103 @cargo run -p kenapi -- openapi --check
103 @bash scripts/contract-check.sh
104104
105105# cargo fmt --all
106106fmt:
Modified package.json package.json +2 −1 View package.json
@@ -13,7 +13,8 @@
1313 "preview": "vite preview",
1414 "format": "biome format --write .",
1515 "format:check": "biome format .",
16 "check": "biome check ."
16 "check": "biome check .",
17 "contract:check": "bash scripts/contract-check.sh"
1718 },
1819 "dependencies": {
1920 "@fontsource-variable/geist": "^5.3.0",