一、背景介绍
在本地修改代码之后,部署的步骤往往比较繁琐(编译–scp–输入密码–重启服务),笔者想简化流程,但是使用 Jenkins 之类的工具比较麻烦,因此笔者采用 expect 来实现一键部署,在本地代码开发完毕之后,执行下文中index.sh
即可完成“编译–编译后文件的上传–重启服务”的流程。
特别说明:
- 笔者文中流程适用于前端或者node项目,如果您的项目不是前端或者node项目,请根据您的需要参照本文中的代码稍作修改,即可满足您的需求
- 笔者的文中仅包含基础的一键部署流程,如需增加额外的流程可以基础流程中的代码稍作修改,即可满足您的需求
二、如何实现一键部署
1. 文件结构
|── deploy
|----└── index.sh
# 入口文件
|----└──restart-server.sh
# 重启服务器的服务,纯前端项目可略过此项
|----└──scp-dist.sh
# 上传 dist 目录下的文件到服务器
2. 文件内容
2.1 index.sh
#!/bin/bash
password=您的ssh密码
ip=您的服务器IP
targetPath=您的目标部署路径
yarn run build
$(pwd)/deploy/scp-dist.sh $(pwd) $password $ip $targetPath
$(pwd)/deploy/restart-server.sh $(pwd) $password $ip $targetPath
2.2 restart-server.sh
#!/usr/bin/expect
set projectPath [lindex $argv 0]
set password [lindex $argv 1]
set ip [lindex $argv 2]
set targetPath [lindex $argv 3]
spawn bash -c "ssh -p 29521 root@$ip"
expect "password: "
send "$password\r"
# 登录完成会显示"]#"
expect "]#"
send "cd $targetPath && forever restart --minUptime 100 --spinSleepTime 100 app.js\r"
expect "]#"
send "exit\r"
expect eof
2.3 scp-dist.sh
#!/usr/bin/expect
set projectPath [lindex $argv 0]
set password [lindex $argv 1]
set ip [lindex $argv 2]
set targetPath [lindex $argv 3]
spawn bash -c "scp -P 29521 -r ${projectPath}/dist/* root@$ip:$targetPath"
expect {
"(yes/no)?" {
send "yes\r"
expect "password:" {
send "$password\r"
}
}
"password:" {
send "$password\r"
}
}
expect eof