在测试和运行脚本语言(如 php、python、javascript)的应用或网站时,传统的方式是使用 FTP 或 SFTP 来部署到生产环境。它们是简单直观的部署方式,但略显繁琐。如果部署的新版本有问题,想要回退也是一件麻烦事。
那么,能不能利用 Git 来管理生产环境中的服务器(以 Linux 为例)呢?使用 Git 来自动部署服务器上的文件,简化工作流。同时利用 Git 的版本管理功能进行快速的版本切换,便于测试和回退。
答案是可以的。配置完成后,仅需一条"git push production"命令即可完成更新,大大提升部署的效率。
实现原理和前提条件
该方法利用了三个仓库,分别为用户的本地仓库、服务器上裸仓库、服务器上的生产环境服务器仓库。用户在本地仓库更新完代码后,push 到服务器上的一个裸仓库,触发该仓库中的一个自动化脚本,让生产环境的服务器仓库从裸仓库 pull 新的版本,以更新生产环境中的服务器代码。
可见,实现以上功能,需先满足:
- 目标 Linux 服务器可以通过基于密钥的 SSH 访问
- 服务器和本地均已经安装 Git
- 你的生产环境服务器文件是一个 Git 仓库
创建一个裸仓库以推送
在服务器上,你需要一个裸仓库(bare repository)作为 push 的目标。
裸仓库可以作为一个集中的存储库,包含了项目所有的版本历史记录、分支、标签等元数据信息。它不包含工作区,只用于代码共享和备份。裸仓库还可以通过 Git 协议、SSH 协议等多种协议进行远程访问和传输。
在一个新目录中创建仓库并使用以下命令进行初始化,我们暂且将其命名为"你的项目.git":
mkdir ~/你的项目.git
cd ~/你的项目.git
git --bare init
在 "post-receive" 钩子中添加自动化
在裸仓库的 hooks 目录中,创建一个带有执行权限的脚本,该脚本的作用是将内容从裸仓库拉取到生产环境:
vim ~/你的项目.git/hooks/post-receive
写入如下内容:
#!/bin/bash
unset GIT_DIR
cd 你的服务器文件所在的路径
git pull
将该文件设置为可执行:
chmod +x ~/你的项目.git/hooks/post-receive
配置本地仓库
在本地仓库中添加一个额外的远程仓库:
git remote add production 你的用户名@服务器地址:你的项目.git
git push production
Voilà!