阿里云环境镜像打包。
parent
ca2c1be7a8
commit
76b36c13f4
|
|
@ -0,0 +1,46 @@
|
|||
# AI 会话快速上下文加载指引
|
||||
|
||||
## 使用方法
|
||||
|
||||
新的 AI 会话开始打包时,只需告知 AI:
|
||||
|
||||
> "请阅读 E:\works\agents\gbs\docs\build-tools2\ 目录下的所有文件,然后帮我打包 [项目名]"
|
||||
|
||||
AI 将自动:
|
||||
1. 读取 `credentials.conf` 获取所有账号密码
|
||||
2. 读取 `projects.conf` 获取项目参数
|
||||
3. 读取 `README.md` 了解打包流程
|
||||
4. 使用 `build_push.py` 或 paramiko 执行打包
|
||||
|
||||
## 文件优先级
|
||||
|
||||
| 文件 | 用途 | 读取优先级 |
|
||||
|------|------|-----------|
|
||||
| credentials.conf | 账号密码、服务器连接 | 必须 |
|
||||
| projects.conf | 各项目 JAR 路径、应用名 | 必须 |
|
||||
| README.md | 完整操作手册 | 需要时读取 |
|
||||
| build_push.py | 通用打包脚本 | 可直接执行 |
|
||||
| Dockerfile.project | 项目 Dockerfile 示例 | 参考 |
|
||||
| Dockerfile.template | 模板 Dockerfile | 参考 |
|
||||
|
||||
## 一键打包指令示例
|
||||
|
||||
```
|
||||
# AI 会话中直接告诉 AI:
|
||||
帮我打包 safety-eval-service,版本号递增
|
||||
|
||||
# AI 会自动:
|
||||
# 1. 读取 projects.conf 找到 JAR 路径和 Dockerfile
|
||||
# 2. 根据 latest_tag 确定新版本号
|
||||
# 3. 读取 credentials.conf 获取连接信息
|
||||
# 4. 执行 paramiko 打包流程
|
||||
# 5. 返回镜像地址
|
||||
```
|
||||
|
||||
## 新增项目时
|
||||
|
||||
在 `projects.conf` 中添加新的 `[project-name]` 段,填写:
|
||||
- app_name: K8s 部署名
|
||||
- jar_path: 本地 JAR 完整路径
|
||||
- dockerfile_type: project 或 template
|
||||
- dockerfile: 项目 Dockerfile 路径 (如有)
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# ============================================================
|
||||
# 通用项目 Dockerfile 模板 (适用于项目自带 Dockerfile 的场景)
|
||||
# 基础镜像: 杭州 ACR 的 JDK 1.8.0_202 镜像
|
||||
# ============================================================
|
||||
# 注意: 此模板中 JAR 路径为 ./start/target/start.jar
|
||||
# 打包脚本会自动将 JAR 放到正确的目录结构中
|
||||
# ============================================================
|
||||
|
||||
FROM jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/pub/jdk:1.8.0_202
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||
|
||||
COPY ./start/target/start.jar /opt/app.jar
|
||||
|
||||
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
# ============================================================
|
||||
# GBS Java Application Dockerfile 模板 (CentOS 7 + JDK 1.8.0_202)
|
||||
# 适用于没有项目自带 Dockerfile 的场景,通过本地 JDK 打包
|
||||
# ============================================================
|
||||
# Build context 目录结构:
|
||||
# .
|
||||
# ├── Dockerfile
|
||||
# ├── jdk1.8.0_202/ (从主节点 /opt/jdk1.8.0_202 复制)
|
||||
# └── target/
|
||||
# └── *.jar (应用 JAR 文件)
|
||||
# ============================================================
|
||||
|
||||
FROM centos:7
|
||||
|
||||
# 设置时区为 Asia/Shanghai
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
|
||||
|
||||
# 复制 JDK
|
||||
COPY jdk1.8.0_202/ /opt/jdk1.8.0_202/
|
||||
|
||||
# 设置 Java 环境变量
|
||||
ENV JAVA_HOME=/opt/jdk1.8.0_202
|
||||
ENV PATH=$PATH:$JAVA_HOME/bin
|
||||
ENV LANG=C.UTF-8
|
||||
|
||||
# 创建日志目录
|
||||
RUN mkdir -p /opt/logs
|
||||
|
||||
# 复制 JAR 文件
|
||||
COPY target/*.jar /opt/app.jar
|
||||
|
||||
# 启动参数 (可通过 K8s deployment 或 docker run -e 覆盖)
|
||||
ENTRYPOINT ["/opt/jdk1.8.0_202/bin/java", \
|
||||
"-Dnacos.namespace=jjb-dragon", \
|
||||
"-Dnacos.url=prod-nacos:8848", \
|
||||
"-Dspring.profiles.active=prod", \
|
||||
"-Dmysql.password=Mysql@zcloud33080", \
|
||||
"-Dmysql.host=192.168.20.100", \
|
||||
"-Dmysql.port=33080", \
|
||||
"-Dmysql.username=root", \
|
||||
"-jar", "/opt/app.jar"]
|
||||
|
|
@ -0,0 +1,236 @@
|
|||
# GBS 镜像打包操作手册
|
||||
|
||||
## 目录概述
|
||||
|
||||
本目录包含 GBS 项目 Docker 镜像打包所需的全部配置和脚本。AI 会话加载本目录后,可立即执行打包操作,无需额外询问环境信息。
|
||||
|
||||
```
|
||||
docs/build-tools2/
|
||||
├── README.md # 本文档 (打包流程说明)
|
||||
├── credentials.conf # 所有账号密码和环境配置
|
||||
├── projects.conf # 各项目打包参数清单
|
||||
├── build_push.py # 通用打包脚本 (Python, 本地执行)
|
||||
├── Dockerfile.project # 项目自带 Dockerfile 示例 (JDK 基础镜像)
|
||||
└── Dockerfile.template # 模板 Dockerfile (CentOS 7 + JDK 复制)
|
||||
```
|
||||
|
||||
## 快速开始 (AI 会话指引)
|
||||
|
||||
当用户要求打包时,按以下步骤执行:
|
||||
|
||||
1. 读取 `credentials.conf` 获取所有连接信息
|
||||
2. 读取 `projects.conf` 获取目标项目的 JAR 路径、应用名等参数
|
||||
3. 确认 JAR 文件存在且为最新版本
|
||||
4. 版本号递增 (基于 projects.conf 中的 latest_tag)
|
||||
5. 执行 `build_push.py` 或直接用 paramiko 构建并推送
|
||||
6. 返回完整镜像地址
|
||||
|
||||
## 打包架构
|
||||
|
||||
```
|
||||
本地 Windows 构建服务器 (192.168.20.100) 阿里云 ACR
|
||||
┌──────────┐ SSH/SFTP ┌──────────────────┐ docker push ┌────────────────────┐
|
||||
│ JAR 文件 │ ─────────────────→│ Docker build │ ───────────────→│ 张家口 ACR │
|
||||
│ Dockerfile│ │ - 拉取基础镜像 │ │ kilaa/zcloud-gbs- │
|
||||
│ Python │ │ - COPY JAR │ │ operation │
|
||||
│ 打包脚本 │ │ - docker build │ └────────────────────┘
|
||||
└──────────┘ │ - docker push │
|
||||
└──────────────────┘
|
||||
```
|
||||
|
||||
## 两种打包模式
|
||||
|
||||
### 模式一: 项目自带 Dockerfile
|
||||
|
||||
适用于项目根目录有 Dockerfile 的情况(如 safety-eval-service)。
|
||||
|
||||
特点:
|
||||
- Dockerfile 引用杭州 ACR 的 JDK 基础镜像: `jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/pub/jdk:1.8.0_202`
|
||||
- JAR 放置路径: `{build_dir}/start/target/start.jar`
|
||||
- 需要先登录杭州 ACR 拉取基础镜像
|
||||
- 镜像大小约 870-910MB
|
||||
|
||||
远程构建目录结构:
|
||||
```
|
||||
/tmp/docker-build-{app_name}/
|
||||
├── Dockerfile (从项目上传)
|
||||
└── start/
|
||||
└── target/
|
||||
└── start.jar (从本地 JAR 上传,统一命名)
|
||||
```
|
||||
|
||||
### 模式二: 模板 Dockerfile (CentOS 7 + JDK)
|
||||
|
||||
适用于没有项目 Dockerfile 的情况(如 zcloud-gbs-certificate)。
|
||||
|
||||
特点:
|
||||
- 基础镜像: `centos:7`,JDK 从主节点 `/opt/jdk1.8.0_202` 复制到构建上下文
|
||||
- JAR 放置路径: `{build_dir}/target/*.jar`
|
||||
- ENTRYPOINT 包含 Nacos、MySQL 等启动参数
|
||||
- 镜像大小约 840-880MB
|
||||
|
||||
远程构建目录结构:
|
||||
```
|
||||
/tmp/docker-build-{app_name}/
|
||||
├── Dockerfile (从 Dockerfile.template 上传)
|
||||
├── jdk1.8.0_202/ (从 /opt/jdk1.8.0_202 复制)
|
||||
└── target/
|
||||
└── *.jar (从本地 JAR 上传)
|
||||
```
|
||||
|
||||
## 打包流程详细步骤
|
||||
|
||||
### 1. 确认 JAR 文件
|
||||
|
||||
在本地 Windows 验证 JAR 文件存在:
|
||||
```powershell
|
||||
# 检查文件
|
||||
Get-Item "E:\works\projects\<项目名>\...\target\*.jar" | Select-Object Name, Length, LastWriteTime
|
||||
```
|
||||
|
||||
### 2. SFTP 上传 JAR 到构建服务器
|
||||
|
||||
通过 paramiko SSH 连接主节点 192.168.20.100,SFTP 上传 JAR 文件。
|
||||
JAR 大小通常 170-220MB,上传速度约 1.0 MB/s,耗时约 3-4 分钟。
|
||||
|
||||
### 3. 准备构建上下文
|
||||
|
||||
在远程服务器上:
|
||||
- 创建临时目录 `/tmp/docker-build-{app_name}`
|
||||
- 上传 Dockerfile
|
||||
- 模板模式: 复制 JDK (`cp -r /opt/jdk1.8.0_202 {build_dir}/`)
|
||||
|
||||
### 4. ACR 登录
|
||||
|
||||
```bash
|
||||
# 张家口 ACR (推送目标)
|
||||
echo 'Kilaa@6666' | docker login --username=kilaa --password-stdin registry.cn-zhangjiakou.aliyuncs.com
|
||||
|
||||
# 杭州 ACR (拉取基础镜像,仅项目 Dockerfile 模式需要)
|
||||
echo 'idurCT!rIq9EzISD' | docker login --username=10952138@qq.com --password-stdin jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com
|
||||
```
|
||||
|
||||
### 5. Docker Build
|
||||
|
||||
```bash
|
||||
docker build -t 'registry.cn-zhangjiakou.aliyuncs.com/kilaa/zcloud-gbs-operation:{app_name}-ota-{date}-{version}' {build_dir}
|
||||
```
|
||||
|
||||
### 6. Docker Push
|
||||
|
||||
```bash
|
||||
docker push 'registry.cn-zhangjiakou.aliyuncs.com/kilaa/zcloud-gbs-operation:{app_name}-ota-{date}-{version}'
|
||||
```
|
||||
|
||||
### 7. 验证
|
||||
|
||||
```bash
|
||||
docker pull registry.cn-zhangjiakou.aliyuncs.com/kilaa/zcloud-gbs-operation:{tag}
|
||||
```
|
||||
|
||||
### 8. 清理
|
||||
|
||||
```bash
|
||||
rm -rf /tmp/docker-build-{app_name}
|
||||
```
|
||||
|
||||
## 镜像标签命名规则
|
||||
|
||||
格式: `{app_name}-ota-{YYYYMMDD}-{N}`
|
||||
|
||||
| 字段 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| app_name | 应用名 (kebab-case) | jjb-saas-safety-eval |
|
||||
| ota | 环境前缀 (当前统一) | ota |
|
||||
| YYYYMMDD | 打包日期 | 20260703 |
|
||||
| N | 当日版本号 (从 1 递增) | 12 |
|
||||
|
||||
完整示例: `jjb-saas-safety-eval-ota-20260703-12`
|
||||
|
||||
## 已打包项目
|
||||
|
||||
### safety-eval-service (安全评估服务)
|
||||
|
||||
| 配置项 | 值 |
|
||||
|--------|-----|
|
||||
| app_name | jjb-saas-safety-eval |
|
||||
| JAR 路径 | `E:\works\projects\safety-eval-service\safety-eval-start\target\safety-eval-start-1.0-SNAPSHOT.jar` |
|
||||
| Dockerfile | `E:\works\projects\safety-eval-service\Dockerfile` (项目自带) |
|
||||
| 打包模式 | 项目 Dockerfile |
|
||||
| 基础镜像 | `jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/pub/jdk:1.8.0_202` |
|
||||
| 最近标签 | `jjb-saas-safety-eval-ota-20260703-12` |
|
||||
|
||||
### zcloud-gbs-certificate (证书服务)
|
||||
|
||||
| 配置项 | 值 |
|
||||
|--------|-----|
|
||||
| app_name | zcloud-gbs-certificate |
|
||||
| JAR 路径 | `E:\works\projects\zcloud_gbs_certificate\start\target\start.jar` |
|
||||
| Dockerfile | 模板 (Dockerfile.template) |
|
||||
| 打包模式 | 模板 Dockerfile |
|
||||
| 基础镜像 | centos:7 + JDK 1.8.0_202 |
|
||||
| 最近标签 | `zcloud-gbs-certificate-ota-20260701-2` |
|
||||
|
||||
## 通用打包脚本使用
|
||||
|
||||
```bash
|
||||
# 使用项目自带 Dockerfile
|
||||
python build_push.py \
|
||||
--jar "E:\works\projects\safety-eval-service\safety-eval-start\target\safety-eval-start-1.0-SNAPSHOT.jar" \
|
||||
--app jjb-saas-safety-eval \
|
||||
--version 13 \
|
||||
--project-dockerfile "E:\works\projects\safety-eval-service\Dockerfile"
|
||||
|
||||
# 使用模板 Dockerfile
|
||||
python build_push.py \
|
||||
--jar "E:\works\projects\zcloud_gbs_certificate\start\target\start.jar" \
|
||||
--app zcloud-gbs-certificate \
|
||||
--version 3
|
||||
|
||||
# 仅预览不执行
|
||||
python build_push.py --jar <path> --app <name> --version 1 --dry-run
|
||||
```
|
||||
|
||||
## K8s 部署命令
|
||||
|
||||
```bash
|
||||
# 更新已有部署的镜像
|
||||
kubectl set image deployment/{app_name} \
|
||||
{app_name}={full_image} -n jjb-dragon
|
||||
|
||||
# 新建部署
|
||||
kubectl create deployment {app_name} \
|
||||
--image={full_image} -n jjb-dragon --replicas=1
|
||||
|
||||
# 查看部署状态
|
||||
kubectl get pods -n jjb-dragon | grep {app_name}
|
||||
|
||||
# 查看 Pod 日志
|
||||
kubectl logs -f deployment/{app_name}-deploy -n jjb-dragon --tail=100
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: docker build 时拉取基础镜像失败
|
||||
A: 确认已登录杭州 ACR: `docker login jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com`
|
||||
|
||||
### Q: docker push 时提示 unauthorized
|
||||
A: 确认已登录张家口 ACR: `docker login registry.cn-zhangjiakou.aliyuncs.com`
|
||||
|
||||
### Q: SSH 连接超时
|
||||
A: 主节点网络偶尔不稳定,重试即可。
|
||||
|
||||
### Q: 应用启动后报 Nacos 连接失败
|
||||
A: 项目 Dockerfile 模式下 ENTRYPOINT 不带 -D 参数,Nacos 配置由 application-{profile}.yml 提供。确认 `spring.profiles.active` 对应正确环境,且 Nacos 地址在目标部署环境可达。
|
||||
|
||||
### Q: 如何确认镜像已推送成功
|
||||
A: 在构建服务器执行 `docker pull {full_image}`,能拉取即成功。
|
||||
|
||||
## 环境依赖
|
||||
|
||||
- **Python 3.x** (本地 Windows)
|
||||
- **paramiko** (Python SSH 库): `pip install paramiko`
|
||||
- **构建服务器**: 192.168.20.100 (root/Zcloud@zcloud100)
|
||||
- Docker 已安装
|
||||
- JDK 1.8.0_202 已安装在 `/opt/jdk1.8.0_202`
|
||||
- Maven 3.8.8 已安装在 `/opt/maven`
|
||||
|
|
@ -0,0 +1,243 @@
|
|||
"""
|
||||
GBS 通用镜像打包脚本
|
||||
====================
|
||||
从本地 Windows 执行: SFTP 上传 JAR -> 远程 Docker build -> ACR push
|
||||
|
||||
支持两种打包模式:
|
||||
1. 项目 Dockerfile 模式 (--project-dockerfile): 使用项目自带的 Dockerfile
|
||||
2. 模板 Dockerfile 模式 (默认): 使用 CentOS 7 + JDK 模板
|
||||
|
||||
用法:
|
||||
python build_push.py --jar <JAR路径> --app <应用名> --version <版本号>
|
||||
python build_push.py --jar <JAR路径> --app <应用名> --version <版本号> --project-dockerfile <Dockerfile路径>
|
||||
|
||||
示例:
|
||||
# 使用项目自带 Dockerfile 打包 safety-eval-service
|
||||
python build_push.py \
|
||||
--jar "E:\\works\\projects\\safety-eval-service\\safety-eval-start\\target\\safety-eval-start-1.0-SNAPSHOT.jar" \
|
||||
--app jjb-saas-safety-eval \
|
||||
--version 1 \
|
||||
--project-dockerfile "E:\\works\\projects\\safety-eval-service\\Dockerfile"
|
||||
|
||||
# 使用模板 Dockerfile 打包 certificate
|
||||
python build_push.py \
|
||||
--jar "E:\\works\\projects\\zcloud_gbs_certificate\\start\\target\\start.jar" \
|
||||
--app zcloud-gbs-certificate \
|
||||
--version 1
|
||||
"""
|
||||
|
||||
import paramiko
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
import argparse
|
||||
from datetime import datetime
|
||||
|
||||
# ---- 读取配置 (从同目录 credentials.conf) ----
|
||||
def load_credentials():
|
||||
"""从 credentials.conf 读取配置"""
|
||||
cred_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "credentials.conf")
|
||||
creds = {}
|
||||
if os.path.exists(cred_path):
|
||||
with open(cred_path, 'r', encoding='utf-8') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line and not line.startswith('#') and '=' in line:
|
||||
key, _, value = line.partition('=')
|
||||
creds[key.strip()] = value.strip()
|
||||
return creds
|
||||
|
||||
|
||||
def ssh_exec(client, cmd, timeout=600):
|
||||
"""执行 SSH 命令并打印结果"""
|
||||
print(f" > {cmd[:150]}{'...' if len(cmd) > 150 else ''}")
|
||||
stdin, stdout, stderr = client.exec_command(cmd, timeout=timeout)
|
||||
out = stdout.read().decode('utf-8', errors='replace')
|
||||
err = stderr.read().decode('utf-8', errors='replace')
|
||||
exit_code = stdout.channel.recv_exit_status()
|
||||
if out.strip():
|
||||
for line in out.strip().split('\n')[-15:]:
|
||||
print(f" {line}")
|
||||
if err.strip():
|
||||
important = [l for l in err.strip().split('\n')
|
||||
if not any(x in l for x in ['Downloading', 'Downloaded', 'Extracting', 'Progress'])]
|
||||
if important:
|
||||
print(f" [stderr] {'; '.join(important[:5])}")
|
||||
return out.strip(), err.strip(), exit_code
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="GBS Docker Build & Push")
|
||||
parser.add_argument('--jar', required=True, help='JAR 文件本地路径')
|
||||
parser.add_argument('--app', required=True, help='应用名称 (用于镜像 tag)')
|
||||
parser.add_argument('--version', default='1', help='版本后缀 (默认: 1)')
|
||||
parser.add_argument('--prefix', default='ota', help='标签前缀 (默认: ota)')
|
||||
parser.add_argument('--project-dockerfile', default=None,
|
||||
help='项目自带 Dockerfile 路径 (不指定则使用模板模式)')
|
||||
parser.add_argument('--dry-run', action='store_true', help='仅打印信息,不执行')
|
||||
args = parser.parse_args()
|
||||
|
||||
# ---- 加载凭据 ----
|
||||
creds = load_credentials()
|
||||
if not creds:
|
||||
print("ERROR: credentials.conf not found or empty!")
|
||||
sys.exit(1)
|
||||
|
||||
MASTER = creds['MASTER_HOST']
|
||||
SSH_USER = creds['SSH_USER']
|
||||
SSH_PASSWD = creds['SSH_PASSWD']
|
||||
ZJK_REGISTRY = creds['ZJK_REGISTRY']
|
||||
ZJK_REPO = creds['ZJK_REPO']
|
||||
ZJK_USER = creds['ZJK_USER']
|
||||
ZJK_PASS = creds['ZJK_PASS']
|
||||
HZ_REGISTRY = creds['HZ_REGISTRY']
|
||||
HZ_USER = creds['HZ_USER']
|
||||
HZ_PASS = creds['HZ_PASS']
|
||||
|
||||
# ---- 构建参数 ----
|
||||
jar_local = args.jar
|
||||
app_name = args.app
|
||||
version_suffix = args.version
|
||||
env_prefix = args.prefix
|
||||
use_project_dockerfile = args.project_dockerfile is not None
|
||||
dockerfile_local = args.project_dockerfile if use_project_dockerfile else None
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
template_dockerfile = os.path.join(script_dir, "Dockerfile.template")
|
||||
|
||||
date_tag = datetime.now().strftime("%Y%m%d")
|
||||
image_tag = f"{env_prefix}-{date_tag}-{version_suffix}"
|
||||
full_image = f"{ZJK_REGISTRY}/{ZJK_REPO}:{app_name}-{image_tag}"
|
||||
|
||||
# ---- 校验 ----
|
||||
if not os.path.exists(jar_local):
|
||||
print(f"ERROR: JAR not found: {jar_local}")
|
||||
sys.exit(1)
|
||||
if use_project_dockerfile and not os.path.exists(dockerfile_local):
|
||||
print(f"ERROR: Dockerfile not found: {dockerfile_local}")
|
||||
sys.exit(1)
|
||||
|
||||
jar_size_mb = os.path.getsize(jar_local) / 1024 / 1024
|
||||
build_dir = f"/tmp/docker-build-{app_name}"
|
||||
mode = "项目 Dockerfile" if use_project_dockerfile else "模板 Dockerfile (CentOS 7 + JDK)"
|
||||
|
||||
print("=" * 65)
|
||||
print(" GBS Docker Build & Push")
|
||||
print("=" * 65)
|
||||
print(f" 模式: {mode}")
|
||||
print(f" JAR: {jar_local} ({jar_size_mb:.1f} MB)")
|
||||
if use_project_dockerfile:
|
||||
print(f" Dockerfile: {dockerfile_local}")
|
||||
print(f" App: {app_name}")
|
||||
print(f" Tag: {image_tag}")
|
||||
print(f" Image: {full_image}")
|
||||
print(f" Registry: {ZJK_REGISTRY}/{ZJK_REPO}")
|
||||
print(f" Target: {MASTER}")
|
||||
print("=" * 65)
|
||||
|
||||
if args.dry_run:
|
||||
print("\n[DRY RUN] 以上为打包配置,未实际执行。")
|
||||
return
|
||||
|
||||
# ---- SSH 连接 ----
|
||||
client = paramiko.SSHClient()
|
||||
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
client.connect(MASTER, username=SSH_USER, password=SSH_PASSWD, timeout=30)
|
||||
print("\n[1/6] SSH 连接成功")
|
||||
|
||||
# ---- 准备远程目录 ----
|
||||
if use_project_dockerfile:
|
||||
# 项目 Dockerfile 模式: JAR 路径为 ./start/target/start.jar
|
||||
ssh_exec(client, f"rm -rf {build_dir} && mkdir -p {build_dir}/start/target")
|
||||
else:
|
||||
# 模板模式: JAR 路径为 ./target/*.jar,需复制 JDK
|
||||
ssh_exec(client, f"rm -rf {build_dir} && mkdir -p {build_dir}/target")
|
||||
|
||||
# ---- 上传 JAR ----
|
||||
print(f"\n[2/6] 上传 JAR ({jar_size_mb:.1f} MB)...")
|
||||
sftp = client.open_sftp()
|
||||
start = time.time()
|
||||
last_pct = -1
|
||||
|
||||
def progress(transferred, total):
|
||||
nonlocal last_pct
|
||||
pct = int(transferred * 100 / total)
|
||||
if pct >= last_pct + 10:
|
||||
last_pct = pct
|
||||
mb = transferred / 1024 / 1024
|
||||
elapsed = time.time() - start
|
||||
speed = mb / elapsed if elapsed > 0 else 0
|
||||
print(f" {pct}% ({mb:.1f} MB) - {speed:.1f} MB/s")
|
||||
|
||||
if use_project_dockerfile:
|
||||
remote_jar = f"{build_dir}/start/target/start.jar"
|
||||
else:
|
||||
remote_jar = f"{build_dir}/target/{os.path.basename(jar_local)}"
|
||||
|
||||
sftp.put(jar_local, remote_jar, callback=progress)
|
||||
elapsed = time.time() - start
|
||||
print(f" Done in {elapsed:.1f}s ({jar_size_mb/elapsed:.1f} MB/s)")
|
||||
|
||||
# ---- 上传 Dockerfile ----
|
||||
print(f"\n 上传 Dockerfile...")
|
||||
if use_project_dockerfile:
|
||||
sftp.put(dockerfile_local, f"{build_dir}/Dockerfile")
|
||||
else:
|
||||
with open(template_dockerfile, 'r', encoding='utf-8') as f:
|
||||
dockerfile_content = f.read()
|
||||
stdin, stdout, stderr = client.exec_command(f"cat > {build_dir}/Dockerfile")
|
||||
stdin.write(dockerfile_content)
|
||||
stdin.channel.shutdown_write()
|
||||
stdout.read()
|
||||
|
||||
sftp.close()
|
||||
|
||||
# ---- 模板模式: 复制 JDK ----
|
||||
if not use_project_dockerfile:
|
||||
print("\n[3/6] 准备构建上下文 (复制 JDK)...")
|
||||
ssh_exec(client, f"cp -r /opt/jdk1.8.0_202 {build_dir}/", timeout=120)
|
||||
else:
|
||||
print("\n[3/6] 构建上下文已就绪")
|
||||
|
||||
ssh_exec(client, f"du -sh {build_dir}/")
|
||||
|
||||
# ---- ACR 登录 ----
|
||||
print("\n[4/6] 登录 ACR...")
|
||||
if use_project_dockerfile:
|
||||
# 项目 Dockerfile 可能引用杭州 ACR 的基础镜像
|
||||
ssh_exec(client, f"echo '{HZ_PASS}' | docker login --username={HZ_USER} --password-stdin {HZ_REGISTRY}")
|
||||
ssh_exec(client, f"echo '{ZJK_PASS}' | docker login --username={ZJK_USER} --password-stdin {ZJK_REGISTRY}")
|
||||
|
||||
# ---- Docker build ----
|
||||
print("\n[5/6] 构建 Docker 镜像...")
|
||||
out, err, code = ssh_exec(client, f"docker build -t '{full_image}' {build_dir}", timeout=300)
|
||||
if code != 0:
|
||||
print("ERROR: Docker build failed!")
|
||||
client.close()
|
||||
sys.exit(1)
|
||||
|
||||
# ---- Push to ACR ----
|
||||
print("\n[6/6] 推送到张家口 ACR...")
|
||||
out, err, code = ssh_exec(client, f"docker push '{full_image}'", timeout=600)
|
||||
if code != 0:
|
||||
print("ERROR: Docker push failed!")
|
||||
client.close()
|
||||
sys.exit(1)
|
||||
|
||||
# ---- 验证 & 清理 ----
|
||||
ssh_exec(client, f"docker images | grep '{app_name}'")
|
||||
ssh_exec(client, f"rm -rf {build_dir}")
|
||||
client.close()
|
||||
|
||||
# ---- 输出结果 ----
|
||||
print("\n" + "=" * 65)
|
||||
print(" BUILD COMPLETE")
|
||||
print("=" * 65)
|
||||
print(f"\n 镜像地址:\n {full_image}\n")
|
||||
print(f" K8s 部署:\n"
|
||||
f" kubectl set image deployment/{app_name} \\\n"
|
||||
f" {app_name}={full_image} -n jjb-dragon\n")
|
||||
print("=" * 65)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
# ============================================================
|
||||
# GBS 镜像打包 - 环境与账号配置
|
||||
# ============================================================
|
||||
# 本文件集中管理所有打包相关的连接信息和凭据,
|
||||
# 方便 AI 会话快速加载上下文并执行打包。
|
||||
# ============================================================
|
||||
|
||||
# ---- 构建服务器 (Docker Host) ----
|
||||
MASTER_HOST=192.168.20.100
|
||||
SSH_USER=root
|
||||
SSH_PASSWD=Zcloud@zcloud100
|
||||
|
||||
# ---- 张家口 ACR (主推送目标) ----
|
||||
# 用途: 所有项目的最终镜像推送目标
|
||||
ZJK_REGISTRY=registry.cn-zhangjiakou.aliyuncs.com
|
||||
ZJK_REPO=kilaa/zcloud-gbs-operation
|
||||
ZJK_USER=kilaa
|
||||
ZJK_PASS=Kilaa@6666
|
||||
# VPC 内网地址 (K8s 集群内拉取镜像时使用):
|
||||
# registry-vpc.cn-zhangjiakou.aliyuncs.com/kilaa/zcloud-gbs-operation
|
||||
|
||||
# ---- 杭州 ACR (基础镜像拉取) ----
|
||||
# 用途: 部分项目 Dockerfile 使用的基础 JDK 镜像来源
|
||||
HZ_REGISTRY=jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com
|
||||
HZ_USER=10952138@qq.com
|
||||
HZ_PASS=idurCT!rIq9EzISD
|
||||
|
||||
# ---- 杭州 ACR (旧版推送, 已弃用) ----
|
||||
# 用途: 早期打包使用,现已统一推送到张家口
|
||||
HZ_OLD_REGISTRY=jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com
|
||||
HZ_OLD_NAMESPACE=ali_img_ns
|
||||
|
||||
# ---- Access Key (阿里云 API, 非 Docker 使用) ----
|
||||
AK_ID=LTAI5tF8GbtKizLAowJbAYmT
|
||||
AK_SECRET=G0ZYeaZtnpxhp0bO1rPp4HPrq57LaT
|
||||
|
||||
# ---- MySQL (Docker 容器) ----
|
||||
MYSQL_HOST=192.168.20.100
|
||||
MYSQL_PORT=33080
|
||||
MYSQL_USER=root
|
||||
MYSQL_PASS=Mysql@zcloud33080
|
||||
|
||||
# ---- Nacos (K8s 内部) ----
|
||||
NACOS_ADDR=prod-nacos:8848
|
||||
NACOS_NAMESPACE=jjb-dragon
|
||||
NACOS_NODEPORT=30290
|
||||
|
||||
# ---- K8s 集群 ----
|
||||
K8S_NAMESPACE=jjb-dragon
|
||||
IMAGE_PULL_SECRET=image-pull-secret1
|
||||
|
||||
# ---- 构建环境 (主节点已安装) ----
|
||||
JDK_PATH=/opt/jdk1.8.0_202
|
||||
MAVEN_PATH=/opt/maven
|
||||
MAVEN_VERSION=3.8.8
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
# ============================================================
|
||||
# GBS 项目打包配置清单
|
||||
# ============================================================
|
||||
# 每个项目的 JAR 路径、应用名、Dockerfile 类型等配置
|
||||
# AI 会话可直接读取此文件获取项目打包参数
|
||||
# ============================================================
|
||||
|
||||
# ---- safety-eval-service (安全评估服务) ----
|
||||
[safety-eval-service]
|
||||
app_name = jjb-saas-safety-eval
|
||||
jar_path = E:\works\projects\safety-eval-service\safety-eval-start\target\safety-eval-start-1.0-SNAPSHOT.jar
|
||||
dockerfile = E:\works\projects\safety-eval-service\Dockerfile
|
||||
dockerfile_type = project
|
||||
base_image = jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/pub/jdk:1.8.0_202
|
||||
remote_jar_path = start/target/start.jar
|
||||
image_size = ~910MB
|
||||
latest_tag = jjb-saas-safety-eval-ota-20260703-12
|
||||
notes = 项目自带 Dockerfile,使用杭州 ACR 的 JDK 基础镜像
|
||||
|
||||
# ---- zcloud-gbs-certificate (证书服务) ----
|
||||
[zcloud-gbs-certificate]
|
||||
app_name = zcloud-gbs-certificate
|
||||
jar_path = E:\works\projects\zcloud_gbs_certificate\start\target\start.jar
|
||||
dockerfile = (使用模板 Dockerfile.template)
|
||||
dockerfile_type = template
|
||||
base_image = centos:7 + JDK 1.8.0_202
|
||||
remote_jar_path = target/start.jar
|
||||
image_size = ~882MB
|
||||
latest_tag = zcloud-gbs-certificate-ota-20260701-2
|
||||
notes = 使用模板 Dockerfile (CentOS 7 + 本地 JDK 复制)
|
||||
|
||||
# ---- 镜像标签命名规则 ----
|
||||
# 格式: {app_name}-ota-{YYYYMMDD}-{N}
|
||||
# app_name: 应用名 (kebab-case)
|
||||
# ota: 环境前缀 (当前统一为 ota)
|
||||
# YYYYMMDD: 打包日期
|
||||
# N: 当日版本号 (从 1 递增)
|
||||
#
|
||||
# 示例: jjb-saas-safety-eval-ota-20260703-12
|
||||
# ^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^ ^^
|
||||
# 应用名 环境 日期 版本号
|
||||
|
||||
# ---- 镜像仓库信息 ----
|
||||
[registry]
|
||||
# 推送目标
|
||||
target = registry.cn-zhangjiakou.aliyuncs.com/kilaa/zcloud-gbs-operation
|
||||
# K8s 集群内拉取地址 (VPC)
|
||||
vpc = registry-vpc.cn-zhangjiakou.aliyuncs.com/kilaa/zcloud-gbs-operation
|
||||
# 完整镜像地址示例
|
||||
example = registry.cn-zhangjiakou.aliyuncs.com/kilaa/zcloud-gbs-operation:jjb-saas-safety-eval-ota-20260703-12
|
||||
Loading…
Reference in New Issue