使用分支策略和Heroku实现良好的Git部署?

28

如何在使用Git + Heroku(Ruby on Rails)的项目中实现良好的部署策略?

目前,我使用我的Git仓库的方式是:所有功能(或“故事”)首先作为分支检出,然后与主分支合并并推送到远程仓库。

任何推送到远程仓库/主分支的更新都会触发一个脚本,将新的Rails代码拉取到暂存区(简单的Rails Web服务器)。

当我需要将新的生产版本推送到Heroku时,我应该创建一个新的分支(例如production_version_121),并将其推送到Heroku吗?

理想情况下,我希望能够挑选以前开发版本中要包含在生产分支中的功能,进行测试,并将其推送到Heroku。

例如,我可能不希望将所有最新的代码都推送到生产环境。我可能希望将我已经开发完成并合并到主分支中的功能“a”和功能“c”推送到生产环境中,而不包括需要更多调试的实验性功能“b”。

注意:我首先尝试避免使用Capistrano,暂时手动进行部署。

有什么想法?最佳实践?

3个回答

32
在Gemcutter项目中,我们只有一个名为production的分支。我们想要在生产环境中看到的任何更改都会被合并到该分支中,然后使用以下命令进行部署:
git push heroku production:master

staging分支在Heroku上的暂存网站中具有类似的作用。


谢谢David!我很好奇是否有人这样做。现在我只是使用我的远程“主”作为生产环境...所以要部署,我只需要继续执行:git push heroku(当时机成熟时)问题是,我还没有想要选择包含在生产部署中的功能...我预计需要出现这种情况,那时我将不得不在我的远程git服务器上启动一个合法的“生产”分支。下一次我尝试使用:git push heroku production:master,我假设它会抱怨并且我需要使用“force”标志,这样heroku就会扔掉它正在跟踪的内容? - Zaqintosh
我的另一个问题是,你是否会在远程主分支上进行其他操作?还是你只使用分支来部署/合并代码? - Zaqintosh
是否需要强制执行将取决于“production”是否是远程主机上当前存在的直接后代。Gemcutter使用“master”分支作为主干。这是所有最新更改的地方。创建功能分支,然后将其合并回主干。有时会将单个提交或功能分支合并到生产分支中,有时如果我们想要全部,则直接合并主分支。 - David Dollar
跟进问题:创建了一个“production-release-feb”分支,并将该分支重置--到最后提交到heroku production的提交。我想将特定的“feature”推送到heroku,因此我一直在“cherry-picking”与该功能相关的各种提交,并将它们带入那个生产分支进行heroku推送。目前为止一切都很顺利,但是当我以后(某个未来的生产推动)想要合并(或cherry pick?)我跳过的提交时会发生什么? 另外,我跳过的迁移怎么办?如果运行较新的迁移,rake是否会忽略这些迁移? - Zaqintosh

16

自从我阅读了Vincent Driessen的《Git分支模型成功实践》,我就非常着迷。我的整个公司(8人)现在已经将这个模型标准化,我咨询过的其他一些地方也开始使用它。

我向大多数人展示它时,他们都说他们之前已经在做类似的事情,并且很容易适应。

简而言之,您有两个永久分支(主分支和开发分支)。大多数情况下,您只需从开发分支创建分支,然后将其合并回开发分支。当您进行生产发布和热修复时,事情会变得有点复杂,但是阅读了几次后,它就成为了惯例。

甚至还有一个名为git-flow的命令行工具可帮助您。


7

有多种方法可以实现这个目标,真正选择哪一种方法取决于您的个人偏好。

我会给您提供一种可能的策略:鉴于您已经拥有一个使用主分支的自动化暂存设置,我建议创建一个“生产”分支。当您想要将修复/功能推广到生产环境时,只需将主题分支合并到您的“生产”分支即可。

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

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

git checkout production
git tag release-200910201249

我建议创建一个脚本或git别名来自动化时间戳的标记,因为使用一致的命名方案很重要。我使用类似于以下的东西:

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指南有关标记的帮助。我还建议阅读其他人的工作流程(这里是一个不错的写作),并选择适合您的内容。

谢谢回复!我对标记或它的实际作用不是很熟悉...虽然我大致理解了你的建议,但如果能通过git命令进行一个简短的示例或演示过程就太好了。再次感谢! - Zaqintosh
我已经添加了标记命令和一个我过去使用过的方便别名。请注意,这些是针对本地存储库的。您可以使用“git push --tags”将标记推送到另一个存储库。 - ry.
假设您已经通过 git push heroku production:master 推送了一个名为 release-xxxxxxxxx 的版本,但出现了问题。如何回滚至上一个已知的良好版本?换言之,如何推送特定的标签? - brittohalloran

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