嫌麻烦撸了个轻量级的部署脚本

几乎身边的朋友都会买台云服务器跑个网站或者存点私人代码,我也是这个凑热闹的行列中一员。我的服务器跑了个ghost博客系统和一些乱七八糟的东西。

平时写好了些东西想要在服务器上跑起来需要走下面好些个流程:

  1. 打包代码
  2. 上传到服务器
  3. 登录服务器
  4. 重启进程

经历多了总觉得烦,但是由于服务器配置差(贪便宜的缘故),总不能浪费资源跑一个Jenkins或者Gitlab等带自动部署功能的软件吧。趁着有空自己写了点辅助的脚本解放上面几个流程。

脚本主要包括两个文件:一个Shell脚本负责打包(deploy)、一个是expect脚本负责代替人实现与服务器的对话(upload)。文件内容如下:

#!/bin/bash
# deploy脚本

# 工作目录
DIR=$(cd `dirname $0`; cd ..; pwd)  
NAME=`basename $DIR`  
TIME=`date '+%Y%m%d%H%M%S'`  
TARGET=dist/exbook-$TIME.tar.gz  
cd $DIR

# 压缩
mkdir -p dist  
rm -rf dist/*  
cd ..  
tar --exclude=$NAME/.* \  
--exclude=$NAME/node_modules \
--exclude=$NAME/dist \
--exclude=$NAME/uploads 
--exclude=$NAME/bin/deploy \
-zcf $NAME/$TARGET $NAME
cd $DIR

# 上传
/usr/bin/expect bin/upload $TARGET
#!/usr/bin/expect

set target [lindex $argv 0]  
set filename "上传到服务器后的文件名称"  
set hostname "服务器地址"  
set username "登录账号"  
set password "登录密码"

# 上传
set timeout 100  
spawn scp $target $username@$hostname:/var/$filename  
expect "*password:"  
send "$password\n"  
interact

# 登录
spawn /usr/bin/ssh $username@$hostname  
expect "*password:"  
send "$password\n"

# 关闭旧进程
expect "*\\\$"  
send "forever stop [node启动脚本文件] \n"

# 删除旧版本代码
expect "*\\\$"  
send "cd [目录文件]\n"

expect "*\\\$"  
send "rm -rf `ls .|awk \'{if(\$0 != \"node_modules\" && \$0 != \"uploads\") print \$0\}\'`\n"

# 解压新代码与安装依赖
expect "*\\\$"  
send "tar -zxf ../documents/$filename -C ../\n"

expect "*\\\$"  
send "npm install\n"

expect "*\\\$"  
send "cd ..\n"

# 启动
expect "*\\\$"  
send "forever start [node启动脚本文件] \n"

# 检查启动情况
expect "*\\\$"  
send "forever list\n"

# 退出
expect "*\\\$"  
send "logout\n"  
interact  

流水账脚本做得功能很简单,看注释就可以理解。由于仓促完成没有做成可配置的工具,因此我的工作环境外的情况未必能正常工作,如有参考时请注意适当根据自己的情况做修改。

ChardLau

继续阅读此作者的更多文章