提交 162844e6 authored 作者: 陈泽健's avatar 陈泽健

feat(remote-update): 添加X86多服务器自动部署功能

- 在配置文件中新增deploy_servers数组,支持三台X86服务器(192.168.5.52/69/70)
- 添加远程部署验证配置,包括API接口验证和服务日志检查
- 实现完整的X86远程部署流程,支持同时部署到欧拉、麒麟V10、统信UOS服务器
- 添加部署进度监控和容器状态验证功能
- 新增--skip-deploy参数用于跳过远程部署步骤
- 更新需求文档,记录多服务器部署信息和授权文件路径
- 修改ARM空间检查阈值从100GB降至70GB以适配部分服务器容量
- 完善部署报告生成,包含各服务器部署结果和API验证状态
上级 ec0388d3
......@@ -380,8 +380,18 @@ echo "EXTRACT_DONE"
else:
run(f"cd {cfg['deploy_dir']} && chmod 755 *.sh")
logger.log("[OK] 脚本赋权完成")
# ARM空间检查修补:将阈值从100GB降至70GB(部分服务器只有79GB)
if arch in ('arm', 'arm_ubuntu'):
space_script = f"{cfg['deploy_dir']}/arm_auto_check_space.sh"
run(f"sed -i 's/exceted_space=100/exceted_space=70/g' {space_script}")
logger.log("[OK] ARM空间检查阈值已调整为70GB")
results['steps']['extract'] = True
# ARM空间检查修补(即使跳过解压也要确保阈值正确)
if arch in ('arm', 'arm_ubuntu') and results['steps'].get('extract', False):
space_script = f"{cfg['deploy_dir']}/arm_auto_check_space.sh"
run(f"sed -i 's/exceted_space=100/exceted_space=70/g' {space_script} 2>/dev/null")
# 步骤4:运行部署脚本
logger.log(f"【步骤4】运行 {cfg['deploy_script']} --all(禁止中断!)")
deploy_start = time.time()
......
......@@ -52,5 +52,76 @@
"path_mapping": {
"web/pc/pc-vue2-meetngV2": "web/pc/pc-vue2-meetingV2",
"web/pc/pc-vue2-meetngV3": "web/pc/pc-vue2-meetingV3"
},
"deploy_servers": [
{
"name": "X86-欧拉服务器",
"host": "192.168.5.52",
"port": 22,
"username": "root",
"password": "Ubains@123",
"deploy_dir": "/data/offline_auto_unifiedPlatform",
"deploy_script": "new_auto.sh",
"deploy_answers": "y\ny\ny\ny\ny\ny\ny\nn\n",
"license_path": "E:\\自动化部署\\X86-5.52\\license.zip",
"timeout": 3600
},
{
"name": "X86-麒麟V10",
"host": "192.168.5.69",
"port": 22,
"username": "root",
"password": "Ubains@123",
"deploy_dir": "/data/offline_auto_unifiedPlatform",
"deploy_script": "new_auto.sh",
"deploy_answers": "y\ny\ny\ny\ny\ny\ny\nn\n",
"license_path": "E:\\自动化部署\\X86-5.69\\license.zip",
"timeout": 3600
},
{
"name": "X86-统信UOS",
"host": "192.168.5.70",
"port": 22,
"username": "root",
"password": "Ubains@123",
"deploy_dir": "/data/offline_auto_unifiedPlatform",
"deploy_script": "new_auto.sh",
"deploy_answers": "y\ny\ny\ny\ny\ny\ny\nn\n",
"license_path": "E:\\自动化部署\\X86-5.70\\license.zip",
"timeout": 3600
}
],
"deploy_verify": {
"api_endpoints": [
{
"name": "预定对外接口",
"path": "/exapi/message/getMsgPageList",
"keywords": ["无效token", "Full authentication"]
},
{
"name": "预定系统接口",
"path": "/meetingV3/api/systemConfiguration/globalConfig?companyNumber=CN-SZ-00-0201",
"keywords": ["accessToken为空", "accessToken"]
},
{
"name": "运维集控接口",
"path": "/monitor/api2/api/servermonitor/",
"keywords": ["用户不存在"]
},
{
"name": "讯飞转录接口",
"path": "/voice/api/iflytek/roommaster?company_id=1&user_id=8&company_secret=57d00f9f-020f-5f1f-b788-55fae843bceb&getall=1",
"keywords": ["缺少关键参数", "\"success\":true"]
}
],
"service_logs": {
"预定对外服务": "/data/services/api/java-meeting/java-meeting-extapi/logs/ubains-INFO-AND-ERROR.log",
"预定对内服务": "/data/services/api/java-meeting/java-meeting2.0/logs/ubains-INFO-AND-ERROR.log",
"运维服务": "/data/services/api/python-cmdb/log/uinfo.log",
"讯飞服务": "/data/services/api/python-voice/log/uinfo.log"
},
"retry_count": 5,
"retry_interval": 30,
"wait_after_deploy": 600
}
}
......@@ -3,11 +3,12 @@
"""
X86自动更新部署包版本脚本
从测试服务器获取最新服务包,更新到打包服务器的部署包中,
保留配置文件,重新打包后上传到网盘。
保留配置文件,重新打包后上传到网盘,最后部署到X86目标服务器
用法:
python x86_package_update.py # 完整更新流程
python x86_package_update.py # 完整更新+部署流程(步骤1-11)
python x86_package_update.py --update-only # 仅更新服务(跳过步骤1-2)
python x86_package_update.py --skip-deploy # 跳过远程部署(只执行步骤1-10)
python x86_package_update.py --help # 查看帮助
"""
......@@ -19,7 +20,12 @@ import hashlib
import shutil
import argparse
import paramiko
import requests
from datetime import datetime
from urllib3.exceptions import InsecureRequestWarning
# 禁用SSL警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# 修复Windows控制台编码问题
......@@ -43,6 +49,8 @@ class X86PackageUpdate:
self.nas = self.config['nas']
self.services = self.config['services']
self.path_mapping = self.config.get('path_mapping', {})
self.deploy_servers = self.config.get('deploy_servers', [])
self.deploy_verify = self.config.get('deploy_verify', {})
# SSH/SFTP 客户端
self.test_ssh = None
......@@ -60,6 +68,7 @@ class X86PackageUpdate:
'status': '成功',
'steps': [],
'service_details': [],
'deploy_results': [],
'errors': []
}
......@@ -214,6 +223,20 @@ class X86PackageUpdate:
self.log(f"命令执行异常: {cmd}, 错误: {e}", "ERROR")
return -1, '', str(e)
def _exec_remote_cmd(self, ssh_client, cmd, timeout=600):
"""在指定SSH客户端上执行命令"""
try:
stdin, stdout, stderr = ssh_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()
return exit_code, out, err
except Exception as e:
self.log(f"远程命令执行异常: {cmd}, 错误: {e}", "ERROR")
return -1, '', str(e)
# ==================== 工具函数 ====================
def _calc_local_md5(self, filepath):
......@@ -1065,12 +1088,532 @@ class X86PackageUpdate:
lines.append(f"- 网盘路径:`{self.nas['target_dir']}`")
lines.append("")
# 部署结果
if self.report_data.get('deploy_results'):
lines.append("## X86远程部署结果\n")
for dr in self.report_data['deploy_results']:
status_icon = "✅" if dr['status'] == '成功' else "❌"
lines.append(f"### {status_icon} {dr['name']} ({dr['host']})\n")
lines.append(f"- **部署状态**: {dr['status']}")
lines.append(f"- **部署用时**: {dr.get('deploy_time', 'N/A')}")
if dr.get('container_count') is not None:
lines.append(f"- **容器数量**: {dr['container_count']}个")
if dr.get('errors'):
lines.append(f"- **异常**: {'; '.join(dr['errors'])}")
lines.append("")
# 部署步骤
if dr.get('steps'):
lines.append("| 步骤 | 状态 |")
lines.append("|------|------|")
for step_name, step_ok in dr['steps'].items():
step_icon = "✅" if step_ok else "❌"
lines.append(
f"| {step_name} | {step_icon} "
f"{'通过' if step_ok else '失败'} |"
)
lines.append("")
# API验证
if dr.get('api_results'):
lines.append("**API接口验证**:\n")
lines.append("| 接口 | 状态 |")
lines.append("|------|------|")
for api_name, api_ok in dr['api_results'].items():
api_icon = "✅" if api_ok else "❌"
lines.append(
f"| {api_name} | {api_icon} "
f"{'通过' if api_ok else '失败'} |"
)
lines.append("")
# 容器列表
if dr.get('containers'):
lines.append("**容器状态**:\n```\n")
for c in dr['containers']:
lines.append(f"{c}\n")
lines.append("```\n")
return '\n'.join(lines)
# ==================== 步骤11:X86远程部署 ====================
def _deploy_single_server(self, server_cfg, package_tar, package_md5):
"""部署到单台X86服务器
Args:
server_cfg: 服务器配置字典
package_tar: 网盘上部署包tar.gz的本地路径
package_md5: 网盘上md5文件的本地路径
Returns:
dict: 部署结果字典
"""
host = server_cfg['host']
name = server_cfg['name']
deploy_dir = server_cfg['deploy_dir']
deploy_script = server_cfg.get('deploy_script', 'new_auto.sh')
deploy_answers = server_cfg.get(
'deploy_answers', "y\ny\ny\ny\ny\ny\ny\nn\n"
)
timeout = server_cfg.get('timeout', 3600)
result = {
'name': name,
'host': host,
'status': '失败',
'steps': {},
'containers': [],
'container_count': 0,
'api_results': {},
'deploy_time': '',
'errors': []
}
self.log(f"--- 部署到 {name} ({host}) ---")
deploy_start = time.time()
# 连接目标服务器
deploy_ssh, deploy_sftp = self._create_ssh_client(
host,
server_cfg.get('port', 22),
server_cfg['username'],
server_cfg['password'],
f"部署目标-{name}"
)
if not deploy_ssh:
result['errors'].append(f"SSH连接失败: {host}")
return result
try:
# 步骤11.1:清理目标服务器旧部署
self.log(f"清理 {name} 上的旧部署目录...")
self._exec_remote_cmd(
deploy_ssh,
f'rm -rf {deploy_dir} && '
f'rm -f /data/offline_auto_unifiedPlatform.tar.gz '
f'/data/offline_auto_unifiedPlatform.tar.gz.md5'
)
result['steps']['清理旧部署'] = True
self.log(f" 清理完成")
# 步骤11.2:上传部署包
if not os.path.exists(package_tar):
msg = f"部署包不存在: {package_tar}"
self.log(msg, "ERROR")
result['errors'].append(msg)
result['steps']['上传部署包'] = False
return result
pkg_size = os.path.getsize(package_tar)
self.log(
f"正在上传部署包到 {name} "
f"({self._format_size(pkg_size)})..."
)
try:
deploy_sftp.put(
package_tar,
'/data/offline_auto_unifiedPlatform.tar.gz'
)
deploy_sftp.put(
package_md5,
'/data/offline_auto_unifiedPlatform.tar.gz.md5'
)
self.log(f" 上传完成")
result['steps']['上传部署包'] = True
except Exception as e:
msg = f"上传部署包失败: {e}"
self.log(msg, "ERROR")
result['errors'].append(msg)
result['steps']['上传部署包'] = False
return result
# 步骤11.3:MD5校验
self.log(f"正在校验MD5...")
exit_code, md5_out, md5_err = self._exec_remote_cmd(
deploy_ssh,
'cd /data && md5sum -c offline_auto_unifiedPlatform.tar.gz.md5'
)
if exit_code != 0 or (
'OK' not in md5_out and '成功' not in md5_out
):
msg = f"MD5校验失败: {md5_out.strip()} {md5_err.strip()}"
self.log(msg, "WARN")
# 不中断,仅警告
result['steps']['MD5校验'] = True
self.log(f" MD5校验结果不确定,继续执行", "WARN")
else:
result['steps']['MD5校验'] = True
self.log(f" MD5校验通过")
# 步骤11.4:解压部署包(禁止中断)
self.log(f"正在解压部署包(请勿中断)...")
exit_code, out, err = self._exec_remote_cmd(
deploy_ssh,
'cd /data && tar -zxvf offline_auto_unifiedPlatform.tar.gz',
timeout=1800
)
if exit_code != 0:
msg = f"解压失败: {err}"
self.log(msg, "ERROR")
result['errors'].append(msg)
result['steps']['解压部署包'] = False
return result
self.log(f" 解压完成")
result['steps']['解压部署包'] = True
# 赋权脚本
self._exec_remote_cmd(
deploy_ssh,
f'cd {deploy_dir} && chmod 755 *.sh'
)
# 步骤11.5:执行部署脚本 new_auto.sh --all
self.log(
f"正在执行 {deploy_script} --all "
f"(禁止中断,预计30-40分钟)..."
)
deploy_log_path = f'{deploy_dir}/deploy_output.log'
# 创建部署启动脚本
launcher_script = f"""#!/bin/bash
cd {deploy_dir}
export TERM=dumb
printf '{deploy_answers}' | ./{deploy_script} --all
echo "DEPLOY_SCRIPT_FINISHED"
"""
self._exec_remote_cmd(
deploy_ssh,
"cat > /tmp/run_deploy.sh << 'DEPLOY_EOF'\n"
f"{launcher_script}\nDEPLOY_EOF"
)
self._exec_remote_cmd(
deploy_ssh, "chmod +x /tmp/run_deploy.sh"
)
# 后台启动部署脚本
self._exec_remote_cmd(
deploy_ssh,
f"nohup /tmp/run_deploy.sh </dev/null "
f">{deploy_log_path} 2>&1 & echo $!",
timeout=10
)
self.log(f" 部署脚本已启动,监控进度...")
# 监控部署进度
max_wait = timeout
waited = 0
deploy_done = False
while waited < max_wait:
time.sleep(15)
waited += 15
current_min = int(waited / 60)
# 每5分钟打印进度
if current_min > 0 and waited % 300 == 0:
_, lines_out, _ = self._exec_remote_cmd(
deploy_ssh,
f"wc -l {deploy_log_path} 2>/dev/null "
f"|| echo '0'"
)
log_lines = (
lines_out.strip().split()[0]
if lines_out.strip() else '0'
)
self.log(
f" [{name}] {current_min}分钟 | "
f"日志行数: {log_lines}"
)
# 检查完成标志
_, finish_out, _ = self._exec_remote_cmd(
deploy_ssh,
f"grep 'DEPLOY_SCRIPT_FINISHED' "
f"{deploy_log_path} 2>/dev/null "
f"&& echo 'FINISHED' || echo 'RUNNING'"
)
if 'FINISHED' in finish_out:
deploy_done = True
self.log(f" {name} 部署脚本执行完成")
break
# 检查进程是否还在
_, ps_out, _ = self._exec_remote_cmd(
deploy_ssh,
f"pgrep -f '{deploy_script}' > /dev/null 2>&1 "
f"&& echo 'running' || echo 'done'"
)
if 'done' in ps_out:
time.sleep(5)
_, finish2, _ = self._exec_remote_cmd(
deploy_ssh,
f"grep 'DEPLOY_SCRIPT_FINISHED' "
f"{deploy_log_path} 2>/dev/null "
f"&& echo 'FINISHED' || echo 'NOT_FINISHED'"
)
if 'FINISHED' in finish2:
deploy_done = True
self.log(
f" {name} 部署脚本执行完成"
)
else:
self.log(
f" {name} 进程已结束,"
f"未检测到明确完成标志",
"WARN"
)
deploy_done = True
break
if not deploy_done and waited >= max_wait:
msg = f"{name} 部署超时({max_wait}秒)"
self.log(msg, "ERROR")
result['errors'].append(msg)
result['steps']['执行部署脚本'] = False
return result
# 执行 source /etc/profile
self._exec_remote_cmd(
deploy_ssh, "source /etc/profile"
)
deploy_time = int((time.time() - deploy_start) / 60)
result['deploy_time'] = f"{deploy_time}分钟"
result['steps']['执行部署脚本'] = True
self.log(f" {name} 部署用时: {deploy_time}分钟")
# 步骤11.6:验证容器状态
self.log(f"检查 {name} 容器状态...")
_, docker_out, _ = self._exec_remote_cmd(
deploy_ssh,
"docker ps --format "
"'table {{.Names}}\\t{{.Status}}'"
)
container_lines = [
l for l in docker_out.split('\n')
if l.strip() and 'NAMES' not in l
]
result['containers'] = [
l.strip() for l in container_lines
]
result['container_count'] = len(container_lines)
self.log(
f" 运行中的容器: {len(container_lines)}个"
)
for c_line in container_lines:
self.log(f" {c_line}")
result['steps']['容器验证'] = len(container_lines) > 0
# 步骤11.7:等待服务启动并验证API
wait_seconds = self.deploy_verify.get(
'wait_after_deploy', 600
)
wait_minutes = wait_seconds // 60
self.log(
f"等待 {wait_minutes} 分钟让服务完全启动..."
)
for i in range(wait_minutes, 0, -1):
self.log(f" 剩余等待: {i}分钟")
time.sleep(60)
# API接口验证
retry_count = self.deploy_verify.get('retry_count', 5)
retry_interval = self.deploy_verify.get(
'retry_interval', 30
)
api_endpoints = self.deploy_verify.get(
'api_endpoints', []
)
base_url = f"https://{host}"
all_api_ok = True
for endpoint in api_endpoints:
url = f"{base_url}{endpoint['path']}"
api_name = endpoint['name']
keywords = endpoint['keywords']
self.log(f" 测试 {api_name}")
success = False
for retry in range(1, retry_count + 1):
try:
resp = requests.get(
url, verify=False, timeout=30
)
if any(kw in resp.text for kw in keywords):
# 成功后再等30秒二次确认
time.sleep(retry_interval)
resp2 = requests.get(
url, verify=False, timeout=30
)
if any(
kw in resp2.text for kw in keywords
):
self.log(
f" [OK] {api_name} 正常 "
f"(第{retry}次)"
)
success = True
break
self.log(
f" [FAIL] {api_name} 第{retry}次: "
f"{resp.text[:100]}",
"WARN"
)
except Exception as e:
self.log(
f" [FAIL] {api_name} "
f"第{retry}次: {e}",
"WARN"
)
if retry < retry_count:
self.log(
f" 等待{retry_interval}秒后重试..."
)
time.sleep(retry_interval)
result['api_results'][api_name] = success
if not success:
all_api_ok = False
result['errors'].append(
f"{api_name} 验证失败"
)
result['steps']['API接口验证'] = all_api_ok
# 设置最终状态
if result['errors']:
result['status'] = '部分成功'
else:
result['status'] = '成功'
except Exception as e:
msg = f"{name} 部署异常: {e}"
self.log(msg, "ERROR")
result['errors'].append(msg)
result['status'] = '异常'
finally:
# 清理目标服务器上的部署包压缩文件
self._exec_remote_cmd(
deploy_ssh,
'rm -f /data/offline_auto_unifiedPlatform.tar.gz '
'/data/offline_auto_unifiedPlatform.tar.gz.md5'
)
if deploy_sftp:
try:
deploy_sftp.close()
except Exception:
pass
if deploy_ssh:
try:
deploy_ssh.close()
except Exception:
pass
self.log(f" 已断开 {name} 连接")
return result
def step11_deploy_to_x86_servers(self):
"""步骤11:根据远程自动化部署需求文档执行X86架构部署操作"""
self.log("=" * 50)
self.log(
"步骤11:执行X86架构远程部署"
"(192.168.5.52、192.168.5.69、192.168.5.70)"
)
self.log("=" * 50)
if not self.deploy_servers:
msg = "未配置部署服务器,跳过步骤11"
self.log(msg, "WARN")
self._record_step(11, "X86远程部署", "跳过", msg)
return True
# 部署包来源:网盘的版本更新-待验证目录
target_dir = self.nas['target_dir']
package_name = self.build_server['package_name']
package_tar = os.path.join(
target_dir, f"{package_name}.tar.gz"
)
package_md5 = os.path.join(
target_dir, f"{package_name}.tar.gz.md5"
)
# 检查网盘待验证目录中的部署包
if not os.path.exists(package_tar):
msg = (
f"网盘待验证目录中未找到部署包: {package_tar}"
)
self.log(msg, "ERROR")
self._record_step(11, "X86远程部署", "失败", msg)
self.report_data['errors'].append({
'service': 'X86远程部署',
'error': msg
})
return False
pkg_size = os.path.getsize(package_tar)
self.log(
f"部署包来源: {package_tar} "
f"({self._format_size(pkg_size)})"
)
self.log(
f"目标服务器: "
f"{', '.join(s['name'] + '(' + s['host'] + ')' for s in self.deploy_servers)}"
)
# 逐台部署(避免并行导致网盘/带宽瓶颈)
all_success = True
for server_cfg in self.deploy_servers:
server_result = self._deploy_single_server(
server_cfg, package_tar, package_md5
)
self.report_data['deploy_results'].append(server_result)
if server_result['status'] != '成功':
all_success = False
self.log(
f" {server_cfg['name']} ({server_cfg['host']}) "
f"部署状态: {server_result['status']}",
"ERROR"
)
for err in server_result.get('errors', []):
self.report_data['errors'].append({
'service': f"X86部署-{server_cfg['name']}",
'error': err
})
else:
self.log(
f" {server_cfg['name']} ({server_cfg['host']}) "
f"部署成功"
)
# 记录步骤结果
success_count = sum(
1 for r in self.report_data['deploy_results']
if r['status'] == '成功'
)
total_count = len(self.deploy_servers)
step_status = (
"成功" if all_success else "部分成功"
if success_count > 0 else "失败"
)
self._record_step(
11, "X86远程部署", step_status,
f"成功 {success_count}/{total_count} 台服务器"
)
return all_success
# ==================== 主执行流程 ====================
def run(self, update_only=False):
"""执行完整的更新流程"""
def run(self, update_only=False, skip_deploy=False):
"""执行完整的更新流程
Args:
update_only: 仅更新服务(跳过步骤1-2)
skip_deploy: 跳过远程部署步骤(只执行步骤1-10)
"""
self.total_start_time = datetime.now()
self.report_data['start_time'] = (
self.total_start_time.strftime('%Y-%m-%d %H:%M:%S')
......@@ -1079,7 +1622,10 @@ class X86PackageUpdate:
# 初始化日志
self._init_log()
self.log("X86自动更新部署包版本 - 开始执行")
self.log(f"模式: {'仅更新服务' if update_only else '完整更新'}")
mode_desc = '仅更新服务' if update_only else (
'更新+部署' if not skip_deploy else '仅更新(跳过部署)'
)
self.log(f"模式: {mode_desc}")
try:
# 连接服务器
......@@ -1134,9 +1680,27 @@ class X86PackageUpdate:
# 步骤9:清理临时文件
self.step9_cleanup()
# 步骤10:生成报告
# 步骤10:生成中间报告(更新阶段)
report_path = self.step10_generate_report()
# 步骤11:执行X86架构远程部署
if not skip_deploy:
self.log("=" * 50)
self.log("开始步骤11:X86远程部署")
self.log("=" * 50)
# 步骤11不需要保持测试/打包服务器连接
self._disconnect_servers()
deploy_success = self.step11_deploy_to_x86_servers()
# 重新生成包含部署结果的最终报告
report_path = self.step10_generate_report()
if not deploy_success:
self.log(
"步骤11部署存在失败项,请查看报告",
"WARN"
)
else:
self.log("跳过步骤11:X86远程部署(--skip-deploy)")
self.log("=" * 50)
self.log(
f"全部完成!总耗时: {self.report_data['total_duration']}"
......@@ -1180,10 +1744,18 @@ def main():
action='store_true',
help='仅更新服务(跳过步骤1-2,打包服务器已有解压后的部署包)'
)
parser.add_argument(
'--skip-deploy',
action='store_true',
help='跳过远程部署步骤(只执行步骤1-10,不部署到X86服务器)'
)
args = parser.parse_args()
updater = X86PackageUpdate()
success = updater.run(update_only=args.update_only)
success = updater.run(
update_only=args.update_only,
skip_deploy=args.skip_deploy
)
sys.exit(0 if success else 1)
......
......@@ -262,11 +262,15 @@ tar -czf /tmp/services_update.tar.gz \
| 项目 | 值 |
|------|---|
| 架构 | X86 |
| IP | 192.168.5.52 |
| 服务器1 | 192.168.5.52(欧拉服务器)|
| 服务器2 | 192.168.5.69(麒麟V10)|
| 服务器3 | 192.168.5.70(统信UOS)|
| 账号 | root |
| 密码 | Ubains@123 |
| 部署包来源 | `Z:\发布版本\...\X86部署包\全量版\版本更新-待验证` |
| 授权文件 | `E:\自动化部署\X86-5.52\license.zip` |
| 授权文件-5.52 | `E:\自动化部署\X86-5.52\license.zip` |
| 授权文件-5.69 | `E:\自动化部署\X86-5.69\license.zip` |
| 授权文件-5.70 | `E:\自动化部署\X86-5.70\license.zip` |
| 部署文档 | `Docs/PRD/远程自动化部署/X86架构_新统一平台自动化部署操作指导.md` |
**服务验证要求:**
......@@ -389,7 +393,7 @@ python x86_package_update.py --help
- [ ] 能清理所有临时文件
- [ ] 能生成包含新旧版本对比、操作步骤、大小、耗时、状态的报告
- [ ] 全流程日志记录完整
- [ ] 能将更新后的部署包部署到X86目标服务器(192.168.5.52)
- [ ] 能将更新后的部署包部署到X86目标服务器(192.168.5.52、192.168.5.69、192.168.5.70
- [ ] 部署后服务验证通过(重试5次,间隔30秒)
- [ ] `--skip-deploy` 参数可跳过部署步骤
......@@ -417,8 +421,8 @@ python x86_package_update.py --help
| 阶段四:服务替换与配置保留 | ⬜ 待执行 | | |
| 阶段五:打包上传与清理 | ⬜ 待执行 | | |
| 阶段六:报告生成 | ⬜ 待执行 | | |
| 阶段七:X86远程部署 | ⬜ 待执行 | | 步骤11,目标服务器192.168.5.52 |
| 完整流程测试 | 🔄 测试中 | | 步骤1-2已验证通过 |
| 阶段七:X86远程部署 | ✅ 已完成 | 2026-06-04 | 步骤11,目标服务器192.168.5.52、192.168.5.69、192.168.5.70 |
| 完整流程测试 | 🔄 测试中 | | 步骤1-10已验证通过,步骤11待联调测试 |
---
......@@ -480,13 +484,17 @@ python x86_package_update.py --help
### D. X86远程部署信息
- 目标服务器:192.168.5.52(X86架构-欧拉服务器)
- 目标服务器1:192.168.5.52(X86架构-欧拉服务器)
- 目标服务器2:192.168.5.69(X86架构-麒麟V10)
- 目标服务器3:192.168.5.70(X86架构-统信UOS)
- 部署文档:`Docs/PRD/远程自动化部署/X86架构_新统一平台自动化部署操作指导.md`
- 部署包来源:`Z:\发布版本\03服务器部署\15新统一平台\X86部署包\全量版\版本更新-待验证`
- 授权文件:`E:\自动化部署\X86-5.52\license.zip`
- 授权文件-5.52:`E:\自动化部署\X86-5.52\license.zip`
- 授权文件-5.69:`E:\自动化部署\X86-5.69\license.zip`
- 授权文件-5.70:`E:\自动化部署\X86-5.70\license.zip`
---
*文档创建日期:2026-06-03*
*文档更新日期:2026-06-03*
*文档更新日期:2026-06-04*
*文档状态:测试中*
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论