Files
MyGoNavi/tools/validate-web-server-dockerfile.sh
Syngnat 0a9aec5929 🐛 fix(docker): 修复容器驱动重装提示不消失
- Web 与 MCP 镜像编译前按目标平台生成驱动 revision
- 校验生成步骤位于源码复制后和 Go 编译前
- Docker 镜像工作流增加运行时 Dockerfile 回归检查
2026-07-10 10:04:38 +08:00

67 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# 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}" \
|| fail "expected COPY shared/ so frontend ../../../shared/i18n resolves"
grep -Fq 'COPY --from=frontend /src/frontend/dist ./frontend/dist' "${DOCKERFILE}" \
|| fail "expected dist copy from /src/frontend/dist"
# Old layout only copied frontend/ and broke catalog/messages/translate imports in CI.
if grep -Eq '^WORKDIR /frontend$' "${DOCKERFILE}"; then
fail "legacy WORKDIR /frontend would break shared/i18n relative imports"
fi
if grep -Fq 'COPY --from=frontend /frontend/dist' "${DOCKERFILE}"; then
fail "legacy dist path /frontend/dist no longer matches frontend stage"
fi
# Frontend sources still point outside package root into shared/i18n.
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"