【修改】dubbo配置;【新增】打包发布gbs相关。
parent
63389a7d42
commit
df9de45730
|
|
@ -0,0 +1,187 @@
|
|||
GBS 部署配置分析报告
|
||||
safety-eval-service (安全评价业务服务)
|
||||
2026-06-26
|
||||
1 项目概览
|
||||
属性
|
||||
值
|
||||
项目名称
|
||||
safety-eval-service
|
||||
中文名称
|
||||
重庆安全评价
|
||||
应用名称 (application.name)
|
||||
jjb-saas-cq-anquan
|
||||
网关前缀 (application.gateway)
|
||||
cqanquan
|
||||
Spring 应用名
|
||||
safety-eval-service
|
||||
服务端口
|
||||
8095
|
||||
上下文路径
|
||||
/safety-eval
|
||||
Java 版本
|
||||
1.8 (JDK 1.8.0_202)
|
||||
Spring Boot 版本
|
||||
2.7.18
|
||||
架构
|
||||
DDD 分层(6 模块)
|
||||
数据库
|
||||
jjb_saas_safety_eval
|
||||
2 部署环境
|
||||
项目
|
||||
信息
|
||||
镜像地址
|
||||
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
K8s 命名空间
|
||||
jjb-dragon
|
||||
Master 节点
|
||||
192.168.20.100
|
||||
ACR 仓库
|
||||
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com
|
||||
镜像拉取密钥
|
||||
image-pull-secret
|
||||
Nacos 命名空间
|
||||
jjb-dragon
|
||||
已有 K8s 服务数
|
||||
27 个(均为 ClusterIP 端口 80)
|
||||
3 可确定填写的字段
|
||||
以下字段均可通过项目配置文件和现有环境分析确定填写值。
|
||||
3.1 路由信息(后端路由)
|
||||
字段
|
||||
填写值
|
||||
依据
|
||||
路由名称
|
||||
重庆安全评价-后端
|
||||
application.cn-name + 现有路由命名惯例
|
||||
系统编码
|
||||
jjb-saas-cq-anquan
|
||||
application.name 属性
|
||||
Prefix (StripPrefix)
|
||||
0
|
||||
项目配置 strip-prefix: 0,与现有全部后端路由一致
|
||||
路径 (Path)
|
||||
/cqanquan/**
|
||||
application.gateway = cqanquan,格式 /${gateway}/**
|
||||
标识 (Uri)
|
||||
http://jjb-saas-cq-anquan
|
||||
现有路由均为 http://<K8s服务名> 格式
|
||||
3.2 其他配置
|
||||
字段
|
||||
填写值
|
||||
说明
|
||||
数据库名称
|
||||
jjb_saas_safety_eval
|
||||
表单已预填,MySQL 中确认存在
|
||||
镜像密钥
|
||||
image-pull-secret
|
||||
表单已预填,K8s 中确认存在
|
||||
应用类型
|
||||
后端部署
|
||||
已选中,正确
|
||||
3.3 部署参数
|
||||
字段
|
||||
填写值
|
||||
说明
|
||||
JDK 版本
|
||||
jdk8
|
||||
已选中,与项目 Java 1.8 匹配
|
||||
启动参数
|
||||
保持现有内容
|
||||
k8s-nacos:8848 是 GBS 平台内部 Nacos 地址
|
||||
CPU
|
||||
500 M
|
||||
合理,与现有服务一致
|
||||
副本数
|
||||
1
|
||||
合理,开发测试阶段
|
||||
3.4 服务配置
|
||||
字段
|
||||
填写值
|
||||
依据
|
||||
服务名称
|
||||
jjb-saas-cq-anquan
|
||||
与 Uri 中服务名一致,遵循现有 K8s 命名惯例
|
||||
开放端口
|
||||
80
|
||||
现有 27 个 K8s Service 全部是 ClusterIP 80 端口
|
||||
4 需要 GBS 平台确认的字段
|
||||
以下字段无法仅通过项目配置和环境分析确定,需要 GBS 平台侧提供信息。
|
||||
4.1 心跳监控地址
|
||||
项目的 Actuator 健康端点为 /cqanquan/actuator/health,但 GBS 平台要求的填写格式不确定:
|
||||
可能需要完整 URL:http://jjb-saas-cq-anquan/cqanquan/actuator/health
|
||||
也可能只需路径部分:/cqanquan/actuator/health
|
||||
需确认 GBS 平台对心跳地址的格式规范
|
||||
4.2 移动端应用(复选框)
|
||||
项目配置中存在前端路由(路径 /cqanquan/container/**,指向 http://jjb-saas-base),说明可能有前端容器页面。是否需要在此次部署中一并配置,取决于业务需求。
|
||||
若需要勾选,前端路由信息如下:
|
||||
字段
|
||||
填写值
|
||||
路由名称
|
||||
重庆安全评价-前端
|
||||
系统编码
|
||||
jjb-saas-cq-anquan-container
|
||||
Prefix (StripPrefix)
|
||||
0
|
||||
路径 (Path)
|
||||
/cqanquan/container/**
|
||||
标识 (Uri)
|
||||
http://jjb-saas-base
|
||||
4.3 内存资源
|
||||
表单当前填写的 128M 对 Spring Boot + Dubbo + Nacos 客户端组合偏小。建议至少 256M,但具体配额需确认 GBS 平台的资源限制策略。
|
||||
4.4 开放端口:80 还是 8095
|
||||
容器内 Spring Boot 实际监听端口为 8095,但现有所有 K8s Service 的端口都映射为 80。K8s Service 会做端口转发(80 --> 8095)。如果 GBS 平台要求填容器内端口,则填 8095;如果填 Service 端口,则填 80。根据现有环境惯例,填 80 大概率是正确的。
|
||||
5 现有网关路由规律参考
|
||||
以下是从 MySQL 数据库 jjb-saas-gateway 的 route 表中提取的现有后端服务路由规律:
|
||||
字段
|
||||
规律
|
||||
示例
|
||||
systemCode
|
||||
与服务名一致
|
||||
jjb-saas-auth
|
||||
name
|
||||
中文描述
|
||||
权限管理
|
||||
uri
|
||||
http://<K8s服务名>
|
||||
http://jjb-saas-auth
|
||||
path
|
||||
/<路径前缀>/**
|
||||
/auth/**
|
||||
stripPrefix
|
||||
0(绝大多数后端服务)
|
||||
0
|
||||
filterAuthorizeName
|
||||
token(需认证)
|
||||
token
|
||||
route_order
|
||||
0(默认)
|
||||
0
|
||||
6 项目关键配置文件
|
||||
文件路径
|
||||
关键配置
|
||||
application.yml
|
||||
application.name=jjb-saas-cq-anquan, server.port=8095, context-path=/safety-eval
|
||||
application-prod.yml
|
||||
Nacos=prod-nacos:8848, MySQL=prod-mysql:3306
|
||||
nacos/jjb-saas-demo.yml
|
||||
网关路由规则(path、uri、strip-prefix)
|
||||
nacos/config-actuator.yml
|
||||
健康端点 /cqanquan/actuator/health
|
||||
nacos/config-port.yml
|
||||
共享端口配置(port=80)
|
||||
sdk-prod2.yml
|
||||
SDK 路由注册配置
|
||||
7 镜像信息
|
||||
属性
|
||||
值
|
||||
镜像地址
|
||||
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
镜像大小
|
||||
792 MB
|
||||
Digest
|
||||
sha256:44ee933704c3667ad538513c3aa1729ba3493f20e924a5a8b58759f1ec1ba65b
|
||||
基础镜像
|
||||
centos:7
|
||||
JDK
|
||||
Oracle JDK 1.8.0_202
|
||||
容器内 JAR 路径
|
||||
/opt/app.jar
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
# ============================================================
|
||||
# GBS Java Application Dockerfile Template
|
||||
# Based on: CentOS 7 + Oracle JDK 1.8.0_202
|
||||
# Usage: docker build -t <image-name>:<tag> -f Dockerfile .
|
||||
# ============================================================
|
||||
# Build context structure:
|
||||
# .
|
||||
# ├── Dockerfile
|
||||
# ├── jdk1.8.0_202/ (JDK directory, copied from /opt/jdk1.8.0_202)
|
||||
# └── target/
|
||||
# └── *.jar (application JAR file)
|
||||
# ============================================================
|
||||
|
||||
FROM centos:7
|
||||
|
||||
# Set timezone to Asia/Shanghai
|
||||
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
|
||||
|
||||
# Copy JDK
|
||||
COPY jdk1.8.0_202/ /opt/jdk1.8.0_202/
|
||||
|
||||
# Set Java environment variables
|
||||
ENV JAVA_HOME=/opt/jdk1.8.0_202
|
||||
ENV PATH=$PATH:$JAVA_HOME/bin
|
||||
ENV LANG=C.UTF-8
|
||||
|
||||
# Create log directory
|
||||
RUN mkdir -p /opt/logs
|
||||
|
||||
# Copy the built JAR file
|
||||
COPY target/*.jar /opt/app.jar
|
||||
|
||||
# Default entrypoint
|
||||
# Runtime parameters can be overridden via K8s deployment or 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,306 @@
|
|||
## GBS Java 应用 Docker 镜像打包操作流程
|
||||
|
||||
### 目录结构
|
||||
|
||||
```
|
||||
build-tools/
|
||||
├── README.md ← 本文档
|
||||
├── Dockerfile ← Dockerfile 模板(CentOS 7 + JDK 1.8.0_202)
|
||||
├── build.sh ← Shell 构建脚本(在 master 节点上执行)
|
||||
├── build_push.py ← Python 构建脚本(在本地 Windows 上执行,自动上传+构建+推送)
|
||||
└── install_env.sh ← 构建环境一键安装脚本(在 master 节点上执行)
|
||||
```
|
||||
|
||||
### 环境信息
|
||||
|
||||
| 项目 | 信息 |
|
||||
|------|------|
|
||||
| Master 节点 | 192.168.20.100 (root / Zcloud@zcloud100) |
|
||||
| OS | CentOS 7 (已 EOL,yum 源已切换阿里云 vault) |
|
||||
| JDK | Oracle JDK 1.8.0_202,路径 `/opt/jdk1.8.0_202` |
|
||||
| Maven | Apache Maven 3.8.8,路径 `/opt/maven`,阿里云镜像 |
|
||||
| Docker | 26.1.4,cgroupdriver=systemd,storage=overlay2 |
|
||||
| ACR 仓库 | `jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com` |
|
||||
| ACR 命名空间 | `ali_img_ns` |
|
||||
| K8s 命名空间 | `jjb-dragon` |
|
||||
|
||||
### 镜像命名规则
|
||||
|
||||
完整镜像地址格式:
|
||||
|
||||
```
|
||||
{ACR仓库}/{命名空间}/prod-aly-{环境前缀}-dragon-{应用名}:{环境前缀}-{日期}-{序号}
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```
|
||||
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
```
|
||||
|
||||
各部分说明:
|
||||
|
||||
- `prod-aly` — 固定前缀(生产环境-阿里云)
|
||||
- `ota` — 环境前缀,对应不同业务模块
|
||||
- `dragon` — 项目代号
|
||||
- `jjb-saas-safety-eval` — 应用名称
|
||||
- `ota-20260626-1` — 标签:环境前缀-年月日-序号(同一天多次构建递增序号)
|
||||
|
||||
---
|
||||
|
||||
### 方式一:本地一键构建(推荐)
|
||||
|
||||
在本地 Windows 机器上执行 `build_push.py`,自动完成 JAR 上传 → Docker 构建 → ACR 推送。
|
||||
|
||||
**前置条件:** 本地已安装 Python 和 paramiko(`pip install paramiko`)
|
||||
|
||||
**执行命令:**
|
||||
|
||||
```bash
|
||||
python build_push.py <JAR文件路径> <应用名> <环境前缀> [序号]
|
||||
```
|
||||
|
||||
**示例:**
|
||||
|
||||
```bash
|
||||
python build_push.py E:\projects\safety-eval-service\safety-eval-start\target\safety-eval-start-1.0-SNAPSHOT.jar jjb-saas-safety-eval ota 1
|
||||
```
|
||||
|
||||
**输出:**
|
||||
|
||||
```
|
||||
Image Address:
|
||||
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 方式二:在 Master 节点上构建
|
||||
|
||||
SSH 登录 master 节点后,使用 `build.sh` 脚本构建。
|
||||
|
||||
**Step 1 — 上传 JAR 到 master 节点**
|
||||
|
||||
在本地用 scp 或其他方式上传 JAR:
|
||||
|
||||
```bash
|
||||
scp safety-eval-start-1.0-SNAPSHOT.jar root@192.168.20.100:/tmp/
|
||||
```
|
||||
|
||||
**Step 2 — SSH 登录 master**
|
||||
|
||||
```bash
|
||||
ssh root@192.168.20.100
|
||||
# 密码: Zcloud@zcloud100
|
||||
```
|
||||
|
||||
**Step 3 — 执行构建脚本**
|
||||
|
||||
```bash
|
||||
source /etc/profile.d/java.sh
|
||||
source /etc/profile.d/maven.sh
|
||||
/opt/docker-templates/build.sh jjb-saas-safety-eval ota /tmp/safety-eval-start-1.0-SNAPSHOT.jar 1
|
||||
```
|
||||
|
||||
脚本会自动完成:准备构建上下文 → 复制 JDK → Docker build → Docker login ACR → Docker push。
|
||||
|
||||
---
|
||||
|
||||
### 方式三:手动分步操作
|
||||
|
||||
如果需要手动控制每一步:
|
||||
|
||||
**Step 1 — 准备构建目录**
|
||||
|
||||
```bash
|
||||
BUILD_DIR=/tmp/manual-build
|
||||
rm -rf $BUILD_DIR && mkdir -p $BUILD_DIR/target
|
||||
```
|
||||
|
||||
**Step 2 — 复制 JDK 和 JAR**
|
||||
|
||||
```bash
|
||||
cp -r /opt/jdk1.8.0_202 $BUILD_DIR/
|
||||
cp /path/to/your-app.jar $BUILD_DIR/target/
|
||||
cp /opt/docker-templates/Dockerfile $BUILD_DIR/
|
||||
```
|
||||
|
||||
**Step 3 — Docker Build**
|
||||
|
||||
```bash
|
||||
docker build -t jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1 $BUILD_DIR
|
||||
```
|
||||
|
||||
**Step 4 — 登录 ACR**
|
||||
|
||||
```bash
|
||||
echo 'idurCT!rIq9EzISD' | docker login --username=10952138@qq.com --password-stdin jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com
|
||||
```
|
||||
|
||||
**Step 5 — 推送镜像**
|
||||
|
||||
```bash
|
||||
docker push jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
```
|
||||
|
||||
**Step 6 — 清理**
|
||||
|
||||
```bash
|
||||
rm -rf $BUILD_DIR
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 从源码构建(Maven 打包 + Docker 构建)
|
||||
|
||||
如果拿到的是 Java 源码而不是编译好的 JAR:
|
||||
|
||||
```bash
|
||||
source /etc/profile.d/java.sh
|
||||
source /etc/profile.d/maven.sh
|
||||
|
||||
# Maven 编译打包
|
||||
cd /path/to/project
|
||||
mvn clean package -DskipTests
|
||||
|
||||
# 然后用编译好的 JAR 走上面的构建流程
|
||||
/opt/docker-templates/build.sh <app-name> <env-prefix> target/xxx.jar 1
|
||||
```
|
||||
|
||||
Maven 已配置阿里云镜像(`maven.aliyun.com/repository/public`),依赖下载速度约 200-400 KB/s。
|
||||
|
||||
---
|
||||
|
||||
### K8s 部署命令
|
||||
|
||||
**创建新 Deployment:**
|
||||
|
||||
```bash
|
||||
/usr/bin/kubectl create deployment jjb-saas-safety-eval \
|
||||
--image=jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1 \
|
||||
-n jjb-dragon --replicas=1
|
||||
```
|
||||
|
||||
**更新已有 Deployment 的镜像:**
|
||||
|
||||
```bash
|
||||
/usr/bin/kubectl set image deployment/jjb-saas-safety-eval \
|
||||
jjb-saas-safety-eval=jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1 \
|
||||
-n jjb-dragon
|
||||
```
|
||||
|
||||
**查看 Pod 状态:**
|
||||
|
||||
```bash
|
||||
/usr/bin/kubectl get pods -n jjb-dragon | grep safety-eval
|
||||
```
|
||||
|
||||
**查看日志:**
|
||||
|
||||
```bash
|
||||
/usr/bin/kubectl logs -f deployment/jjb-saas-safety-eval -n jjb-dragon
|
||||
```
|
||||
|
||||
**查看 Deployment 详情:**
|
||||
|
||||
```bash
|
||||
/usr/bin/kubectl describe deployment jjb-saas-safety-eval -n jjb-dragon
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 常用查询命令
|
||||
|
||||
**查看本地镜像:**
|
||||
|
||||
```bash
|
||||
docker images | grep jjb-saas-safety-eval
|
||||
```
|
||||
|
||||
**查看镜像详情:**
|
||||
|
||||
```bash
|
||||
docker inspect jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
```
|
||||
|
||||
**查看镜像构建历史:**
|
||||
|
||||
```bash
|
||||
docker history jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
```
|
||||
|
||||
**本地测试运行:**
|
||||
|
||||
```bash
|
||||
docker run --rm -it --name safety-eval-test \
|
||||
-p 8080:8080 \
|
||||
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
```
|
||||
|
||||
**列出 ACR 上所有已有镜像:**
|
||||
|
||||
```bash
|
||||
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'ali_img_ns'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 构建环境安装
|
||||
|
||||
首次使用新机器时,运行 `install_env.sh` 一键安装全部构建依赖:
|
||||
|
||||
```bash
|
||||
ssh root@192.168.20.100
|
||||
bash install_env.sh
|
||||
```
|
||||
|
||||
该脚本会安装并配置:JDK 1.8.0_202、Maven 3.8.8(阿里云镜像)、Dockerfile 模板、yum vault 源、ACR 登录。
|
||||
|
||||
---
|
||||
|
||||
### Dockerfile 结构说明
|
||||
|
||||
镜像内部结构(从已有运行镜像逆向分析得出):
|
||||
|
||||
```
|
||||
/
|
||||
├── opt/
|
||||
│ ├── jdk1.8.0_202/ ← Oracle JDK 1.8.0_202
|
||||
│ ├── app.jar ← 应用 JAR 包
|
||||
│ └── logs/ ← 日志目录
|
||||
```
|
||||
|
||||
容器启动命令(ENTRYPOINT):
|
||||
|
||||
```
|
||||
/opt/jdk1.8.0_202/bin/java
|
||||
-Dnacos.namespace=jjb-dragon
|
||||
-Dnacos.url=prod-nacos:8848
|
||||
-Dspring.profiles.active=prod
|
||||
-Dmysql.password=***
|
||||
-Dmysql.host=192.168.20.100
|
||||
-Dmysql.port=33080
|
||||
-Dmysql.username=root
|
||||
-jar /opt/app.jar
|
||||
```
|
||||
|
||||
运行时可通过 K8s deployment 的 `args` 或 `env` 字段覆盖以上参数。
|
||||
|
||||
---
|
||||
|
||||
### 故障排查
|
||||
|
||||
**问题:`yum install` 报错 404**
|
||||
CentOS 7 已 EOL,确认 `/etc/yum.repos.d/CentOS-Base.repo` 使用 `centos-vault` 源(install_env.sh 会自动处理)。
|
||||
|
||||
**问题:Maven 下载依赖慢**
|
||||
检查 `/root/.m2/settings.xml` 是否配置了阿里云镜像,mirrorOf 应为 `central`。
|
||||
|
||||
**问题:`docker push` 报 unauthorized**
|
||||
重新登录 ACR:`echo 'idurCT!rIq9EzISD' | docker login --username=10952138@qq.com --password-stdin jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com`
|
||||
|
||||
**问题:K8s 拉取镜像失败 (ImagePullBackOff)**
|
||||
确认 `jjb-dragon` namespace 下有 `image-pull-secret` 或 `image-pull-secret1`:
|
||||
```bash
|
||||
/usr/bin/kubectl get secret -n jjb-dragon | grep image-pull
|
||||
```
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# GBS Application Build & Push Script (Shell version)
|
||||
# Run on master node: 192.168.20.100
|
||||
#
|
||||
# Usage:
|
||||
# ./build.sh <app-name> <env-prefix> <jar-file> [version-suffix]
|
||||
#
|
||||
# Example:
|
||||
# ./build.sh jjb-saas-safety-eval ota /tmp/safety-eval.jar 1
|
||||
#
|
||||
# Result image:
|
||||
# jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
# ---- Parameters ----
|
||||
APP_NAME=${1:?"Usage: $0 <app-name> <env-prefix> <jar-file> [version-suffix]"}
|
||||
ENV_PREFIX=${2:?"Usage: $0 <app-name> <env-prefix> <jar-file> [version-suffix]"}
|
||||
JAR_FILE=${3:?"Usage: $0 <app-name> <env-prefix> <jar-file> [version-suffix]"}
|
||||
VERSION_SUFFIX=${4:-1}
|
||||
|
||||
# ---- Constants ----
|
||||
ACR_REGISTRY="jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com"
|
||||
ACR_NAMESPACE="ali_img_ns"
|
||||
ACR_USER="10952138@qq.com"
|
||||
ACR_PASS='idurCT!rIq9EzISD'
|
||||
DATE_TAG=$(date +%Y%m%d)
|
||||
IMAGE_TAG="${ENV_PREFIX}-${DATE_TAG}-${VERSION_SUFFIX}"
|
||||
FULL_IMAGE="${ACR_REGISTRY}/${ACR_NAMESPACE}/prod-aly-${ENV_PREFIX}-dragon-${APP_NAME}:${IMAGE_TAG}"
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
# Source environment
|
||||
source /etc/profile.d/java.sh 2>/dev/null || true
|
||||
source /etc/profile.d/maven.sh 2>/dev/null || true
|
||||
|
||||
echo "=========================================="
|
||||
echo " GBS Docker Build & Push"
|
||||
echo "=========================================="
|
||||
echo "App: ${APP_NAME}"
|
||||
echo "Tag: ${IMAGE_TAG}"
|
||||
echo "JAR: ${JAR_FILE}"
|
||||
echo "Image: ${FULL_IMAGE}"
|
||||
echo "=========================================="
|
||||
|
||||
# ---- Step 1: Verify JAR ----
|
||||
if [ ! -f "${JAR_FILE}" ]; then
|
||||
echo "ERROR: JAR file not found: ${JAR_FILE}"
|
||||
exit 1
|
||||
fi
|
||||
echo "[1/4] JAR verified: $(ls -lh ${JAR_FILE} | awk '{print $5}')"
|
||||
|
||||
# ---- Step 2: Prepare build context ----
|
||||
BUILD_DIR="/tmp/docker-build-${APP_NAME}-$$"
|
||||
echo "[2/4] Preparing build context at ${BUILD_DIR}..."
|
||||
mkdir -p ${BUILD_DIR}/target
|
||||
cp -r /opt/jdk1.8.0_202 ${BUILD_DIR}/
|
||||
cp ${JAR_FILE} ${BUILD_DIR}/target/
|
||||
cp ${SCRIPT_DIR}/Dockerfile ${BUILD_DIR}/
|
||||
echo " Build context size: $(du -sh ${BUILD_DIR} | awk '{print $1}')"
|
||||
|
||||
# ---- Step 3: Docker build ----
|
||||
echo "[3/4] Building Docker image..."
|
||||
docker build -t "${FULL_IMAGE}" "${BUILD_DIR}"
|
||||
echo " Image size: $(docker images --format '{{.Size}}' ${FULL_IMAGE})"
|
||||
|
||||
# ---- Step 4: Push to ACR ----
|
||||
echo "[4/4] Pushing to ACR..."
|
||||
echo "${ACR_PASS}" | docker login --username="${ACR_USER}" --password-stdin "${ACR_REGISTRY}" 2>/dev/null
|
||||
docker push "${FULL_IMAGE}"
|
||||
|
||||
# ---- Cleanup ----
|
||||
rm -rf "${BUILD_DIR}"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " BUILD COMPLETE"
|
||||
echo "=========================================="
|
||||
echo "Image: ${FULL_IMAGE}"
|
||||
echo ""
|
||||
echo "Deploy to K8s:"
|
||||
echo " /usr/bin/kubectl create deployment ${APP_NAME} --image=${FULL_IMAGE} -n jjb-dragon --replicas=1"
|
||||
echo " /usr/bin/kubectl set image deployment/${APP_NAME} ${APP_NAME}=${FULL_IMAGE} -n jjb-dragon"
|
||||
echo "=========================================="
|
||||
|
|
@ -0,0 +1,166 @@
|
|||
"""
|
||||
GBS Application Build & Push Script (Python version)
|
||||
Run from local Windows machine - handles SFTP upload + remote build + push.
|
||||
|
||||
Usage:
|
||||
python build_push.py <jar-file> <app-name> <env-prefix> [version-suffix]
|
||||
|
||||
Example:
|
||||
python build_push.py E:\\projects\\xxx\\target\\app.jar jjb-saas-safety-eval ota 1
|
||||
|
||||
Result image:
|
||||
jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com/ali_img_ns/prod-aly-ota-dragon-jjb-saas-safety-eval:ota-20260626-1
|
||||
"""
|
||||
|
||||
import paramiko
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
from datetime import datetime
|
||||
|
||||
# ---- Configuration ----
|
||||
MASTER = "192.168.20.100"
|
||||
SSH_USER = "root"
|
||||
SSH_PASSWD = "Zcloud@zcloud100"
|
||||
|
||||
ACR_REGISTRY = "jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com"
|
||||
ACR_NAMESPACE = "ali_img_ns"
|
||||
ACR_USER = "10952138@qq.com"
|
||||
ACR_PASS = "idurCT!rIq9EzISD"
|
||||
|
||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
DOCKERFILE_PATH = os.path.join(SCRIPT_DIR, "Dockerfile")
|
||||
|
||||
|
||||
def ssh_exec(client, cmd, timeout=600):
|
||||
"""Execute SSH command and print results."""
|
||||
print(f" > {cmd[:120]}{'...' if len(cmd) > 120 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')[-10:]: # last 10 lines
|
||||
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():
|
||||
if len(sys.argv) < 4:
|
||||
print(__doc__)
|
||||
sys.exit(1)
|
||||
|
||||
jar_local = sys.argv[1]
|
||||
app_name = sys.argv[2]
|
||||
env_prefix = sys.argv[3]
|
||||
version_suffix = sys.argv[4] if len(sys.argv) > 4 else "1"
|
||||
|
||||
date_tag = datetime.now().strftime("%Y%m%d")
|
||||
image_tag = f"{env_prefix}-{date_tag}-{version_suffix}"
|
||||
full_image = f"{ACR_REGISTRY}/{ACR_NAMESPACE}/prod-aly-{env_prefix}-dragon-{app_name}:{image_tag}"
|
||||
|
||||
if not os.path.exists(jar_local):
|
||||
print(f"ERROR: JAR file not found: {jar_local}")
|
||||
sys.exit(1)
|
||||
|
||||
jar_size_mb = os.path.getsize(jar_local) / 1024 / 1024
|
||||
build_dir = f"/tmp/docker-build-{app_name}"
|
||||
jar_name = os.path.basename(jar_local)
|
||||
|
||||
print("=" * 60)
|
||||
print(f" GBS Docker Build & Push (Remote)")
|
||||
print("=" * 60)
|
||||
print(f" JAR: {jar_local} ({jar_size_mb:.1f} MB)")
|
||||
print(f" App: {app_name}")
|
||||
print(f" Tag: {image_tag}")
|
||||
print(f" Image: {full_image}")
|
||||
print(f" Target: {MASTER}")
|
||||
print("=" * 60)
|
||||
|
||||
# ---- Connect ----
|
||||
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/5] SSH connected")
|
||||
|
||||
# ---- Prepare remote dir ----
|
||||
ssh_exec(client, f"rm -rf {build_dir} && mkdir -p {build_dir}/target")
|
||||
|
||||
# ---- Upload JAR ----
|
||||
print(f"\n[2/5] Uploading JAR ({jar_size_mb:.1f} MB)...")
|
||||
sftp = client.open_sftp()
|
||||
remote_jar = f"{build_dir}/target/{jar_name}"
|
||||
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")
|
||||
|
||||
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)")
|
||||
sftp.close()
|
||||
|
||||
# ---- Upload Dockerfile ----
|
||||
ssh_exec(client, f"cat > {build_dir}/Dockerfile", timeout=10)
|
||||
with open(DOCKERFILE_PATH, '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()
|
||||
|
||||
# ---- Copy JDK into context ----
|
||||
print("\n[3/5] Preparing build context...")
|
||||
ssh_exec(client, f"cp -r /opt/jdk1.8.0_202 {build_dir}/", timeout=120)
|
||||
ssh_exec(client, f"du -sh {build_dir}/")
|
||||
|
||||
# ---- Docker build ----
|
||||
print("\n[4/5] Building Docker image...")
|
||||
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[5/5] Pushing to ACR...")
|
||||
ssh_exec(client, f"echo '{ACR_PASS}' | docker login --username={ACR_USER} --password-stdin {ACR_REGISTRY}")
|
||||
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)
|
||||
|
||||
# ---- Verify & Cleanup ----
|
||||
ssh_exec(client, f"docker images | grep '{app_name}'")
|
||||
ssh_exec(client, f"rm -rf {build_dir}")
|
||||
client.close()
|
||||
|
||||
# ---- Summary ----
|
||||
print("\n" + "=" * 60)
|
||||
print(" BUILD COMPLETE")
|
||||
print("=" * 60)
|
||||
print(f"\n Image Address:\n {full_image}\n")
|
||||
print(f" K8s Deploy:\n"
|
||||
f" /usr/bin/kubectl create deployment {app_name} \\\n"
|
||||
f" --image={full_image} -n jjb-dragon --replicas=1\n")
|
||||
print(f" /usr/bin/kubectl set image deployment/{app_name} \\\n"
|
||||
f" {app_name}={full_image} -n jjb-dragon\n")
|
||||
print("=" * 60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -0,0 +1,216 @@
|
|||
#!/bin/bash
|
||||
# ============================================================
|
||||
# GBS Master Node Build Environment Installation Script
|
||||
# Run on: 192.168.20.100 (CentOS 7)
|
||||
#
|
||||
# Installs:
|
||||
# - Oracle JDK 1.8.0_202 (extracted from existing Docker image)
|
||||
# - Apache Maven 3.8.8 (with Alibaba Cloud mirror)
|
||||
# - Dockerfile template
|
||||
# - yum vault mirrors (CentOS 7 EOL fix)
|
||||
# - ACR login
|
||||
#
|
||||
# Usage:
|
||||
# bash install_env.sh
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
echo "=========================================="
|
||||
echo " GBS Build Environment Setup"
|
||||
echo " Host: $(hostname) ($(hostname -I 2>/dev/null || echo 'unknown'))"
|
||||
echo "=========================================="
|
||||
|
||||
# ---- Step 1: Extract JDK from existing Docker image ----
|
||||
echo ""
|
||||
echo "[1/6] Installing JDK 1.8.0_202..."
|
||||
|
||||
if [ -d "/opt/jdk1.8.0_202" ] && [ -x "/opt/jdk1.8.0_202/bin/java" ]; then
|
||||
echo " JDK already installed, skipping."
|
||||
else
|
||||
# Find an image with JDK
|
||||
IMAGE=$(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'ali_img_ns' | head -1)
|
||||
if [ -z "$IMAGE" ]; then
|
||||
echo "ERROR: No suitable Docker image found with JDK!"
|
||||
exit 1
|
||||
fi
|
||||
echo " Extracting JDK from: $IMAGE"
|
||||
docker rm -f jdk-extract-tmp 2>/dev/null || true
|
||||
docker create --name jdk-extract-tmp "$IMAGE" /bin/true > /dev/null
|
||||
docker cp jdk-extract-tmp:/opt/jdk1.8.0_202 /opt/jdk1.8.0_202
|
||||
docker rm jdk-extract-tmp > /dev/null
|
||||
echo " JDK extracted to /opt/jdk1.8.0_202"
|
||||
fi
|
||||
|
||||
# Configure JAVA_HOME
|
||||
cat > /etc/profile.d/java.sh << 'EOF'
|
||||
export JAVA_HOME=/opt/jdk1.8.0_202
|
||||
export PATH=$JAVA_HOME/bin:$PATH
|
||||
EOF
|
||||
chmod +x /etc/profile.d/java.sh
|
||||
source /etc/profile.d/java.sh
|
||||
echo " $(java -version 2>&1 | head -1)"
|
||||
|
||||
# ---- Step 2: Install Maven ----
|
||||
echo ""
|
||||
echo "[2/6] Installing Maven 3.8.8..."
|
||||
|
||||
if [ -x "/opt/maven/bin/mvn" ]; then
|
||||
echo " Maven already installed, skipping."
|
||||
else
|
||||
MAVEN_VERSION="3.8.8"
|
||||
MAVEN_URLS=(
|
||||
"https://mirrors.aliyun.com/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"
|
||||
"https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"
|
||||
)
|
||||
DOWNLOADED=0
|
||||
for url in "${MAVEN_URLS[@]}"; do
|
||||
echo " Trying: $url"
|
||||
if curl -fsSL -o /tmp/maven.tar.gz "$url" --connect-timeout 15 --max-time 300; then
|
||||
DOWNLOADED=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ $DOWNLOADED -eq 0 ]; then
|
||||
echo "ERROR: Could not download Maven!"
|
||||
exit 1
|
||||
fi
|
||||
mkdir -p /opt/maven
|
||||
tar -xzf /tmp/maven.tar.gz -C /opt/maven --strip-components=1
|
||||
rm -f /tmp/maven.tar.gz
|
||||
fi
|
||||
|
||||
# Configure Maven environment
|
||||
cat > /etc/profile.d/maven.sh << 'EOF'
|
||||
export MAVEN_HOME=/opt/maven
|
||||
export PATH=$MAVEN_HOME/bin:$PATH
|
||||
EOF
|
||||
chmod +x /etc/profile.d/maven.sh
|
||||
source /etc/profile.d/maven.sh
|
||||
|
||||
# Configure Alibaba Maven mirror
|
||||
mkdir -p /root/.m2
|
||||
cat > /root/.m2/settings.xml << 'XMLEOF'
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
|
||||
<localRepository>/root/.m2/repository</localRepository>
|
||||
<mirrors>
|
||||
<mirror>
|
||||
<id>aliyunmaven</id>
|
||||
<name>Alibaba Cloud Maven Mirror</name>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
<mirrorOf>central</mirrorOf>
|
||||
</mirror>
|
||||
</mirrors>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>alibaba-repos</id>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>aliyun-public</id>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
<releases><enabled>true</enabled></releases>
|
||||
<snapshots><enabled>true</enabled></snapshots>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>aliyun-spring</id>
|
||||
<url>https://maven.aliyun.com/repository/spring</url>
|
||||
<releases><enabled>true</enabled></releases>
|
||||
<snapshots><enabled>true</enabled></snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>aliyun-plugin</id>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
<releases><enabled>true</enabled></releases>
|
||||
<snapshots><enabled>true</enabled></snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</profile>
|
||||
</profiles>
|
||||
<activeProfiles>
|
||||
<activeProfile>alibaba-repos</activeProfile>
|
||||
</activeProfiles>
|
||||
</settings>
|
||||
XMLEOF
|
||||
cp /root/.m2/settings.xml /opt/maven/conf/settings.xml
|
||||
echo " Maven $(mvn -version 2>&1 | head -1)"
|
||||
|
||||
# ---- Step 3: Fix yum repos (CentOS 7 EOL) ----
|
||||
echo ""
|
||||
echo "[3/6] Configuring yum vault mirrors..."
|
||||
|
||||
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak.$(date +%Y%m%d) 2>/dev/null || true
|
||||
cat > /etc/yum.repos.d/CentOS-Base.repo << 'YUMEOF'
|
||||
[base]
|
||||
name=CentOS-7 - Base - vault.aliyun.com
|
||||
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/
|
||||
gpgcheck=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||
enabled=1
|
||||
|
||||
[updates]
|
||||
name=CentOS-7 - Updates - vault.aliyun.com
|
||||
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/x86_64/
|
||||
gpgcheck=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||
enabled=1
|
||||
|
||||
[extras]
|
||||
name=CentOS-7 - Extras - vault.aliyun.com
|
||||
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/x86_64/
|
||||
gpgcheck=1
|
||||
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
|
||||
enabled=1
|
||||
YUMEOF
|
||||
yum clean all > /dev/null 2>&1
|
||||
yum makecache fast > /dev/null 2>&1
|
||||
echo " yum repos configured (aliyun centos-vault)"
|
||||
|
||||
# ---- Step 4: Verify Docker ----
|
||||
echo ""
|
||||
echo "[4/6] Verifying Docker..."
|
||||
echo " Docker $(docker --version)"
|
||||
|
||||
# ---- Step 5: Login to ACR ----
|
||||
echo ""
|
||||
echo "[5/6] Logging in to ACR..."
|
||||
echo 'idurCT!rIq9EzISD' | docker login --username=10952138@qq.com --password-stdin jjb-registry-registry.cn-hangzhou.cr.aliyuncs.com 2>&1 | grep -v WARNING
|
||||
|
||||
# ---- Step 6: Install Dockerfile template ----
|
||||
echo ""
|
||||
echo "[6/6] Installing Dockerfile template..."
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
mkdir -p /opt/docker-templates
|
||||
if [ -f "${SCRIPT_DIR}/Dockerfile" ]; then
|
||||
cp "${SCRIPT_DIR}/Dockerfile" /opt/docker-templates/
|
||||
echo " Dockerfile copied to /opt/docker-templates/"
|
||||
fi
|
||||
if [ -f "${SCRIPT_DIR}/build.sh" ]; then
|
||||
cp "${SCRIPT_DIR}/build.sh" /opt/docker-templates/
|
||||
chmod +x /opt/docker-templates/build.sh
|
||||
echo " build.sh copied to /opt/docker-templates/"
|
||||
fi
|
||||
|
||||
# ---- Summary ----
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " INSTALLATION COMPLETE"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo " Java: $(/opt/jdk1.8.0_202/bin/java -version 2>&1 | head -1)"
|
||||
echo " Maven: $(/opt/maven/bin/mvn -version 2>&1 | head -1)"
|
||||
echo " Docker: $(docker --version)"
|
||||
echo ""
|
||||
echo " JAVA_HOME=/opt/jdk1.8.0_202"
|
||||
echo " MAVEN_HOME=/opt/maven"
|
||||
echo " Dockerfile: /opt/docker-templates/Dockerfile"
|
||||
echo " Build script: /opt/docker-templates/build.sh"
|
||||
echo ""
|
||||
echo " NOTE: Run 'source /etc/profile.d/java.sh' and"
|
||||
echo " 'source /etc/profile.d/maven.sh' or re-login"
|
||||
echo " to use java/mvn commands."
|
||||
echo "=========================================="
|
||||
|
|
@ -0,0 +1 @@
|
|||
Administrator | ||||