您最喜欢SVN的web应用部署工作流是什么?

Translate

当前,我们正在使用一个稍微复杂的部署设置,其中包括一个远程SVN服务器,3个SVN分支(分别用于DEV,STAGE和PROD),通过补丁升级它们之间的代码等。我想知道在小型开发团队情况下您将如何使用该部署?

This question and all comments follow the "Attribution Required."

所有的回答

Translate

开发的主干和生产资料的分支(生产)。

在本地计算机上,我有一个VirtualHost指向中继分支,以测试更改。

对主干的任何提交都会触发一个提交钩子,该钩子会进行svn导出并同步到在线服务器的dev URL-因此,如果站点是stackoverflow.com,则此钩子会自动更新dev.stackoverflow.com

然后,我使用svnmerge在本地结帐中将选定的补丁从中继合并到生产中。我在本地计算机上又有一个VirtualHost指向生产分支。

当我将合并的更改提交到生产分支后,SVN导出挂钩再次更新了生产(实时)导出,并且该站点已启动!

来源
Translate

当我在一个小的开发团队中工作时(意义不大,意味着我,另一个程序员和老板),那真是一团糟。但是,我们发现分配一个“关守”类型的过程对我们有用。

网守是在该应用程序上完成最多工作的人(在这种情况下,我有2个项目是从头开始开发的,他有4个)。

基本上,每当他必须在我的项目上工作时,他都会通知我他正在工作,我将确保存储库是最新的且可构建的,然后他将撤回,进行更改,然后提交。他会告诉我它已经完成,我会撤职,构建和部署。如果发生数据库更改,我们将拥有一个“数据库更改”文件夹,其中包含所有可纠正数据库的脚本。

它显然有很多漏洞,但是该过程对我们有效,并且使我们无法相互构建。

来源
Translate

我对常见的标签/分支/树干组织没有任何麻烦。

正在进行的总体开发发生在主干中。

在适当的发行分支中进行生产中发行的维护。

与分支相关的对发布分支的更改将被合并。

当准备好要部署的新版本时,将从主干中对其进行标记,然后从该标记中创建一个分支。新版本的分支将与当前版本并行地签出到服务器。当需要切换时,路径变乱了(“ mv appdir appdir.old && mv appdir.new appdir”)。

然后,支持生产版本的开发人员svn将其工作副本切换到新分支,或者从中进行全新签出。

来源
Translate

三个分支听起来像是额外的工作。

可以通过在主干中使用不同版本的相关文件来解决环境差异。即database.yml和database.yml.prod。部署过程应具有环保意识,只需将每个环境文件复制到默认文件即可。

来源
Translate

一个简单的主干分支包含最新代码,然后每当我们上线时就剪切一个分支。这似乎很有效。只要为实时系统剪切的当前分支失败,您就可以轻松地转到上一个分支。而且,很容易修复当前存在的分支上的错误,并且由于该分支在剪切新分支时会有效地消失,因此只需要处理1个实际分支(然后将修复从那里合并到现场分支)。

来源
Translate

我们不使用分支来暂存与Web相关的内容;仅用于测试需要很长时间(阅读:一天以上)才能合并回主干的实验性内容。中继采用“持续集成”样式,表示(希望)工作中的当前状态。

因此,大多数更改直接提交给主干。 CruiseControl.NET服务器将在也运行IIS的计算机上自动更新,并具有可用的所有额外站点资源的最新副本,因此可以在内部对站点进行完整,干净的测试。测试后,文件将上传到公共服务器。

我不会说这是完美的方法,但是它很简单(因此适合我们相对较小的员工)并且相对安全,并且效果很好。

来源
Translate

Trunk包含当前的“主要”开发代码库。

开发人员通常会为任何中长期项目创建一个单独的分支,这可能会削弱主干代码库并妨碍其他开发人员。完成后,他将重新合并到行李箱中。

每次将代码推送到生产环境时,我们都会创建一个标记发布。 / tags中的文件夹只是版本号。

为了部署到生产环境,我们正在将SVN导出到暂存。当这令人满意时,我们使用一个简单的rsync部署到生产集群。

来源
Translate

我强烈推荐这本书(目前以粗体形式出现)持续交付,其中描述了基于持续集成原则(以及其他原则)的用于管理软件交付的完整流程。

我非常不喜欢分支和合并方法,因为它会变得非常混乱,并且非常浪费,因为您最终会花时间从事实际上没有任何新价值的活动。您已经开发,测试并修复了代码一次,为什么要创建一种情况(将代码复制到另一个分支),这需要您重做这项工作?

无论如何,避免分支和合并的方法是从主干构建可部署的工件,并在经过测试,分阶段等过程中推广已构建的工件(而不是源代码)。这样,您可以100%地确定自己是投入生产与您已经测试的相同。

如果您有不同的功能可能需要按不同的时间表发布,则更改实现方式的方法(使功能可配置,或者更好地模块化)可以帮助您保留一个开发干线。

来源
Translate

我们使用发布分支-对我们来说,这似乎比我们正在执行的功能分支更有效。

不要为不同的环境创建不同的分支。

来源
Translate

我个人在本地工作(开发),添加/修复功能,当我认为准备就绪时,我便致力于生产(生产)。在生产服务器上,我只是执行svn更新。

来源
Translate

我的工作与您目前遇到的情况类似。我的任务是找到一个“更好”的解决方案,并且它遵循以下原则。

活动分支表示服务器的当前状态。

任何开发工作都应在现场进行的分支中进行。这可能是一个人半小时的工作,也可能是一年的多团队项目。经常可以将生活中的更改合并到这些开发分支中。

在一件作品上线之前,来自现场的更改会再次合并,并将其标记为潜在发布。此发行版已在登台环境中进行了测试,如果通过测试,将从标签中获取新的实时版本。

如果效果更好,可以将几项工作合并到一个发行版中。

这意味着保持开发分支实时更新非常简单,并且如果删除了开发中的一部分工作,那么整理工作就很少了。

要从一个项目变为另一个项目,开发人员只需将其本地工作环境切换到另一个分支即可。

正如您所描述的,我们在系统上遇到的问题之一是DEV可能很快就无法使用PROD,因此您不能根据实际情况进行开发,并且很难发现跨阶段的交叉依赖关系。上面的解决方案解决了这些问题,同时仍然保持相当轻量级的状态。

来源
下一个问题:
sql -表的及时分发