Git仓库自动部署更新网站前端代码文件定时任务
场景与目标
你有一个Git仓库存放网站前端文件(如HTML、CSS、JS),每次更新后需要手动连接服务器拉取代码,很麻烦。
本文通过配置Linux系统的crontab定时任务,让服务器自动从Git仓库拉取最新代码并更新网站目录,彻底解放双手。
适合使用Nginx或Apache的静态站点,也适用于Vue、React构建后的dist目录。
操作前需要准备什么
- 一台Linux服务器(本文以CentOS 7为例,Ubuntu也适用,命令略有差异)。
- 服务器已安装Git,且能访问你的Git仓库(支持HTTPS或SSH方式)。
- 网站根目录已初始化为Git仓库,或者已通过
git clone拉取过一次。 - 确保服务器时间和时区正确(定时任务依赖系统时间)。
- 最好提前手动测试
git pull能够正常执行(见下文“手动验证”)。
核心操作:四步配置自动部署
1. 确认网站目录为Git仓库
登录服务器,进入网站前端文件所在目录(如/var/www/html)。
执行:
cd /var/www/html
git status
如果提示“not a git repository”,需要先初始化并关联远程仓库:
git init
git remote add origin 你的仓库地址
git pull origin main # 或者master,根据你的默认分支
如果已拉取过,直接进入下一步。
2. 编写拉取更新脚本
创建一个Shell脚本,用于拉取代码并处理可能的冲突。
例如在/usr/local/bin目录下创建auto-deploy.sh:
#!/bin/bash
cd /var/www/html
git pull origin main >> /var/log/auto-deploy.log 2>&1
赋予执行权限:
chmod +x /usr/local/bin/auto-deploy.sh
*注意:如果使用SSH方式连接仓库,需提前配置SSH密钥并确保免密登录。
*
3. 设置crontab定时任务
执行crontab -e,添加一行定时任务。
比如每隔5分钟拉取一次:
*/5 * * * * /usr/local/bin/auto-deploy.sh
如果想要每小时执行一次:
0 * * * * /usr/local/bin/auto-deploy.sh
保存退出。
可以查看当前定时任务列表:
crontab -l
4. 重启cron服务(可选)
CentOS:
systemctl restart crond
Ubuntu:
systemctl restart cron
避坑指南:这些地方容易出错
- SSH密钥权限问题:如果使用SSH克隆仓库,确保
~/.ssh/id_rsa权限为600,公钥已添加到GitHub/Gitee。测试连接:ssh -T git@github.com。 - Git冲突导致拉取失败:如果服务器上有人手动修改过文件,
git pull会报冲突。建议在脚本中加入git stash或git reset --hard(会丢弃本地修改),例如:
#!/bin/bash
cd /var/www/html
git fetch origin
git reset --hard origin/main
- 日志记录:脚本中重定向输出到日志文件(如
/var/log/auto-deploy.log),便于排查。 - 定时任务语法错误:crontab中每个字段之间用空格分隔,不要有多余空格。常用检查:
*/5 * * * *表示每5分钟,0 3 * * *表示每天凌晨3点。 - 时区不对:查看时区:
timedatectl,如果需要修改:timedatectl set-timezone Asia/Shanghai。
效果验证与常见问题
如何验证自动部署生效?
- 在Git仓库中提交一次修改(比如改动index.html)。
- 等待定时任务触发(如果设置为每5分钟,等5分钟)。
- 通过浏览器访问你的网站,看是否已更新。
- 检查日志文件:
cat /var/log/auto-deploy.log
正常会显示拉取记录。
高频问题解答
Q:定时任务没有执行?
A:先确认cron服务是否运行:systemctl status crond。再检查脚本是否有执行权限。也可以手动执行一次脚本看报错:bash /usr/local/bin/auto-deploy.sh。
Q:每次拉取都需要输入用户名密码?
A:对于HTTPS仓库,可以在仓库地址中嵌入密码(不安全),推荐使用SSH密钥免密登录,或者将凭据存储在git credential helper中。
Q:网站文件权限问题导致无法更新?
A:确保运行cron的用户对网站目录有写权限。如果网站目录属于www用户,可以在crontab中指定用户:*/5 * * * * www-data /usr/local/bin/auto-deploy.sh。
Q:只想在代码有变化时才拉取,怎么优化?
A:可以在脚本中先检查远程是否有新提交:git fetch origin && git log HEAD..origin/main --oneline,如果有输出再执行git pull。
总结
配置Git仓库自动部署更新网站前端代码文件定时任务并不复杂,关键在于脚本的容错性和定时任务的正确性。
按本文步骤操作,你就能实现每次提交代码后自动同步到服务器。
如果遇到问题,优先检查日志和权限,大部分问题是密钥验证或路径错误导致的。