wangshuo'blog

wangshuo'blog

自动化 | Python 自动化脚本

Python 自动化脚本-SpringBoot 项目一键部署

需求分析

解决的问题,实现下面流程的自动化:

1、一键编译本地 Maven 项目

1
mvn clean package

2、删除远程服务器 jar 包,同时结束指定端口的进程

1
2
rm xxx.jar
lsof -i:8888 -t | xargs kill -9

3、上传编译生成的 jar 包

1
scp xxx.jar xxx

4、调用命令启动 jar 包

1
nohup java -jar -Xms128m -Xmx256m -XX:PermSize=128M -XX:MaxPermSize=256M xxx.jar  > api.log 2>&1 &

上面的过程通过一个脚本来自动化的实现上面的过程

思路:

基本上现有的编程语言都可以调用操作系统命令的接口(方法)

使用编程语言实现的ssh协议或者调用本地的ssh协议相关的命令

并不是在所有的操作系统中,都有 ssh 协议相关的几个命令(scp、ssh)所以,这里使用第一种方案 [^1]

具体实现

这里使用 Python 来实现,

1
pip install paramiko

Paramiko 是SSHv2协议的纯Python(2.7,3.4+)实现,提供客户端和服务器功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import os
import paramiko
import logging

# 2022/11/09

# 项目根目录
root = '.'
port = 9801

# 服务器配置信息
ip = "x.x.x.x"
username = "root"
password = "xxxx"

def execute_command(command):
"""
执行命令,返回命令的输出
"""
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,password)

stdin, stdout, stderr = ssh.exec_command(command)
output = stdout.readlines()
ssh.close()
return output

print("删除远程服务器 jar 包 开始--------------------")
execute_command('rm xxx.jar')
print("删除远程服务器 jar 包 结束--------------------")

# 1、编译
print("开始编译---------------------------------------")
os.system("mvn clean package -f " + root)
print("结束编译---------------------------------------")

# 2、 上传文件
print("开始上传文件---------------------------------------")
t = paramiko.Transport((ip,22))
t.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(t)
remotepath='xxx.jar'
localpath= os.getcwd() + r'\target\scrm-api.jar'
sftp.put(localpath,remotepath)
t.close()
print("结束上传文件---------------------------------------")


# 杀死进程
# sudo apt install lsof
# or
# sudo yum install lsof
pid = execute_command('lsof -i:' + str(9801) + ' -t')[0]
print(pid)
if pid != '':
print('远程服务器进程存在,pid 为 ' + pid)
execute_command('kill -9 ' + pid)
print('杀死进程完成')

# 执行运行命令
command = "cd /home/admin ; nohup java -jar -Xms128m -Xmx256m -XX:PermSize=128M -XX:MaxPermSize=256M xxx.jar > api.log 2>&1 &"

execute_command(command)
print("脚本执行完成")

上述代码只是一个简单的实现,具体你需要结合的实际情况来编写脚本

这里也给出了第二种方案





[^1]: Win7 默认没有 ssh 和 scp 两条命令,需要单独安装这两个命令