• python 自动化部署SpringBoot到远程linux系统


    1. import os
    2. import datetime
    3. from paramiko import SFTPClient, Transport, SSHClient, AutoAddPolicy
    4. from sshtunnel import SSHTunnelForwarder
    5. # 清理
    6. def mvn_clean(project_path: str) -> str:
    7. pos_command = f'{project_path[:2]} & cd {project_path}'
    8. result = os.popen(f'{pos_command} & mvn clean')
    9. return result.read()
    10. # 打包
    11. def mvn_package(project_path: str) -> str:
    12. pos_command = f'{project_path[:2]} & cd {project_path}'
    13. result = os.popen(f'{pos_command} & mvn package -f pom.xml')
    14. return result.read()
    15. # 连接SSH跳板机
    16. def login_ssh_tunnel() -> SSHTunnelForwarder:
    17. server = SSHTunnelForwarder(
    18. ('123.157.139.150', 12307), # 跳板机IP、端口
    19. ssh_username='goodluck', # 跳板机 用户名
    20. ssh_password='CIIH@2020@dev', # 跳板机 密码
    21. remote_bind_address=('192.168.1.76', 7021), # 目标 IP、端口号
    22. )
    23. return server
    24. # 连接目标服务器-sftp
    25. def login_linux_ftp(server: SSHTunnelForwarder):
    26. transport = Transport(('localhost', server.local_bind_port))
    27. transport.banner_timeout = 60
    28. transport.connect(username='root', password='ADMIN@ciih')
    29. sftp = SFTPClient.from_transport(transport)
    30. # 上传文件:sftp.put(local_path, remote_path)
    31. # 下载文件 sftp.get(remote_path, local_path)
    32. # 列出目录及文件 sftp.listdir(remote_path)
    33. return sftp
    34. # 连接目标服务器-shell
    35. def login_linux_shell(server: SSHTunnelForwarder):
    36. ssh_client = SSHClient()
    37. ssh_client.set_missing_host_key_policy(AutoAddPolicy())
    38. ssh_client.connect(hostname='127.0.0.1', port=server.local_bind_port, username='root', password="ADMIN@ciih")
    39. # 执行命令:stdin, stdout, stderr = ssh_client.exec_command("cd /home/webapps/;ls")
    40. # stdout.read()
    41. return ssh_client
    42. # 创建多级文件(不含文件)
    43. def create_dir(file_path):
    44. if os.path.exists(file_path) is False:
    45. os.makedirs(file_path)
    46. # 修改部分文件:比如环境参数
    47. def edit_some_file():
    48. # 将海康SDK设置成linux
    49. HCNetSDK_path = 'D:/workspaceweb/workshop-java/src/main/java/com/ciih/workshop/utils/hk/HCNetSDK.java'
    50. HCNetSDK_content: str = ''
    51. with open(HCNetSDK_path, "r", encoding="utf-8") as f1:
    52. for line in f1:
    53. if 'boolean isLinux = false;' in line:
    54. line = line.replace('boolean isLinux = false;', 'boolean isLinux = true;')
    55. HCNetSDK_content += line
    56. with open(HCNetSDK_path, "w", encoding="utf-8") as f2:
    57. f2.write(HCNetSDK_content)
    58. # 激活test配置文件
    59. application_path = 'D:/workspaceweb/workshop-java/src/main/resources/application.yml'
    60. application_content: str = ''
    61. with open(application_path, "r", encoding="utf-8") as f1:
    62. for line in f1:
    63. if 'active: pro' in line:
    64. line = line.replace('active: pro', 'active: test')
    65. application_content += line
    66. with open(application_path, "w", encoding="utf-8") as f2:
    67. f2.write(application_content)
    68. if __name__ == '__main__':
    69. # 修改部分文件
    70. edit_some_file()
    71. # 清理
    72. clean: str = mvn_clean(project_path='D:/workspaceweb/workshop-java')
    73. print('清理')
    74. # 打包
    75. package: str = mvn_package(project_path='D:/workspaceweb/workshop-java')
    76. print('打包')
    77. # 备份数据库 TODO
    78. print('备库')
    79. # 登录跳板机
    80. tunnel: SSHTunnelForwarder = login_ssh_tunnel()
    81. tunnel.start()
    82. # 登录服务器-sftp
    83. ftp: SFTPClient = login_linux_ftp(tunnel)
    84. # 备份旧JAR包
    85. back_path = 'E:/DevOps/test/' + datetime.datetime.now().strftime('%Y-%m-%d-%Hh%Mm%Ss')
    86. create_dir(back_path)
    87. ftp.get('/home/webapps/workshop-0.0.1-SNAPSHOT.jar', back_path + '/workshop-0.0.1-SNAPSHOT.jar')
    88. # 上传新JAR包
    89. ftp.put('D:/workspaceweb/workshop-java/target/workshop-0.0.1-SNAPSHOT.jar',
    90. '/home/webapps/workshop-0.0.1-SNAPSHOT.jar')
    91. # 登录服务器-shell
    92. shell: SSHClient = login_linux_shell(tunnel)
    93. # 重启脚本
    94. command = shell.exec_command("kill -9 `netstat -nlp | grep :8088 | awk '{print $7}' | awk -F'/' '{ print $1 }'`")
    95. print('关闭服务')
    96. stdin, stdout, stderr = shell.exec_command(
    97. 'nohup java -Dfile.encoding=utf-8 -jar -Duser.timezone=GMT+08 /home/webapps/workshop-0.0.1-SNAPSHOT.jar > /home/webapps/nohup.out 2>&1 &')
    98. print('服务启动中...')
    99. # 关闭连接
    100. ftp.close()
    101. shell.close()
    102. tunnel.stop()

  • 相关阅读:
    互联网摸鱼日报(2023-10-23)
    Gamframwork 检查更新、开始更新 热更的流程
    java计算机毕业设计空闲教室查询系统MyBatis+系统+LW文档+源码+调试部署
    C++基础语法——智能指针
    Wi-Fi 6还没用上,Wi-Fi 7就要来了?
    SpringCloud 面试题
    内外“双驱”, NFT价值UPUP
    期望值、方差和标准差分别描述了什么?
    (C语言)文件操作
    工具及方法 - 在线流程图描画
  • 原文地址:https://blog.csdn.net/wenxingchen/article/details/126246517