考虑以下情况:
我有一个 git 存储库 foo.git,其中包含 javascript 项目的代码。在这个存储库中有一个分支生产包含由网络服务器提供的代码状态,该服务器从以下位置获取代码/var/www/foo
。该存储库是该项目的主存储库。每个人都对其进行推拉。
是否可以有/var/www/foo
更新为结账生产每当有人推送到那个特定的分支时?您可以假设 git 守护进程(或用户 git,即所有人登录通过 SSH 连接的用户)有权写入所述目录。
您必须在服务器上创建一个裸存储库git init --bare
。
然后使用一个post-receive
挂钩来触发您的部署。
如何部署取决于您。
我的部署策略
我通常放置一个deploy
导演,有逻辑的地方。
然后每次结账,我都会将最新的分支解压到deploy/COMMIT_ID
where COMMIT_ID
是最新推送的哈希值。签出完成后,您可以将符号链接重新指向最新的部署目录。
我常用的目录结构:
deploy.git/
deploy/
a7922231/
b2f0a2af/
latest -> b2f0a2af
解压更新包
而不是使用git-checkout
,我通常用git-archive
将分支解压到目录中。
# Assuming current directory is deploy.git
HEAD=`cat refs/heads/master`
mkdir -p ../deploy/${HEAD}
git archive master | tar -x -C ../deploy/${HEAD}
您的网络服务器可以指向deploy/latest
,更新或多或少将是原子的。
我经常在生产中使用它,并且比在同一目录上解包有一些好处。
- 回滚很容易
- 您可以执行解包后过程,例如编译或安装依赖项,而无需中断当前部署
Tips
- 每次更新,附加到部署日志这说明了更新发生的时间以及它们的哈希 ID 是什么。这会导致回滚much easier.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)