每次上线新功能,还得手动打包、上传、重启服务?别说多麻烦了,光是重复操作就容易出错。上周我们组就是因为漏传一个配置文件,导致线上接口集体报错,排查了快一个小时才定位到问题。
别再手点了,让工具来跑流程
其实现在大多数项目都有现成的构建工具,比如前端常用的 Webpack、Vite,后端用的 Maven、Gradle,甚至 Python 项目也能用 Makefile 或 Poetry。这些工具不光能打包,还能串起一整套部署动作。
举个例子,你可以在 package.json 里写这么一条脚本:
"scripts": {
"deploy": "npm run build && scp -r dist/ user@server:/var/www/html && ssh user@server 'systemctl restart nginx'"
}
执行 npm run deploy,自动完成编译、传输、重启 Nginx 三步操作。省得你一个命令一个命令敲,也不怕忘这忘那。
结合 CI/CD,提交代码就上线
更进一步,把构建脚本接入 GitLab CI 或 GitHub Actions。比如在项目根目录加个 .github/workflows/deploy.yml 文件:
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build
run: npm install && npm run build
- name: Deploy to Server
uses: appleboy/scp-action@v0.1.5
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.KEY }}
source: "dist/"
target: /var/www/html
- name: Restart Service
uses: appleboy/ssh-action@v0.1.6
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.KEY }}
script: systemctl restart nginx
以后只要合并代码到主分支,系统自动走完流程,几分钟后新版本就在线上跑起来了。连“上线”这个动作都变得悄无声息。
别忘了权限和回滚
自动化虽然方便,但也得留后路。建议每次部署前把旧版本备份一下,比如:
scp user@server:/var/www/html /backup/site_$(date +%Y%m%d_%H%M%S)
万一新版本炸了,马上切回去。另外,服务器上的 SSH 密钥、部署脚本权限要管好,别谁都可以上去跑一遍 deploy。
现在我们团队已经习惯这种节奏:开发完提 PR,CI 跑测试,合并后自动上线。运维不再是个“深夜加班改配置”的苦活,反而成了流程设计的一部分。省下来的时间,喝杯咖啡,看看日志,不香吗?