jenkins远程发布java服务部署脚本
#!/usr/bin/env python3
# coding=utf-8
import paramiko, os, time
def run_cmd(ssh_client, cmd):
print("执行命令: " + cmd)
stdin, stdout, stderr = ssh_client.exec_command(cmd)
error_msg = stderr.read().decode('utf8')
result = stdout.read().decode('utf8')
if not error_msg:
print("run_cmd 命令执行结果: " + result)
else:
print("run_cmd error: " + error_msg)
return result
def backup(ssh_client, backup_dir):
if not os.path.exists(backup_dir):
print("------创建目录%s------" % backup_dir)
os.makedirs(backup_dir)
else:
print("------目录已存在%s------" % backup_dir)
cmd_tar = "tar -czPf %s%s_%s.tar.gz %s%s.jar" % (backup_dir, app_name, date, app_home, app_name)
run_cmd(ssh_client, cmd_tar)
cmd_rm = "rm -rf %s%s.jar" % (app_home, app_name)
run_cmd(ssh_client, cmd_rm)
def sftp_upload(sftp, local_path, remote_path):
put_info = sftp.put(local_path, remote_path)
print(put_info)
print(f"上传{local_path}完成")
def shutdown(ssh_client, app_name):
kill_cmd = "ps -ef | grep java |grep " + app_name + " | grep -v grep | awk '{print $2}'|xargs kill -9"
for i in range(10):
pid_cmd = "ps -ef | grep java |grep " + app_name + " | grep -v grep | awk '{print $2}'"
result = run_cmd(ssh_client, pid_cmd)
if not result:
print('shutdown application completed-------------------------停止完成!')
break
else:
run_cmd(ssh_client, kill_cmd)
time.sleep(3)
def start(ssh_client, start_cmd):
run_cmd(ssh_client, start_cmd)
print('正在启动.........')
time.sleep(10)
for i in range(10):
pid_cmd = "ps -ef | grep java |grep " + app_name + " | grep -v grep | awk '{print $2}'"
result = run_cmd(ssh_client, pid_cmd)
if result:
print('startup application completed----------------------!')
break
else:
print('进程启动异常....(第%d次检查)'% i+1)
def deploy(host, username, key, port):
print("----------%s----------" % host)
private_key = paramiko.RSAKey.from_private_key_file(key)
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(host, port, username=username, pkey=private_key, timeout=5)
sf = paramiko.Transport((host, port))
sf.connect(username=username, pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(sf)
if deployENV == 'false':
##备份jar包并删除当前jar包
backup(ssh_client, backup_dir)
###上传jar包到远程服务器
sftp_upload(sftp, local_path, app_home)
##停止服务
shutdown(ssh_client, app_name)
##启动java进程
start(ssh_client, app_name)
else:
##停止服务
shutdown(ssh_client, app_name)
##启动java进程
start(ssh_client, app_name)
ssh_client.close()
sf.close()
if __name__ == "__main__":
date = time.strftime('%Y%m%d%H%M%S', time.localtime())
deployENV = os.environ['deployENV'] #获取jenkins的构建参数,控制重启和部署
app_home = "/app/application/"
app_name = "lis-business-APPSUP-7.0.1-SNAPSHOT"
backup_dir = "/home/gelcmw/backup/"
local_path = "/tmp/%s.jar" % app_name
start_cmd = "java -jar %s.jar" % app_name
# 相同用户密码可以使用这种方式:
ip_list = ['192.168.137.100', '192.168.137.101']
port = 22
user = 'root'
key = '/root/.ssh/id_new'
for ip in ip_list:
deploy(ip, user, key, port)
# 远程机器为不同密码或不同用户端口可以使用以下方式:
# 密码文件格式ip,端口,用户,密码
# 192.168.137.100,22,root,123456
# 192.168.137.101,22,root,123456
# 存放密码文件本地路径
# host_txt = r'E:\py_project\host_site.txt'
# 遍历登录账户密码文件
# for i in open(host_txt, 'r').readlines():
# r = i.strip().split(',')
# ip, port, user, password = r
# deploy(ip,user,password,port)