import os import zipfile import paramiko # 配置 local_dir = './dist' # 本地要打包的目录 zip_name = './dist/dist.zip' # 上传到服务器的 zip 路径 remote_path = '/www/wwwroot/auto-devlop/ckb-operation/dist.zip' # 服务器上的临时zip路径 server_ip = '42.194.245.239' server_port = 6523 server_user = 'yongpxu' server_pwd = 'Aa123456789.' # 服务器 dist 相关目录 remote_base_dir = '/www/wwwroot/auto-devlop/ckb-operation' dist_dir = f'{remote_base_dir}/dist' dist1_dir = f'{remote_base_dir}/dist1' dist2_dir = f'{remote_base_dir}/dist2' # 1. 先运行 yarn build print('开始执行 yarn build...') ret = os.system('yarn build') if ret != 0: print('yarn build 失败,终止部署!') exit(1) print('yarn build 完成') # 2. 打包 with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf: for root, dirs, files in os.walk(local_dir): for file in files: filepath = os.path.join(root, file) arcname = os.path.relpath(filepath, local_dir) zipf.write(filepath, arcname) print('本地打包完成') # 2. 上传 transport = paramiko.Transport((server_ip, server_port)) transport.connect(username=server_user, password=server_pwd) sftp = paramiko.SFTPClient.from_transport(transport) sftp.put(zip_name, remote_path) sftp.close() transport.close() print('上传到服务器完成') # 3. 远程解压并覆盖 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(server_ip, server_port, server_user, server_pwd) commands = [ # 1. 解压 dist.zip 到 dist2 f'unzip -o {remote_path} -d {dist2_dir}', # 2. 如果 dist 存在,重命名为 dist1 f'if [ -d {dist_dir} ]; then mv {dist_dir} {dist1_dir}; fi', # 3. dist2 改名为 dist f'mv {dist2_dir} {dist_dir}', # 4. 删除 dist1 f'rm -rf {dist1_dir}', # 5. 删除 dist.zip f'rm {remote_path}' ] for cmd in commands: stdin, stdout, stderr = ssh.exec_command(cmd) print(stdout.read().decode(), stderr.read().decode()) ssh.close() print('服务器解压并覆盖完成,部署成功!')