diff --git a/.gitignore b/.gitignore index 0f4e3b0625..bd2e3e6ddf 100644 --- a/.gitignore +++ b/.gitignore @@ -119,6 +119,8 @@ tests CLAUDE.md .claude scripts +!backend/scripts/ +!backend/scripts/resolve-version.sh .code-review-state #openspec/ code-reviews/ diff --git a/Dockerfile b/Dockerfile index 37b084e7a2..bae531ac6e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -67,9 +67,9 @@ COPY backend/ ./ COPY --from=frontend-builder /app/backend/internal/web/dist ./internal/web/dist # Build the binary (BuildType=release for CI builds, embed frontend) -# Version precedence: build arg VERSION > cmd/server/VERSION +# Version precedence: build arg VERSION > exact git tag > cmd/server/VERSION RUN VERSION_VALUE="${VERSION}" && \ - if [ -z "${VERSION_VALUE}" ]; then VERSION_VALUE="$(tr -d '\r\n' < ./cmd/server/VERSION)"; fi && \ + if [ -z "${VERSION_VALUE}" ]; then VERSION_VALUE="$(./scripts/resolve-version.sh)"; fi && \ DATE_VALUE="${DATE:-$(date -u +%Y-%m-%dT%H:%M:%SZ)}" && \ CGO_ENABLED=0 GOOS=linux go build \ -tags embed \ diff --git a/README.md b/README.md index 7f0d72e9db..5315a9a0ec 100644 --- a/README.md +++ b/README.md @@ -447,7 +447,8 @@ pnpm run build # 4. Build backend with embedded frontend cd ../backend -go build -tags embed -o sub2api ./cmd/server +VERSION="$(./scripts/resolve-version.sh)" +go build -tags embed -ldflags="-X main.Version=${VERSION}" -o sub2api ./cmd/server # 5. Create configuration file cp ../deploy/config.example.yaml ./config.yaml diff --git a/README_CN.md b/README_CN.md index 2af6217563..d8a4011a1e 100644 --- a/README_CN.md +++ b/README_CN.md @@ -462,7 +462,8 @@ pnpm run build # 4. 编译后端(嵌入前端) cd ../backend -go build -tags embed -o sub2api ./cmd/server +VERSION="$(./scripts/resolve-version.sh)" +go build -tags embed -ldflags="-X main.Version=${VERSION}" -o sub2api ./cmd/server # 5. 创建配置文件 cp ../deploy/config.example.yaml ./config.yaml diff --git a/README_JA.md b/README_JA.md index 1bc60c7529..05abbaca70 100644 --- a/README_JA.md +++ b/README_JA.md @@ -445,7 +445,8 @@ pnpm run build # 4. フロントエンドを組み込んだバックエンドをビルド cd ../backend -go build -tags embed -o sub2api ./cmd/server +VERSION="$(./scripts/resolve-version.sh)" +go build -tags embed -ldflags="-X main.Version=${VERSION}" -o sub2api ./cmd/server # 5. 設定ファイルを作成 cp ../deploy/config.example.yaml ./config.yaml diff --git a/backend/Dockerfile b/backend/Dockerfile index 26b1dc3337..d4adb5564b 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -15,7 +15,8 @@ RUN go mod download COPY . . # 构建应用 -RUN go build -o main ./cmd/server/ +RUN VERSION_VALUE="$(./scripts/resolve-version.sh)" && \ + go build -ldflags="-s -w -X main.Version=${VERSION_VALUE}" -o main ./cmd/server/ # 暴露端口 EXPOSE 8080 diff --git a/backend/Makefile b/backend/Makefile index 7084ccb93e..1e21f48ea5 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -1,6 +1,6 @@ .PHONY: build generate test test-unit test-integration test-e2e -VERSION ?= $(shell tr -d '\r\n' < ./cmd/server/VERSION) +VERSION ?= $(shell ./scripts/resolve-version.sh) LDFLAGS ?= -s -w -X main.Version=$(VERSION) build: diff --git a/backend/scripts/resolve-version.sh b/backend/scripts/resolve-version.sh new file mode 100755 index 0000000000..7e3ac58348 --- /dev/null +++ b/backend/scripts/resolve-version.sh @@ -0,0 +1,23 @@ +#!/bin/sh +set -eu + +SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" +BACKEND_DIR="$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd)" +REPO_DIR="$(CDPATH= cd -- "$BACKEND_DIR/.." && pwd)" +VERSION_FILE="$BACKEND_DIR/cmd/server/VERSION" + +# Prefer the exact release tag when building from a tagged checkout so +# source builds from vX.Y.Z don't inherit the previous VERSION file value. +if command -v git >/dev/null 2>&1; then + TAG="$( + git -C "$REPO_DIR" describe --tags --exact-match --match 'v[0-9]*' 2>/dev/null || \ + git -C "$REPO_DIR" describe --tags --exact-match --match '[0-9]*' 2>/dev/null || \ + true + )" + if [ -n "$TAG" ]; then + printf '%s\n' "${TAG#v}" + exit 0 + fi +fi + +printf '%s\n' "$(tr -d '\r\n' < "$VERSION_FILE")" diff --git a/deploy/Dockerfile b/deploy/Dockerfile index 6bf0a50b4b..c9222da50f 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -41,7 +41,7 @@ RUN pnpm run build FROM ${GOLANG_IMAGE} AS backend-builder # Build arguments for version info (set by CI) -ARG VERSION=docker +ARG VERSION= ARG COMMIT=docker ARG DATE ARG GOPROXY @@ -66,9 +66,13 @@ COPY backend/ ./ COPY --from=frontend-builder /app/backend/internal/web/dist ./internal/web/dist # Build the binary (BuildType=release for CI builds, embed frontend) -RUN CGO_ENABLED=0 GOOS=linux go build \ +# Version precedence: build arg VERSION > exact git tag > cmd/server/VERSION +RUN VERSION_VALUE="${VERSION}" && \ + if [ -z "${VERSION_VALUE}" ]; then VERSION_VALUE="$(./scripts/resolve-version.sh)"; fi && \ + DATE_VALUE="${DATE:-$(date -u +%Y-%m-%dT%H:%M:%SZ)}" && \ + CGO_ENABLED=0 GOOS=linux go build \ -tags embed \ - -ldflags="-s -w -X main.Commit=${COMMIT} -X main.Date=${DATE:-$(date -u +%Y-%m-%dT%H:%M:%SZ)} -X main.BuildType=release" \ + -ldflags="-s -w -X main.Version=${VERSION_VALUE} -X main.Commit=${COMMIT} -X main.Date=${DATE_VALUE} -X main.BuildType=release" \ -o /app/sub2api \ ./cmd/server diff --git a/deploy/Makefile b/deploy/Makefile index 2c6d521782..05f3c7957c 100644 --- a/deploy/Makefile +++ b/deploy/Makefile @@ -1,5 +1,8 @@ .PHONY: wire build build-embed test-unit test-integration test-e2e test-cover-integration +VERSION ?= $(shell ./scripts/resolve-version.sh) +LDFLAGS ?= -s -w -X main.Version=$(VERSION) + wire: @echo "生成 Wire 代码..." @cd cmd/server && go generate @@ -7,12 +10,12 @@ wire: build: @echo "构建后端(不嵌入前端)..." - @go build -o bin/server ./cmd/server + @go build -ldflags="$(LDFLAGS)" -o bin/server ./cmd/server @echo "构建完成: bin/server" build-embed: @echo "构建后端(嵌入前端)..." - @go build -tags embed -o bin/server ./cmd/server + @go build -tags embed -ldflags="$(LDFLAGS)" -o bin/server ./cmd/server @echo "构建完成: bin/server (with embedded frontend)" test-unit: @@ -38,4 +41,4 @@ clean-coverage: clean: clean-coverage @rm -rf bin/ - @echo "构建产物已清理" \ No newline at end of file + @echo "构建产物已清理"