# 进入项目文件 cd /usr/local/example # 拉取最新代码 git pull # 打包 npm run build # 重启服务 pm2 reload ecosystem.config.js你可以在 Git 上随便更新点内容,然后在 XShell 或其他工具打开服务器控制台,执行这段代码,然后到线上版本看更新有没有生效。笔记一开始经过了一番折腾,发现最好得记录部署日志,那样方便排查问题。完整脚本如下:
# 日志文件路径 LOG_FILE="/usr/local/example/$(date).txt" # 记录开始时间 echo "Deployment started at $(date)" > $LOG_FILE # 进入项目文件 cd /usr/local/example # 拉取最新代码 git pull >> $LOG_FILE 2>&1 # 打包 npm run build >> $LOG_FILE 2>&1 # 重启服务 pm2 reload ecosystem.config.js >> $LOG_FILE 2>&1 # 记录结束时间 echo "Deployment finished at $(date)" >> $LOG_FILEEggjs
# 堆代码 duidaima.com # 日志文件 LOG_FILE="/usr/local/example/$(date).txt" # 记录开始时间 echo "Deployment started at $(date)" > $LOG_FILE # 进入项目文件 cd /usr/local/example # 拉取最新代码 git pull >> $LOG_FILE 2>&1 # Egg 没有重启命令,要先 stop 再 start npm stop >> $LOG_FILE 2>&1 npm start >> $LOG_FILE 2>&1 # 记录结束时间 echo "Deployment finished at $(date)" >> $LOG_FILEEggjs 项目没有构建的步骤,其依赖要事先安装好。因此如果开发过程中安装了新依赖,记得到服务端安装一下。
# 日志文件 LOG_FILE="/usr/local/example/$(date).txt" # 记录开始时间 echo "Deployment started at $(date)" > $LOG_FILE # 进入项目文件 cd /usr/local/example # 拉取最新代码 git pull >> $LOG_FILE 2>&1 # 重装依赖 export NODE_ENV=development npm install >> $LOG_FILE 2>&1 # 构建 npm run build >> $LOG_FILE 2>&1 # 移除开发依赖 npm prune --omit=dev >> $LOG_FILE 2>&1 # 启动服务 npm start >> $LOG_FILE 2>&1 # 记录结束时间 echo "Deployment finished at $(date)" >> $LOG_FILEMidwayjs 的自动部署脚本比较特殊:在 npm install 之前需要先指定环境为 development ,那样才会安装所有依赖,否则会忽略 devDependencies 中的依赖,导致后面的 npm run build 无法执行。这点也是费了笔者好长时间才排查清楚,因为它在 XShell 里执行的时候默认的环境就是 development ,但是到了 Webhooks 调用的时候又变成了 product 。
const { Controller } = require('egg'); const { exec } = require('child_process'); class EggController extends Controller { async index() { const { ctx } = this; try { // 执行 .sh 脚本 await exec('sh /usr/local/example/egg.sh'); ctx.body = { 'msg': 'Deployment successful' }; } catch (error) { ctx.body = { 'msg': 'Deployment failed:' + JSON.stringify(error) }; } } } module.exports = EggController;如果启动成功,你应该可以在 Postman 之类的工具上发起这个控制器对应的请求,然后成功执行里面的 .sh 脚本。