签入版本
This commit is contained in:
@@ -24,6 +24,8 @@ cbuild
|
|||||||
*.exe
|
*.exe
|
||||||
vender/
|
vender/
|
||||||
vendor/
|
vendor/
|
||||||
|
# 各产品线 CI 编译产物(goframe_elevue / goframe_antdvue / goframe_naivevue …)
|
||||||
|
/goframe_*
|
||||||
|
|
||||||
# ----- 运行时数据(不入库) -----
|
# ----- 运行时数据(不入库) -----
|
||||||
log/
|
log/
|
||||||
|
|||||||
+44
-16
@@ -1,13 +1,20 @@
|
|||||||
# +======================================================================
|
# +======================================================================
|
||||||
# | 模块: Jenkins 镜像构建文件
|
# | 模块: Jenkins 镜像构建文件
|
||||||
# | 说明: CI 场景将已编译的 Go 二进制打包为应用镜像(编译在 Jenkins 侧完成,镜像内不编译)
|
# | 说明: CI 场景将已编译的 Go 二进制打包为应用镜像(编译在 Jenkins 侧完成,镜像内不编译)
|
||||||
# | 构建上下文为项目根目录,由 Jenkins 流水线注入构建参数,例如:
|
# | 适用: 各产品线共用;约定 二进制名 = 产品名 = 镜像名,由流水线统一注入
|
||||||
|
# | 构建示例(在项目根执行,产品名因产品线而异):
|
||||||
|
# | CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o <产品名> main.go
|
||||||
# | docker build -f .jenkins/Dockerfile \
|
# | docker build -f .jenkins/Dockerfile \
|
||||||
# | --build-arg VAR_BASE_IMAGE=alpine:3.22 \
|
# | --build-arg VAR_BASE_IMAGE=<基础镜像> \
|
||||||
# | --build-arg VAR_GOFILE=admin-server \
|
# | --build-arg VAR_GOFILE=<产品名> \
|
||||||
# | --build-arg VAR_GOFILE_PATH=bin/admin-server \
|
# | --build-arg VAR_GOFILE_PATH=. \
|
||||||
# | --build-arg VAR_PORT=8000 \
|
# | --build-arg VAR_PORT=<端口> \
|
||||||
# | -t easygoadmin:$TAG .
|
# | -t <仓库>/<产品名>:<TAG> .
|
||||||
|
# | 注意:
|
||||||
|
# | - 构建参数一律无默认值,必须由流水线显式传入(传什么就是什么,漏传/传错在构建期报错)
|
||||||
|
# | - VAR_GOFILE 为二进制文件名;VAR_GOFILE_PATH 为二进制所在目录(项目根传 .,可传 bin 等)
|
||||||
|
# | - 实际取用路径 = VAR_GOFILE_PATH/VAR_GOFILE(如 ./产品名 或 bin/产品名)
|
||||||
|
# | - 编译产物必须是 linux/amd64 格式(Windows 编译需加 GOOS=linux GOARCH=amd64)
|
||||||
# +======================================================================
|
# +======================================================================
|
||||||
|
|
||||||
# 基础镜像地址(如 alpine:3.22,可指向公司私服预置镜像)
|
# 基础镜像地址(如 alpine:3.22,可指向公司私服预置镜像)
|
||||||
@@ -19,10 +26,11 @@ FROM ${VAR_BASE_IMAGE}
|
|||||||
LABEL MAINTAINER="easygoadmin@163.com"
|
LABEL MAINTAINER="easygoadmin@163.com"
|
||||||
|
|
||||||
# 端口参数(后端监听端口,与 manifest/config/config.yaml 的 server.address 一致)
|
# 端口参数(后端监听端口,与 manifest/config/config.yaml 的 server.address 一致)
|
||||||
|
# 无默认值:未传时 ARG 静默置空,由下方校验层拦截报错
|
||||||
ARG VAR_PORT
|
ARG VAR_PORT
|
||||||
# 二进制文件名参数(不含路径,如 admin-server)
|
# 二进制文件名参数(= 产品名)
|
||||||
ARG VAR_GOFILE
|
ARG VAR_GOFILE
|
||||||
# 二进制文件路径参数(Jenkins 编译产物在构建上下文中的相对路径,如 bin/admin-server)
|
# 二进制所在目录参数(相对构建上下文;项目根传 .,可传 bin 等自定义目录)
|
||||||
ARG VAR_GOFILE_PATH
|
ARG VAR_GOFILE_PATH
|
||||||
|
|
||||||
# 设置端口
|
# 设置端口
|
||||||
@@ -32,6 +40,16 @@ ENV GOFILE=${VAR_GOFILE}
|
|||||||
# 设置时区(日志落盘与 gcron 定时任务依赖系统时区)
|
# 设置时区(日志落盘与 gcron 定时任务依赖系统时区)
|
||||||
ENV TZ=Asia/Shanghai
|
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}
|
EXPOSE ${PORT}
|
||||||
|
|
||||||
@@ -49,14 +67,24 @@ COPY manifest ./manifest
|
|||||||
COPY resource ./resource
|
COPY resource ./resource
|
||||||
COPY templates ./templates
|
COPY templates ./templates
|
||||||
|
|
||||||
# 拷贝 Jenkins 编译产物(Go 静态编译 CGO_ENABLED=0,直接可执行)
|
# 拷贝 Jenkins 编译产物(路径 = VAR_GOFILE_PATH/VAR_GOFILE,如 ./产品名 或 bin/产品名)
|
||||||
# 编译建议:CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o bin/admin-server main.go
|
# 编译建议:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags "-s -w" -o <产品名> main.go
|
||||||
COPY ${VAR_GOFILE_PATH} ./
|
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} 为编译产物文件名,如 admin-server
|
# ${GOFILE} 为编译产物文件名(= 产品名)
|
||||||
# 配置覆盖示例(Jenkins 部署阶段注入,勿写死镜像):
|
# 配置覆盖示例(部署阶段注入,勿写死镜像):
|
||||||
# -e GF_GENV_DATABASE_DEFAULT_LINK="mysql:...@tcp(host:3306)/easygoadmin.goframe.elevue?..."
|
# -e GF_GENV_DATABASE_DEFAULT_LINK="mysql:<用户>:<密码>@tcp(<主机>:<端口>)/<库名>?charset=utf8mb4&parseTime=true&loc=Local"
|
||||||
# -e GF_GENV_REDIS_DEFAULT_ADDRESS="host:6379"
|
# -e GF_GENV_REDIS_DEFAULT_ADDRESS="<主机>:<端口>"
|
||||||
# -e GF_GENV_FILE_UPLOADDIR="/data/upload" # 容器内必须覆盖(配置默认为开发机绝对路径)
|
# -e GF_GENV_FILE_UPLOADDIR="/data/upload" # 容器内必须覆盖(配置默认为开发机路径)
|
||||||
CMD ["sh", "-c", "./${GOFILE}"]
|
CMD ["sh", "-c", "./${GOFILE}"]
|
||||||
|
|||||||
+18
-1
@@ -9,10 +9,27 @@ APP_PORT=8000
|
|||||||
JWT_SECRET=please-change-this-jwt-secret
|
JWT_SECRET=please-change-this-jwt-secret
|
||||||
|
|
||||||
# ===== MySQL =====
|
# ===== MySQL =====
|
||||||
MYSQL_PORT=3306
|
# 数据库地址(容器网络内地址,非宿主机映射端口)
|
||||||
|
# 连 compose 自带 mysql 服务:保持默认服务名 mysql
|
||||||
|
# 连宿主机数据库:Mac/Windows Docker Desktop 用 host.docker.internal,
|
||||||
|
# Linux 用宿主机实际 IP 或 --add-host=host.docker.internal:host-gateway
|
||||||
|
# 注意:容器内 127.0.0.1 指向容器自身,连不上宿主机数据库
|
||||||
|
MYSQL_HOST=mysql
|
||||||
|
# 目标库监听端口(连接串内的端口;连外部库时填外部库端口,与下面的宿主映射端口无关)
|
||||||
|
MYSQL_HOST_PORT=3306
|
||||||
|
MYSQL_USER=root
|
||||||
MYSQL_PASSWORD=root
|
MYSQL_PASSWORD=root
|
||||||
MYSQL_DATABASE=easygoadmin.goframe.elevue
|
MYSQL_DATABASE=easygoadmin.goframe.elevue
|
||||||
|
# 宿主机映射端口(仅 compose 自带 mysql 服务对外暴露时使用)
|
||||||
|
MYSQL_PORT=3306
|
||||||
|
|
||||||
# ===== Redis =====
|
# ===== Redis =====
|
||||||
|
# 同 MYSQL_HOST 规则;容器内 127.0.0.1 指向容器自身,连不上宿主机 Redis
|
||||||
|
REDIS_HOST=redis
|
||||||
|
# 连宿主机 Redis 时改为(Windows/Mac Docker Desktop):
|
||||||
|
# REDIS_HOST=host.docker.internal
|
||||||
|
# 目标 Redis 监听端口(连外部库时填外部端口)
|
||||||
|
REDIS_HOST_PORT=6379
|
||||||
|
# 宿主机映射端口(仅 compose 自带 redis 服务对外暴露时使用)
|
||||||
REDIS_PORT=6379
|
REDIS_PORT=6379
|
||||||
REDIS_PASSWORD=123456
|
REDIS_PASSWORD=123456
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ services:
|
|||||||
# (GF_GENV_ 键名 = 配置路径大写下划线,如 file.uploadDir → GF_GENV_FILE_UPLOADDIR)
|
# (GF_GENV_ 键名 = 配置路径大写下划线,如 file.uploadDir → GF_GENV_FILE_UPLOADDIR)
|
||||||
environment:
|
environment:
|
||||||
TZ: Asia/Shanghai
|
TZ: Asia/Shanghai
|
||||||
GF_GENV_DATABASE_DEFAULT_LINK: "mysql:${MYSQL_USER:-root}:${MYSQL_PASSWORD:-root}@tcp(mysql:3306)/${MYSQL_DATABASE:-easygoadmin.goframe.elevue}?charset=utf8mb4&parseTime=true&loc=Local"
|
GF_GENV_DATABASE_DEFAULT_LINK: "mysql:${MYSQL_USER:-root}:${MYSQL_PASSWORD:-root}@tcp(${MYSQL_HOST:-mysql}:${MYSQL_HOST_PORT:-3306})/${MYSQL_DATABASE:-easygoadmin.goframe.elevue}?charset=utf8mb4&parseTime=true&loc=Local"
|
||||||
GF_GENV_REDIS_DEFAULT_ADDRESS: "redis:6379"
|
GF_GENV_REDIS_DEFAULT_ADDRESS: "${REDIS_HOST:-redis}:${REDIS_HOST_PORT:-6379}"
|
||||||
GF_GENV_REDIS_DEFAULT_PASS: "${REDIS_PASSWORD:-123456}"
|
GF_GENV_REDIS_DEFAULT_PASS: "${REDIS_PASSWORD:-123456}"
|
||||||
GF_GENV_FILE_UPLOADDIR: "/data/upload"
|
GF_GENV_FILE_UPLOADDIR: "/data/upload"
|
||||||
GF_GENV_JWT_SECRET: "${JWT_SECRET:-please-change-this-jwt-secret}"
|
GF_GENV_JWT_SECRET: "${JWT_SECRET:-please-change-this-jwt-secret}"
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ require (
|
|||||||
github.com/xuri/excelize/v2 v2.11.0
|
github.com/xuri/excelize/v2 v2.11.0
|
||||||
golang.org/x/crypto v0.58.0
|
golang.org/x/crypto v0.58.0
|
||||||
golang.org/x/image v0.38.0
|
golang.org/x/image v0.38.0
|
||||||
|
golang.org/x/sys v0.49.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
@@ -59,7 +60,6 @@ require (
|
|||||||
go.opentelemetry.io/otel/sdk v1.38.0 // indirect
|
go.opentelemetry.io/otel/sdk v1.38.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.38.0 // indirect
|
go.opentelemetry.io/otel/trace v1.38.0 // indirect
|
||||||
golang.org/x/net v0.60.0 // indirect
|
golang.org/x/net v0.60.0 // indirect
|
||||||
golang.org/x/sys v0.49.0 // indirect
|
|
||||||
golang.org/x/text v0.43.0 // indirect
|
golang.org/x/text v0.43.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
modernc.org/libc v1.22.5 // indirect
|
modernc.org/libc v1.22.5 // indirect
|
||||||
|
|||||||
Reference in New Issue
Block a user