# +======================================================================
# | 模块: Jenkins 镜像构建文件
# | 说明: CI 场景将已编译的 Go 二进制打包为应用镜像（编译在 Jenkins 侧完成，镜像内不编译）
# | 适用: 各产品线共用；约定 二进制名 = 产品名 = 镜像名，由流水线统一注入
# | 构建示例（在项目根执行，产品名因产品线而异）：
# |   CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o <产品名> main.go
# |   docker build -f .jenkins/Dockerfile \
# |     --build-arg VAR_BASE_IMAGE=<基础镜像> \
# |     --build-arg VAR_GOFILE=<产品名> \
# |     --build-arg VAR_GOFILE_PATH=. \
# |     --build-arg VAR_PORT=<端口> \
# |     -t <仓库>/<产品名>:<TAG> .
# | 注意：
# |   - 构建参数一律无默认值，必须由流水线显式传入（传什么就是什么，漏传/传错在构建期报错）
# |   - VAR_GOFILE 为二进制文件名；VAR_GOFILE_PATH 为二进制所在目录（项目根传 .，可传 bin 等）
# |   - 实际取用路径 = VAR_GOFILE_PATH/VAR_GOFILE（如 ./产品名 或 bin/产品名）
# |   - 编译产物必须是 linux/amd64 格式（Windows 编译需加 GOOS=linux GOARCH=amd64）
# +======================================================================

# 基础镜像地址（如 alpine:3.22，可指向公司私服预置镜像）
ARG VAR_BASE_IMAGE

# 基础镜像
FROM ${VAR_BASE_IMAGE}
# 镜像作者
LABEL MAINTAINER="easygoadmin@163.com"

# 端口参数（后端监听端口，与 manifest/config/config.yaml 的 server.address 一致）
# 无默认值：未传时 ARG 静默置空，由下方校验层拦截报错
ARG VAR_PORT
# 二进制文件名参数（= 产品名）
ARG VAR_GOFILE
# 二进制所在目录参数（相对构建上下文；项目根传 .，可传 bin 等自定义目录）
ARG VAR_GOFILE_PATH

# 设置端口
ENV PORT=${VAR_PORT}
# 设置二进制文件名
ENV GOFILE=${VAR_GOFILE}
# 设置时区（日志落盘与 gcron 定时任务依赖系统时区）
ENV TZ=Asia/Shanghai

# 构建参数校验（紧随 ENV，先于 EXPOSE/COPY）
#   ARG 未传时静默置空；若不拦截，EXPOSE 空参、COPY 空路径都会先报
#   "EXPOSE requires at least one argument" / "source path cannot be absolute"
#   这类与参数毫无关联的晦涩错误——在此统一转为明确的参数缺失报错
RUN set -eux; \
    if [ -z "${PORT}" ] || [ -z "${GOFILE}" ]; then \
        echo "ERROR: 构建参数缺失。必须显式传入：VAR_PORT（监听端口）、VAR_GOFILE（二进制文件名）、VAR_GOFILE_PATH（所在目录，项目根传 .）"; \
        exit 1; \
    fi

# 暴露端口
EXPOSE ${PORT}

# 创建工作区
RUN mkdir -p /opt/apps
# 设置工作区
WORKDIR /opt/apps

# 拷贝运行时资产（四件缺一不可，路径相对项目根）
#   manifest/config  运行时配置（敏感项运行时经 GF_ 环境变量覆盖，不改镜像内文件）
#   manifest/data    ip2region.xdb 归属地库
#   resource         验证码字体、swagger 页面等静态资源
#   templates        代码生成器模板（tool 域运行时读取）
COPY manifest ./manifest
COPY resource ./resource
COPY templates ./templates

# 拷贝 Jenkins 编译产物（路径 = VAR_GOFILE_PATH/VAR_GOFILE，如 ./产品名 或 bin/产品名）
# 编译建议：CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags "-s -w" -o <产品名> main.go
COPY ${VAR_GOFILE_PATH}/${VAR_GOFILE} ./

# 构建期校验 + 补执行权限
#   参数传错/产物缺失在此立即失败并给出指引，不留到启动期以循环报错暴露
#   chmod 防编译产物经跨系统拷贝丢失执行位（COPY 保留源文件权限）
RUN set -eux; \
    if [ -z "${GOFILE}" ] || [ ! -f "./${GOFILE}" ]; then \
        echo "ERROR: 二进制 ./${GOFILE} 不存在。请检查构建参数：VAR_GOFILE（文件名）与 VAR_GOFILE_PATH（所在目录，根目录传 .）、编译产物是否落在构建上下文内"; \
        exit 1; \
    fi; \
    chmod +x "./${GOFILE}"

# 启动命令
#   ${GOFILE} 为编译产物文件名（= 产品名）
#   配置覆盖示例（部署阶段注入，勿写死镜像）：
#     -e GF_DATABASE_DEFAULT_LINK="mysql:<用户>:<密码>@tcp(<主机>:<端口>)/<库名>?charset=utf8mb4&parseTime=true&loc=Local"
#     -e GF_REDIS_DEFAULT_ADDRESS="<主机>:<端口>"
#     -e GF_FILE_UPLOADDIR="/data/upload"   # 容器内必须覆盖（配置默认为开发机路径）
CMD ["sh", "-c", "./${GOFILE}"]
