FROM golang:1.26-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY cmd ./cmd
COPY internal ./internal
# 构建期身份：由调用方 --build-arg 传入。依据是仓库根 CHANGELOG.md 顶部的已发布版本
# （`python3 scripts/version.py --identity`），**不要手填**。不传就落成 dev / unknown —— 那是故意的：
# 一个显眼的 dev 好过一个看起来正常的假版本号（正本 §6.1）。
# BUILD_KIND 只有**显式的发布上下文**才传 release；普通构建一律 development，
# 产物的 DisplayVersion() 会是 dev+g<短SHA>（开发构建不许只显示上一正式版本号）。
# ⚠️ TODO：compose.yaml 还没把这三个 args 透传进来（改动会与在审的 PR #2 冲突），
#    所以当前由 compose 构建出的镜像会报 dev；透传后即报真实版本。
ARG VERSION=dev
ARG RELEASE_VERSION=
ARG BUILD_KIND=development
ARG COMMITS_SINCE_RELEASE=
ARG COMMIT_SHA=unknown
ARG BUILD_TIME=unknown
RUN LDFLAGS="-X knowledge-governance/internal/version.Number=${VERSION} -X knowledge-governance/internal/version.ReleaseVersion=${RELEASE_VERSION} -X knowledge-governance/internal/version.BuildKind=${BUILD_KIND} -X knowledge-governance/internal/version.CommitsSinceRelease=${COMMITS_SINCE_RELEASE} -X knowledge-governance/internal/version.CommitSHA=${COMMIT_SHA} -X knowledge-governance/internal/version.BuildTime=${BUILD_TIME}" \
    && CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "$LDFLAGS" -o /out/api ./cmd/api \
    && CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "$LDFLAGS" -o /out/worker ./cmd/worker \
    && CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "$LDFLAGS" -o /out/release-worker ./cmd/release-worker \
    && CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "$LDFLAGS" -o /out/libraryctl ./cmd/libraryctl \
    && CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "$LDFLAGS" -o /out/test-publication-seed ./cmd/test-publication-seed \
    && CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "$LDFLAGS" -o /out/test-weknora-e2e-report ./cmd/test-weknora-e2e-report \
    && CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags "$LDFLAGS" -o /out/test-weknora-probe ./cmd/test-weknora-probe

FROM alpine:3.22
ENV PYTHONDONTWRITEBYTECODE=1
RUN apk add --no-cache ca-certificates python3 postgresql-client curl openssh-client gcompat libc6-compat \
    && addgroup -g 65532 governance \
    && adduser -D -H -u 65532 -G governance governance

# ssh 客户端需要"本机 uid 有 passwd 条目"（否则报 No user exists for uid 1000）；
# 备份计划的下发与读回都走 ssh，容器以 1000 运行，这里给该 uid 建一个名字。
RUN adduser -D -u 1000 -h /home/app appuser 2>/dev/null || true
# dws (DingTalk Workspace CLI) v1.0.63：版本+校验和固定（禁用 dws upgrade）。
# 官方产物是动态链接 glibc 的二进制，alpine(musl) 靠 gcompat/libc6-compat 运行，
# 已验证端到端取件并与 glibc 原生环境字节一致。构建期 `dws version` 即自检。
ARG DWS_VERSION=v1.0.63
ARG DWS_SHA256=78cab668bf671c17128ac55347627fb28f80c15b9c30c5f86e32e2b5ee6e34bc
RUN set -eux; \
    curl -fsSL -o /tmp/dws.tgz \
      "https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli/releases/download/${DWS_VERSION}/dws-linux-amd64.tar.gz"; \
    echo "${DWS_SHA256}  /tmp/dws.tgz" | sha256sum -c -; \
    tar -xzf /tmp/dws.tgz -C /tmp ./dws; \
    install -m 0755 /tmp/dws /usr/local/bin/dws; \
    rm -rf /tmp/dws.tgz /tmp/dws; \
    dws version
WORKDIR /app
COPY --from=build /out/ /app/
COPY scripts/source_catalog_import.py scripts/live_catalog_refresh.py scripts/artifact_fetch.py \
     scripts/axls_to_xlsx.py scripts/dws_error_map.py /app/scripts/
USER 65532:65532
CMD ["/app/api"]
