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()