Git:网站开发的推荐设置

9
最近两周我一直在努力在我们的办公室实施Git。与其说是缺乏文档,更多的是例子、教程和Git的各种用途让我对Web开发中推荐的设置感到困惑。
我认为我有一个不错的设置方案,但在深入了解另一种结构之前,我想请教更有经验的人。我的设想如下:
- 工作站推送到本地暂存服务器(A) - 本地暂存服务器使用gitolite以正确划分角色 - 钩子自动将任何更改推送到生产服务器(B)
如下图所示: enter image description here 这个设想合理吗?我们有各种规模较小的PHP网站,没有非常复杂的内容。我有以下疑问:
- 我应该使用什么样的“钩子”来处理(B)? - 我是否也应该在生产服务器上运行gitolite?我觉得不需要,因为毕竟只有一个用户会上传东西到服务器(即暂存服务器上的钩子),但我不确定。 - 我的起点是:我们所有的网站都在生产服务器上,而还没有在暂存服务器或工作站上。在初始设置时,有什么方便的方法可以将它们“拉”到暂存和工作站上?
以下是一些额外的想法,目前不是非常重要,但如果您恰好了解更多,请分享您的想法:
- 为了简单起见,我希望能够从工作站运行git push,并同时更新暂存服务器和生产服务器。但有时在上线之前只更新暂存服务器并在那里检查事物可能会很有用。有什么简单的解决方案吗? - 实际上,我们不仅有一个而是几个不同的生产服务器。但只有一个暂存服务器。有没有一种配置不同生产服务器的方法,使Git自动将它们推送到正确的服务器?
感谢您提前分享您的想法!

推送至生产服务器的标准是什么?挂钩是否检查特定的提交信息? - citizen conn
3个回答

3
您不希望在生产网站服务器上运行Git服务器。您真的也不想在生产服务器上保存Git存储库文件。个人认为,保持简单并将部署过程与SCM过程分开非常重要。
因此,我想我不会回答你关于Git的问题,但是在所有我的Web项目中我都使用Git,并且这是我使用的部署设置类型:
通常我仅使用Git进行SCM,并使用内部服务器托管存储库(这很可能是与暂存服务器相同的机器)。
对于部署,我通常使用rake脚本,因为我喜欢Ruby。但bash脚本也可以胜任。Bash版本应该像这样:
# deploy_staging.sh
rsync -va --delete --exclude-from excludes.txt ./ stagingserver:/htdocs/www.mysite.com/

# deploy_prod.sh
rsync -va --delete --exclude-from excludes.txt ./ realserver:/htdocs/www.mysite.com/

# deploy_all.sh
bash deploy_staging.sh || exit $?
bash deploy_prod.sh

# excludes.txt
.git
deploy_*.sh
excludes.txt

获得在服务器上发布权限的开发者,他们的SSH密钥将被添加到服务器机器上相应的账户中。

操作简单易复制,无需繁琐地设置钩子,所有内容都被妥善地包含在代码库中,您可以清晰地控制部署内容,并且可以在具有正确网络访问权限的任何位置查看并运行部署。


1
只要你的根目录没有被 Web 服务器服务,那么在根目录中放置 .git 文件是可以的。 - Kzqai
我会尝试在暂存和生产环境中都使用git服务器进行设置,但如果这变得太困难,我认为你的解决方案将成为我的逃生通道。谢谢。 - user852091
是的,我可能是一个不寻常的例子,因为我有很多很多小项目,而不是只有几个大项目,所以随着时间的推移,我更喜欢那些可以在几分钟内从头开始复制的方法。祝你在服务器设置方面好运! - avh4

3

我有一个类似的设置,我更喜欢使用多个远程。所以,我不会使用钩子,而是将“prod”添加为一个远程,也将“uat”添加为一个远程。这样,如果我想要推送到生产环境,我可以执行以下操作:

git push prod
git push uat

我只拉取到我的生产环境,但将其作为自己的存储库也很有用。这是因为在生产环境存储库上处理非变基推送有时会很棘手。 - Kzqai
@citizen conn: 有道理,谢谢。不过我有一个问题:你不觉得为uat和prod都要提交两次很烦吗?如果在推送之前有很多小的提交,那么这样做会变得有些无聊,或者不是吗? - user852091
1
我是说,是的,这可能是可以的。但是我不会每次提交时都强制推送...我确保在编辑时可以实时查看更改。然后我只需要在一天结束时将更改推送到暂存区,一周结束时将其推送到生产环境 : ) - citizen conn
如果你还没有在本地计算机上进行开发,那么一定要尝试一下。 - Kzqai

3
  • 如何为(B)使用“hook”?

您应该使用post-receive或post-update hook来实现。

  • 我是否也应该在生产服务器上运行gitolite?我觉得不应该,因为毕竟只有一个用户会上传东西到服务器(暂存服务器上的钩子),但我不确定。

出于您提到的原因并不是强制性的,但由于gitolite非常简单易用,因此使用它也无妨。

  • 我们的起点是:所有网站都在生产服务器上,而尚未在暂存服务器或工作站上。在初始设置时,“拉取”它们到暂存和工作站的方便方法是什么?

对于每个网站,您可以简单地执行这些命令。

cd /path/of/project
git init
# optionally create and edit your .gitignore file before the next step
git add .
git commit

然后从您的演示服务器运行一个 git clone 命令。

  • 为了简单起见,我喜欢能够从工作站运行 git push 并更新演示服务器和生产服务器。但有时在上线之前只更新演示服务器并在那里检查一下可能会很有用。是否有简单的解决方案?

我看不出这个任务的简单解决方案,但我不喜欢您的自动化生产部署解决方案,因为某些问题可能会导致生产网站瘫痪,所以我更喜欢citizen conn多远程解决方案。使用 gitolite 和权限处理,您可以更好地管理这些事情。每个人都可以推送到演示服务器,但是只有少数人可以推送到生产服务器。

  • 实际上,我们不止一个,而是有几个不同的生产服务器。但只有一个演示服务器。是否有一种配置不同生产服务器的方法,使得 git 自动将它们推送到正确的服务器?

您可以将生产服务器地址存储在项目中的某个文本文件中,然后在 git 钩子中使用该文件的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接