node js项目打包上传服务器重启nginx实现自动化部署python脚本

1.假设代码位置为/home/web/,需要调整nginx配置root路径,因为dist为打包文件的解压缩后带的路径

    server {
        listen       80;
        server_name  localhost;

       location / {
			***
            root   /home/web/dist;
            index  index.html index.htm;

        }
		
    } 

2.上传脚本代码upload.py

import os
import shutil
import time

import paramiko
from scp import SCPClient


class LinuxSSHSCP(object):

    def __init__(self, ip, username, password, port=22):
        self.ip = ip
        self.username = username
        self.password = password
        self.port = port
        self.ssh_client = None
        self.scp_client = None
        self.sftp_client = None

    def ssh_connect(self):
        print("ssh connect")
        if self.ssh_client is None:
            self.ssh_client = paramiko.SSHClient()
            # set_missing_host_key_policy(paramiko.AutoAddPolicy()) 允许连接不在know_hosts文件中的主机
            self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh_client.connect(self.ip, self.port, self.username, self.password, timeout=10)

    def ssh_disconnect(self):
        print("ssh disconnect")
        self.ssh_client.close()
        self.ssh_client = None

    def ssh_exec_command(self, command):
        print("exec command on remote:", command)
        std_in, std_out, std_err = self.ssh_client.exec_command(command)
        result = std_out.read().decode()
        return result

    def scp_connect(self):
        print("scp connect")
        if self.ssh_client is None:
            print("ssh not connect, start connect ssh")
            self.ssh_connect()

        if self.scp_client is None:
            self.scp_client = SCPClient(self.ssh_client.get_transport(), socket_timeout=15.0)

    def scp_disconnect(self):
        print("scp disconnect")
        self.scp_client.close()
        self.scp_client = None

    def scp_copy_from_remote(self, local_path, remote_path):
        print("start copy remote to local", remote_path, '->', local_path)
        self.scp_client.get(remote_path, local_path, True)

    def scp_copy_to_remote(self, local_path, remote_path):
        print("start copy local to remote", local_path, '->', remote_path)
        self.scp_client.put(local_path, remote_path, True)

    def sftp_connect(self):
        print("sftp connect")
        if self.ssh_client is None:
            self.ssh_connect()
        self.sftp_client = self.ssh_client.open_sftp()

    def sftp_copy_from_remote(self, local_path, remote_path):
        print("sftp copy from remote")
        self.sftp_client.get(remote_path, local_path)

    def sftp_copy_to_remote(self, local_path, remote_path):
        print("sftp copy to remote")
        self.sftp_client.put(local_path, remote_path)

    def sftp_disconnect(self):
        print("sftp connect")
        self.sftp_client.close()
        self.sftp_client = None

    def local_cmd(self, cmd):
        print('local_cmd ', cmd)
        return os.popen(cmd).read()


if __name__ == "__main__":
	# 需要替换一下配置
    s = LinuxSSHSCP("ip", "用户名", "密码", 22)
    service_path = '/home/web/t/'
    dist_prod_name='dist'+time.strftime("%Y%m%d_%H%M%S", time.localtime(time.time()))+'.tar.gz'
    # dist_prod_name='dist.tar.gz'

    s.ssh_connect()
    s.scp_connect()
    print('删除缓存 dist')
    if os.path.exists('dist'):
        shutil.rmtree('dist')
    # 这里直接删除线上的文件,如果用于生产,请备份
    print(s.ssh_exec_command("rm -rf "+service_path))
    print(s.ssh_exec_command("mkdir "+service_path))
    # 用cnpm构建项目
    print(s.local_cmd("cnpm run build --prod"))
    if not os.path.exists('dist'):
        print('生成dist产物失败 退出')
    # 打包产物
    print(s.local_cmd("tar -czf "+dist_prod_name+" dist"))
    # 上传产物
    s.scp_copy_to_remote(dist_prod_name, service_path)
    # 解压产物
    print(s.ssh_exec_command("tar -zxvf " + service_path + "/"+dist_prod_name+" -C " + service_path))
    print(s.ssh_exec_command("ls " + service_path))
    # nginx重新载入资源
    print(s.ssh_exec_command("nginx -s reload"))
    s.scp_disconnect()
    s.ssh_disconnect()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值