jenkins部署微服务发布脚本(python)

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)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值