2009-09-28 85 views
28

与Git + Heroku(Ruby on Rails)配合使用的良好部署策略是什么?使用分支策略与Heroku的良好Git部署?

目前我的工作方式是使用我的起源Git存储库:所有功能(或'故事')首先作为分支签出,然后与主合并并推送到原点。

任何推送到origin/master的内容都会触发一个脚本,将新的rails代码拖到临时区域(简单的rails webserver)。

当我需要将一个新的生产版本推送到Heroku时,我应该创建一个新的分支(称为类似production_version_121的东西),然后以某种方式将它推向Heroku?

理想情况下,我想选择以前的开发版本中的哪些功能,我应该将其包含到生产分支中...测试它,然后推送到Heroku。

例如,我可能不希望所有最新的代码被推到生产中。我可能想要功能“a”,我已经工作,功能“c”都以某种方式合并到生产中,而不包括需要更多调试的实验功能“b”。

N.B.我将首先尝试避免使用Capistrano,然后为现在手动获取某些内容。

想法?最佳实践?

回答

32

在Gemcutter项目中,我们只需要一个production分支。我们希望看到对生产现场的任何更改都会合并到分支,然后与部署:

git push heroku production:master 

staging分公司提供的临时网站(也是在Heroku)

+0

谢谢大卫!我很好奇,如果有人这样做。对,我是我只是用我的远程“主”作为生产..所以部署我只是继续做:git push heroku(当时间到来) 问题是,我还没有我想要的功能选择包括在生产部署中......我预计需要出现,在这种情况下,我将不得不在远程git服务器上启动合法的“生产”分支。下次我尝试使用:git push heroku production:master我认为它会抱怨,我需要使用“force”标志,以便heroku抛弃它跟踪的内容。 – Zaqintosh 2009-11-18 18:58:58

+0

我唯一的问题是,你是否在使用远程主机进行任何操作?或者你在分支机构工作,并在100%的时间内部署/合并分支机构? – Zaqintosh 2009-11-18 19:00:15

+0

是否需要强制取决于“生产”是否是远程主服务器当前存在的直接后代。 Gemcutter使用“主”分支作为主干。这是所有最新变化的地方。特征分支被创建,然后被合并回主干。有时候,个别提交或特征分支会合并到生产分支中,如果我们想要所有分支,有时候master会直接合并。 – 2009-11-19 18:41:38

7

有很多方法可以解决这个问题,这取决于你的喜好。

我会给你一个可能的策略:如果你已经有一个使用master的自动化staging设置,我会建议创建一个'production'分支。如果要将修补程序/功能提升为生产,只需将主题分支合并到“生产”分支中即可。

git checkout production 
git pull . my-topic-branch 
(resolve any conflicts) 

当您准备实际代码到生产服务器,你应该使用tag唯一的名称分支(可能带有时间戳)。然后,您只需将制作分支推送到Heroku。

git checkout production 
git tag release-200910201249 

我建议创建一个脚本或混帐别名自动为时间戳标记,因为使用一致的命名方案是非常重要的。我用的是这样的:

git config alias.dtag '!git tag release-`date "+%Y%m%d%H%M"`' 

,让我做只需键入git dtag当我想用标记时间戳的释放。

您可以使用git tag查看您的标签并使用git show release-1234查看它们。有关标签的更多信息,请运行git help tag。你也可以在标记上找到这个Github guide有帮助。我还建议阅读其他人的工作流程(这里是a nice writeup),然后挑选适合自己的工作流程。

+0

感谢您的回复! 我不太熟悉标记或它实际上做了什么...虽然我理解(大部分)您的建议是什么,但通过git命令有一个简短的示例或流程的运行会很好。 再次感谢! – Zaqintosh 2009-10-08 07:06:06

+0

我已经添加了用于标记的命令以及过去使用的方便别名。请注意,这些是用于本地存储库的。您可以使用'git push --tags'将标签推送到另一个回购站。 – 2009-10-20 17:08:21

+0

因此,让我们说你推一个release-xxxxxxxxx(使用'git push heroku production:master')并且它很好。你如何回滚到最近已知的良好修订版本?换句话说,你如何推送特定的标签? – brittohalloran 2011-11-07 22:58:35

16

曾经相似的目的自从我读了文森特Driessen的A successful Git branching model,我已经迷上了。我的整个公司(我们中的8个)现在已经在这个模型上进行了标准化,并且我咨询过的其他一些地方也开始使用它。

大多数人都表示他们已经做了类似的事情,发现很容易适应。

简而言之,你有2个永久的分支(主和开发)。大多数情况下,你只需要开发分支并将其合并为开发。当你进行产品发布和修补程序时,事情会变得更复杂一些,但是在阅读了这篇文章之后,它变得更加扎实。

甚至有一个命令行工具git-flow可以帮助你。