From 0a9aec59290c67455747961ba8d58fadd6d2ca7f Mon Sep 17 00:00:00 2001 From: Syngnat Date: Fri, 10 Jul 2026 10:04:38 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(docker):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=AE=B9=E5=99=A8=E9=A9=B1=E5=8A=A8=E9=87=8D=E8=A3=85?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=B8=8D=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Web 与 MCP 镜像编译前按目标平台生成驱动 revision - 校验生成步骤位于源码复制后和 Go 编译前 - Docker 镜像工作流增加运行时 Dockerfile 回归检查 --- .github/workflows/docker-images.yml | 5 +++++ Dockerfile.mcp-server | 1 + Dockerfile.web-server | 1 + tools/validate-web-server-dockerfile.sh | 30 ++++++++++++++++++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml index ebd0d16c..b12fba76 100644 --- a/.github/workflows/docker-images.yml +++ b/.github/workflows/docker-images.yml @@ -47,6 +47,11 @@ jobs: - name: Checkout code uses: actions/checkout@v5 + - name: Validate runtime Dockerfiles + if: matrix.image_name == 'gonavi-web-server' + shell: bash + run: bash tools/validate-web-server-dockerfile.test.sh + - name: Prepare build variables id: prep shell: bash diff --git a/Dockerfile.mcp-server b/Dockerfile.mcp-server index edef78fc..3884a6ab 100644 --- a/Dockerfile.mcp-server +++ b/Dockerfile.mcp-server @@ -15,6 +15,7 @@ COPY third_party/go-irisnative/go.mod third_party/go-irisnative/go.sum ./third_p RUN go mod download COPY . . +RUN ./tools/generate-driver-agent-revisions.sh --platform "${TARGETOS}/${TARGETARCH}" RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \ go build -trimpath -ldflags="-s -w" -o /out/gonavi-mcp-server ./cmd/gonavi-mcp-server diff --git a/Dockerfile.web-server b/Dockerfile.web-server index f5e23db7..41c18b0e 100644 --- a/Dockerfile.web-server +++ b/Dockerfile.web-server @@ -29,6 +29,7 @@ COPY third_party/go-irisnative/go.mod third_party/go-irisnative/go.sum ./third_p RUN go mod download COPY . . +RUN ./tools/generate-driver-agent-revisions.sh --platform "${TARGETOS}/${TARGETARCH}" COPY --from=frontend /src/frontend/dist ./frontend/dist # 纯 Go 构建主程序(web-server 模式不需要 Wails WebView / CGO) diff --git a/tools/validate-web-server-dockerfile.sh b/tools/validate-web-server-dockerfile.sh index 11730dd8..927a9fcb 100755 --- a/tools/validate-web-server-dockerfile.sh +++ b/tools/validate-web-server-dockerfile.sh @@ -1,20 +1,45 @@ #!/usr/bin/env bash -# Ensure web-server Docker frontend stage can resolve monorepo shared/i18n imports. +# Validate runtime Docker build ordering and the web frontend monorepo layout. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" DOCKERFILE="${ROOT}/Dockerfile.web-server" +MCP_DOCKERFILE="${ROOT}/Dockerfile.mcp-server" if [[ ! -f "${DOCKERFILE}" ]]; then echo "missing Dockerfile.web-server" >&2 exit 1 fi +if [[ ! -f "${MCP_DOCKERFILE}" ]]; then + echo "missing Dockerfile.mcp-server" >&2 + exit 1 +fi fail() { echo "validate-web-server-dockerfile: $*" >&2 exit 1 } +assert_target_driver_revisions_generated_before_build() { + local dockerfile="$1" + local label="$2" + local copy_line revision_line build_line + + copy_line="$(awk '$0 == "COPY . ." { print NR; exit }' "${dockerfile}")" + revision_line="$(awk '/generate-driver-agent-revisions\.sh/ { print NR; exit }' "${dockerfile}")" + build_line="$(awk '/go build -trimpath/ { print NR; exit }' "${dockerfile}")" + + [[ -n "${copy_line}" ]] || fail "${label}: missing COPY . ." + [[ -n "${revision_line}" ]] || fail "${label}: missing target-platform driver revision generation" + [[ -n "${build_line}" ]] || fail "${label}: missing go build" + grep -Fq -- '--platform "${TARGETOS}/${TARGETARCH}"' "${dockerfile}" \ + || fail "${label}: driver revisions must use TARGETOS/TARGETARCH" + (( revision_line > copy_line )) \ + || fail "${label}: driver revisions must be generated after COPY . ." + (( revision_line < build_line )) \ + || fail "${label}: driver revisions must be generated before go build" +} + grep -Fq 'WORKDIR /src/frontend' "${DOCKERFILE}" \ || fail "expected WORKDIR /src/frontend monorepo layout" grep -Fq 'COPY shared/ /src/shared/' "${DOCKERFILE}" \ @@ -35,4 +60,7 @@ FRONTEND_CATALOG="${ROOT}/frontend/src/i18n/catalog.ts" grep -Fq '../../../shared/i18n/' "${FRONTEND_CATALOG}" \ || fail "frontend catalog no longer imports ../../../shared/i18n (update Dockerfile if path changed)" +assert_target_driver_revisions_generated_before_build "${DOCKERFILE}" "Dockerfile.web-server" +assert_target_driver_revisions_generated_before_build "${MCP_DOCKERFILE}" "Dockerfile.mcp-server" + echo "validate-web-server-dockerfile: ok"