我们最喜欢使用SVN进行Web应用程序部署的工作流程是什么?
当前,我们正在使用一个稍微复杂的部署设置,其中包括一个远程SVN服务器,3个SVN分支(分别用于DEV,STAGE和PROD),通过补丁升级它们之间的代码等。我想知道在小型开发团队的情况下如何使用部署?
解决方案
回答
一个简单的主干分支包含最新代码,然后每当我们上线时就剪切一个分支。这似乎很有效。每当为实时系统剪切的当前分支失败时,我们都可以轻松地转到上一个分支。而且,很容易修复当前存在的分支上的错误,并且由于该分支在剪切新分支时会有效地消失,因此只需要处理一个真实分支(然后将修复从那里合并到现场分支)。
回答
当我在一个小的开发团队中工作时(意思是我,另一个程序员和老板),那简直是一团糟。但是,我们发现分配一个"关守"类型的过程对我们有用。
网守是在该应用程序上完成最多工作的人(在这种情况下,我有2个项目是从头开始开发的,他有4个)。
基本上,每当他必须处理我的项目时,他都会通知我他正在工作,我将确保存储库是最新的且可构建的,然后他将撤回,进行更改并提交。他会告诉我它已经完成了,我将撤职,构建和部署。如果发生数据库更改,我们将拥有一个"数据库更改"文件夹,其中包含所有可纠正数据库的脚本。
它显然有很多漏洞,但是该过程对我们有用,并且使我们无法相互构建。
回答
三个分支听起来像是额外的工作。
可以通过在主干中使用不同版本的相关文件来解决环境差异。即database.yml和database.yml.prod。部署过程应具有环保意识,只需将每个环境文件复制到默认文件即可。
回答
我们不使用分支来暂存与Web相关的内容。仅用于测试需要很长时间(阅读:超过一天)才能合并回主干的实验性内容。中继采用"持续集成"样式,表示(希望)工作中的当前状态。
因此,大多数更改直接提交给主干。 CruiseControl.NET服务器将在也运行IIS并具有可用的所有额外站点资源的最新副本的计算机上自动更新,因此可以在内部对站点进行完整,干净的测试。经过测试后,文件将上传到公共服务器。
我不会说这是完美的方法,但是它很简单(因此适合我们相对较小的员工)并且相对安全,并且工作正常。
回答
用于开发的主干,以及用于生产资料的分支(生产)。
在我的本地计算机上,我有一个VirtualHost指向中继分支,以测试我的更改。
对主干的任何提交都会触发一个提交钩子,该钩子会进行svn导出并同步到在线服务器的dev URL,因此,如果站点是stackoverflow.com,则此钩子会自动更新dev.stackoverflow.com。
然后,我使用svnmerge在本地结帐中将选定的补丁从中继合并到生产中。我在本地计算机上又有一个VirtualHost指向生产分支。
当我将合并的更改提交到生产分支时,SVN导出挂钩再次更新了生产(实时)导出,并且该站点已启动!
回答
我们使用发布分支对我们来说似乎比我们正在执行的功能分支更有效。
不要为不同的环境创建不同的分支。
回答
Trunk包含当前的"主要"开发代码库。
开发人员通常会为任何中长期项目创建单个分支,这可能会削弱主干代码库并妨碍其他开发人员。完成后,他将重新合并到行李箱中。
每次将代码推送到生产环境时,我们都会创建一个标记发布。 / tags中的文件夹只是版本号。
为了部署到生产环境,我们正在将SVN导出到暂存。当这令人满意时,我们使用一个简单的rsync部署到生产集群。
回答
我亲自在本地工作(开发),添加/修复功能,当我认为准备就绪时,我便致力于主干(生产)。在生产服务器上,我只是执行svn更新。
回答
我的工作与我们目前遇到的情况类似。我的任务是找到一个更好的解决方案,它遵循以下原则。
活动分支表示服务器的当前状态。
任何开发工作都应在现场进行的分支中进行。这可以是一个人半小时的工作,也可以是一年的多团队项目。经常可以将生活中的更改合并到这些开发分支中。
在一件作品上线之前,来自现场的更改将再次合并,并将其标记为潜在发行版。此发行版已在登台环境中进行了测试,如果通过测试,将从标签中获取新的实时版本。
如果效果更好,可以将几项工作合并到一个发行版中。
这意味着保持开发分支实时更新非常简单,如果放弃了开发中的工作,那么整理工作就很少了。
要从一个项目变为另一个项目,开发人员只需将其本地工作环境切换到另一个分支即可。
正如我们所描述的,我们在系统上遇到的问题之一是DEV可能很快就无法使用PROD,因此我们不是在实时进行开发,并且很难在阶段之前发现交叉依赖关系。上面的解决方案解决了这些问题,同时仍然保持相当轻量级的状态。
回答
我对常见的标签/分支/树干组织没有任何麻烦。
总体上正在进行的开发发生在主干中。
在适当的发行分支中进行生产中发行的维护。
与分支相关的对发布分支的更改将被合并。
当准备好要部署的新版本时,会从中继中对其进行标记,然后从该标记中创建一个分支。新版本的分支将与当前版本并行地签出到服务器。当需要切换时,路径变乱了(" mv appdir appdir.old && mv appdir.new appdir")。
然后,支持生产版本的开发人员svn将其工作副本切换到新分支,或者从中进行新的签出。
回答
我极力推荐这本书(目前正在粗略地写)《持续交付》,该书描述了基于持续集成原则(以及其他原则)的管理软件交付的完整过程。
我非常不喜欢分支和合并方法,因为它会变得非常混乱,并且非常浪费,因为我们最终会花时间在实际上没有带来任何新价值的活动上。我们已经开发,测试并修复了代码一次,为什么要创建一种情况(将代码复制到另一个分支),这需要我们重做这项工作?
无论如何,避免分支和合并的方法是从主干构建可部署的工件,并在经过测试,分阶段等过程中推广已构建的工件(而不是源代码)。这样,我们可以100%地确定自己是投入生产与我们所测试的是一样的。
如果我们有不同的功能可能需要按不同的时间表发布,则更改实现方式的方法(使功能可配置,或者更好地模块化)可以保留一个开发干线。