提交 1662376a authored 作者: 陈泽健's avatar 陈泽健

feat(deploy): 添加架构选择和网盘部署功能

- 支持通过--arch参数指定部署架构(x86, arm, arm_ubuntu)
- 新增从网盘上传部署包到目标服务器的功能
- 添加ARM服务器EMQX镜像拉取和导出脚本
- 添加Docker Registry API直接拉取ARM64镜像功能
- 更新部署报告显示目标架构信息
- 修改路径映射逻辑适配服务更新流程
上级 4e1b2b9d
......@@ -11,6 +11,8 @@ X86 + ARM 双架构统一自动化部署脚本
python full_deploy.py --verify # 仅验证阶段(API接口+日志检查)
python full_deploy.py --security # 仅安全修复(Nacos+MQTT)
python full_deploy.py --package # 仅打包输出(压缩+MD5+下载)
python full_deploy.py --arch arm,arm_ubuntu --deploy # 仅部署指定架构(arm=75,arm_ubuntu=76)
可选架构: x86, arm, arm_ubuntu
"""
import sys
......@@ -46,6 +48,7 @@ CONFIGS = {
'deploy_dir': '/data/offline_auto_unifiedPlatform',
'deploy_pkg': 'offline_auto_unifiedPlatform.tar.gz',
'deploy_md5': 'offline_auto_unifiedPlatform.tar.gz.md5',
'nas_dir': r'Z:\发布版本\03服务器部署\15新统一平台\X86部署包\全量版\版本更新-待验证',
'deploy_script': 'new_auto.sh',
'deploy_answers': "y\ny\ny\ny\ny\ny\ny\nn\n",
'deploy_log': '/data/offline_auto_unifiedPlatform/deploy_output.log',
......@@ -90,8 +93,10 @@ CONFIGS = {
}
}
# 所有架构列表
ALL_ARCHS = ['x86', 'arm', 'arm_ubuntu']
# 所有架构列表(默认值,可通过--arch参数覆盖)
DEFAULT_ARCHS = ['x86', 'arm', 'arm_ubuntu']
# 当前执行的架构列表
ACTIVE_ARCHS = DEFAULT_ARCHS
# 超管配置
ADMIN_USER = 'superadmin'
......@@ -245,6 +250,45 @@ def phase_deploy_single(arch):
results['steps']['disk'] = False
results['errors'].append("/data 分区不存在")
# 步骤1.5:从网盘上传部署包到目标服务器
nas_dir = cfg.get('nas_dir')
if nas_dir:
logger.log("【步骤1.5】从网盘上传部署包到目标服务器")
import shutil
local_tar = os.path.join(nas_dir, cfg['deploy_pkg'])
local_md5 = os.path.join(nas_dir, cfg['deploy_md5'])
if os.path.exists(local_tar) and os.path.exists(local_md5):
pkg_size = os.path.getsize(local_tar)
logger.log(f"网盘部署包: {cfg['deploy_pkg']} ({pkg_size/1024/1024/1024:.2f} GB)")
# 清理目标服务器上的旧部署包目录
logger.log("清理目标服务器上的旧部署目录...")
run(f"rm -rf {cfg['deploy_dir']}")
run(f"rm -f /data/{cfg['deploy_pkg']} /data/{cfg['deploy_md5']}")
# SFTP上传
try:
sftp = ssh.open_sftp()
logger.log(f"正在上传 {cfg['deploy_pkg']}...")
sftp.put(local_tar, f"/data/{cfg['deploy_pkg']}")
logger.log("tar.gz 上传完成")
logger.log(f"正在上传 {cfg['deploy_md5']}...")
sftp.put(local_md5, f"/data/{cfg['deploy_md5']}")
logger.log("md5 上传完成")
sftp.close()
except Exception as e:
logger.log(f"上传部署包失败: {e}", "ERROR")
results['errors'].append(f"上传部署包失败: {e}")
results['steps']['upload'] = False
return results
results['steps']['upload'] = True
logger.log("[OK] 部署包上传完成")
else:
logger.log(f"网盘中未找到部署包: {nas_dir}", "WARN")
logger.log("将检查目标服务器上是否已有部署包", "WARN")
# 步骤2:部署包校验(兼容_new后缀)
logger.log("【步骤2】部署包校验")
pkg = cfg['deploy_pkg']
......@@ -482,7 +526,7 @@ def phase_deploy():
with ThreadPoolExecutor(max_workers=3) as pool:
futures = {
pool.submit(phase_deploy_single, arch): arch
for arch in ALL_ARCHS
for arch in ACTIVE_ARCHS
}
for future in as_completed(futures):
arch = futures[future]
......@@ -504,7 +548,7 @@ def phase_verify(deploy_results=None):
results = {}
for arch in ALL_ARCHS:
for arch in ACTIVE_ARCHS:
cfg = CONFIGS[arch]
logger = Logger(f"{arch}_verify")
r = {'api': {}, 'logs': {}, 'errors': []}
......@@ -590,7 +634,7 @@ def phase_security():
results = {}
for arch in ALL_ARCHS:
for arch in ACTIVE_ARCHS:
cfg = CONFIGS[arch]
logger = Logger(f"{arch}_security")
r = {'nacos': {}, 'emqx': {}, 'errors': []}
......@@ -768,7 +812,7 @@ def phase_package():
results = {}
for arch in ALL_ARCHS:
for arch in ACTIVE_ARCHS:
cfg = CONFIGS[arch]
logger = Logger(f"{arch}_package")
r = {'files': {}, 'errors': []}
......@@ -904,7 +948,7 @@ def generate_reports(deploy_results, verify_results, security_results, package_r
## 一、部署执行
"""
for arch in ALL_ARCHS:
for arch in ACTIVE_ARCHS:
cfg = CONFIGS[arch]
dr = deploy_results.get(arch, {})
report += f"### {cfg['label']}\n\n"
......@@ -939,7 +983,7 @@ def generate_reports(deploy_results, verify_results, security_results, package_r
# 验证结果
report += "## 二、服务验证\n\n"
for arch in ALL_ARCHS:
for arch in ACTIVE_ARCHS:
cfg = CONFIGS[arch]
vr = verify_results.get(arch, {})
report += f"### {cfg['label']}\n\n"
......@@ -970,7 +1014,7 @@ def generate_reports(deploy_results, verify_results, security_results, package_r
report += f"- **部署执行**: {'全部通过' if all_deploy_ok else '存在问题'}\n"
report += f"- **API验证**: {'全部通过' if all_api_ok else '存在问题'}\n"
deploy_time_parts = []
for arch in ALL_ARCHS:
for arch in ACTIVE_ARCHS:
dt = deploy_results.get(arch, {}).get('deploy_time', 'N/A')
deploy_time_parts.append(f"{CONFIGS[arch]['label']} {dt}min")
report += f"- **部署用时**: {', '.join(deploy_time_parts)}\n"
......@@ -993,7 +1037,7 @@ def generate_reports(deploy_results, verify_results, security_results, package_r
## 一、漏洞扫描与修复
"""
for arch in ALL_ARCHS:
for arch in ACTIVE_ARCHS:
cfg = CONFIGS[arch]
sr = security_results.get(arch, {})
sec_report += f"### {cfg['label']}\n\n"
......@@ -1048,19 +1092,42 @@ def generate_reports(deploy_results, verify_results, security_results, package_r
# ==================== 主流程 ====================
def main():
global ACTIVE_ARCHS
mode = 'full'
if len(sys.argv) > 1:
arg = sys.argv[1].lower()
if arg in ('--deploy', '--verify', '--security', '--package'):
mode = arg[2:] # 去掉 --
arch_args = None
# 解析命令行参数
args = sys.argv[1:]
i = 0
while i < len(args):
arg = args[i].lower()
if arg == '--arch' and i + 1 < len(args):
arch_args = args[i + 1].split(',')
i += 2
elif arg in ('--deploy', '--verify', '--security', '--package'):
mode = arg[2:]
i += 1
elif arg == '--full':
mode = 'full'
i += 1
else:
print(f"用法: python {sys.argv[0]} [--deploy|--verify|--security|--package|--full]")
print(f"用法: python {sys.argv[0]} [--arch arm,arm_ubuntu] [--deploy|--verify|--security|--package|--full]")
print(f"可选架构: x86, arm, arm_ubuntu")
return 1
# 设置目标架构
if arch_args:
invalid = [a for a in arch_args if a not in CONFIGS]
if invalid:
print(f"[ERROR] 无效的架构: {invalid},可选: {list(CONFIGS.keys())}")
return 1
ACTIVE_ARCHS = arch_args
server_count = len(ACTIVE_ARCHS)
labels = ', '.join(CONFIGS[a]['label'] for a in ACTIVE_ARCHS)
print("=" * 60)
print(f"3台服务器统一自动化部署 - 模式: {mode}")
print(f"{server_count}台服务器自动化部署 - 模式: {mode}")
print(f"目标: {labels}")
print(f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
......@@ -1077,7 +1144,7 @@ def main():
print("\n" + "=" * 60)
print("部署完成 - 容器状态摘要")
print("=" * 60)
for arch in ALL_ARCHS:
for arch in ACTIVE_ARCHS:
dr = deploy_results.get(arch, {})
count = dr.get('container_count', 0)
errors = dr.get('errors', [])
......@@ -1094,12 +1161,13 @@ def main():
print("部署阶段完成!请执行授权操作:")
print("使用 Chrome DevTools 进行浏览器自动化授权上传")
print("=" * 60)
print(f"\nX86-欧拉: https://192.168.5.52/#/LoginConfig")
print(f"ARM-欧拉: https://192.168.9.75/#/LoginConfig")
print(f"ARM-Ubuntu: https://192.168.9.76/#/LoginConfig")
for arch in ACTIVE_ARCHS:
cfg = CONFIGS[arch]
print(f"\n{cfg['label']}: https://{cfg['host']}/#/LoginConfig")
print(f"超管: {ADMIN_USER} / {ADMIN_PASS}")
print(f"验证码: {CAPTCHA}")
print(f"\n授权完成后运行: python full_deploy.py --verify")
arch_list = ','.join(ACTIVE_ARCHS)
print(f"\n授权完成后运行: python full_deploy.py --arch {arch_list} --verify")
return 0
if mode in ('full', 'verify'):
......
此差异已折叠。
# X86自动更新部署包版本报告
## 基本信息
- 执行时间:2026-06-03 22:32:22
- 结束时间:2026-06-03 23:15:56
- 总耗时:43分33秒
- 执行状态:**成功**
## 操作步骤记录
| 序号 | 步骤名称 | 时间 | 状态 | 详情 |
|------|---------|------|------|------|
| 3 | 测试服务器打包 | 2026-06-03 22:55:01 | ✅ 成功 | 服务包大小: 5.69 GB |
| 4 | 解压服务包 | 2026-06-03 22:56:54 | ✅ 成功 | |
| 5 | 服务更新替换 | 2026-06-03 22:57:59 | ✅ 成功 | 共更新 23 个服务 |
| 7 | 重新打包 | 2026-06-03 23:09:59 | ✅ 成功 | 文件: /data/offline_auto_unifiedPlatform.tar.gz, 大小: 8.75 GB, MD5: 6b0b127b3ebcf574d312f77a1ecfc984 |
| 8 | 拷贝到网盘 | 2026-06-03 23:15:54 | ✅ 成功 | |
| 9 | 清理临时文件 | 2026-06-03 23:15:56 | ✅ 成功 | |
## 服务更新详情
| 服务名称 | 类型 | 更新前大小 | 更新后大小 | 状态 |
|---------|------|-----------|-----------|------|
| ai包 | 前端 | 0 B | 4.0 KB | ✅ 成功 |
| 后台包 | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| main包 | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| meetngV2包 | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| meetngV3包 | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| meetingControl包 | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| monitor包 | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| platform包 | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| voice包 | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| h5-meeting | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| h5-moniter | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| h5-platform-mobile | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| h5-platform-platform-mobile | 前端 | 4.0 KB | 4.0 KB | ✅ 成功 |
| auth包 | 后端jar | 134.6 MB | 125.9 MB | ✅ 成功 |
| gatway包 | 后端jar | 225.5 MB | 127.9 MB | ✅ 成功 |
| system包 | 后端jar | 142.9 MB | 142.9 MB | ✅ 成功 |
| java2.0包 | 后端jar | 343.9 MB | 344.5 MB | ✅ 成功 |
| java-extapi包 | 后端jar | 337.8 MB | 337.9 MB | ✅ 成功 |
| java-scheduling包 | 后端jar | 225.0 MB | 225.0 MB | ✅ 成功 |
| java-mqtt包 | 后端jar | 307.7 MB | 307.7 MB | ✅ 成功 |
| java-quartz包 | 后端jar | 316.6 MB | 316.6 MB | ✅ 成功 |
| cmdb包 | 后端文件夹 | 4.0 KB | 4.0 KB | ✅ 成功 |
| voice包 | 后端文件夹 | 4.0 KB | 4.0 KB | ✅ 成功 |
## 最终产物
- 压缩包:`offline_auto_unifiedPlatform.tar.gz`
- MD5文件:`offline_auto_unifiedPlatform.tar.gz.md5`
- 网盘路径:`Z:\发布版本\03服务器部署\15新统一平台\X86部署包\全量版\版本更新-待验证`
......@@ -581,8 +581,8 @@ class X86PackageUpdate:
if self.path_mapping:
self.log("执行路径映射重命名...")
for test_path, build_path in self.path_mapping.items():
old_dir = f"{extract_dir}/services/{test_path}"
new_dir = f"{extract_dir}/services/{build_path}"
old_dir = f"{extract_dir}/{test_path}"
new_dir = f"{extract_dir}/{build_path}"
exit_code, out, err = self._exec_build_cmd(
f'if [ -d "{old_dir}" ]; then '
f'mv "{old_dir}" "{new_dir}" && echo "RENAMED"; fi'
......@@ -611,7 +611,7 @@ class X86PackageUpdate:
self.log("=" * 50)
services_base = '/data/offline_auto_unifiedPlatform/data/services'
update_base = '/data/services_update/services'
update_base = '/data/services_update'
all_success = True
# ---------- 更新前端服务 ----------
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论