现场Sitecore网站的Git源控制策略

时间:2011-05-05 09:35:31

标签: asp.net git version-control sitecore

首先,我为这个问题的庞大规模道歉,因为我确信我提出的建议在实施方面是一个“大问题”,可能本身可能是三到四个单独的问题。我不会问我是不是迫切需要帮助。

我被赋予了修改公司风险管理程序的重要任务。

由于我们没有备份,也没有保护我们的数据,我已经决定,就像任何参与专业编程的人应该已经做的那样,我们将通过源代码控制来保护我们的工作。我目前使用Git在本地进行此操作,但其他人不使用源代码控制,最终我们失去了源代码控制提供的许多好处。我宁愿我们有一个系统,每个人都使用Git并强制执行规则,如果它不在源代码管理中,它就不会停留。显然,我们需要一个备份计划,但作为开发人员,我想首先要做的是在对备份解决方案进行排序之前对事物的编码方面进行整理 - 显然,对此的任何建议都非常受欢迎

我们运行一个带有SQL Server 2005后端的ASP.NET网站,运行Sitecore作为我们的首选CMS。在理想的世界中,我希望将此CMS站点的所有不断变化的部分置于源代码管理之下,包括数据库。

目前,我知道这不是最好的主意,我为Sitecore内置的所有子布局运行了一个解决方案。这是在源代码管理下,感谢Git我已经能够轻松添加分支并推送新功能和修复错误(使用Git-flow作为我的工作流程解决方案)。我对Git还是很新的,所以我没有在提交之外管理任何太复杂的东西,忽略某些文件等等。

除此之外,我还想使用源代码控制来获取源代码控制下的数据库内容。据我了解,您可以将Sitecore内容项序列化为文件系统中的一棵大树(如果我没记错的话,保存为.item文件?)。如果这是理想的解决方案,我也想将它们添加到源代码控制中,虽然我不知道它们将在文件系统中保存的确切位置。我现在的文件系统是这样的:

- Data      (Logs, indexes, etc - is this needed to be in source control?)
- Source    (Helper files, although occasionally modified)
- Website   (Containing all the files I edit, and other essential Sitecore stuff)

如前所述,我当前的存储库仅在我的系统上,它包含一个解决方案文件夹,其中包含一堆.ascx,.ascx.cs,.ascx.cs.designer和一两个奇数.aspx文件。这会使我的上传过程更容易,就像

一样

我想要输入的内容是为所有开发人员管理此功能的理想方式。尽管使用DVCS,我更愿意将实时服务器视为主存储库,并让所有其他开发人员从中推送和拉取它们。我们将使用git-flow workflow solution,因为它很好地符合我们的开发方式。显然,我担心的是正确设置它而不破坏当前在没有备份的服务器上的非常昂贵,高流量的站点。

有关服务器上有多少数据存储在存储库中的提示和建议,有关如何处理Sitecore中的序列化数据的指导以及可能如何使用源控件本身作为备份到单独存储库的方法会受到欢迎。这是我第一次为实时网站构建源代码控制系统/工作流程,所以对我最好的事情的任何指导和建议都会非常感激。


编辑:我将在此基础上尝试获取更多关于人们如何使用Git处理Sitecore的指南。

为了澄清自己,我不是在寻找一种方法来支持我的工作,而是让许多开发人员可以使用它来确保网站上的代码与中央存储库保持同步。例如,我之前已经引用过,我将使用git-flow来管理我的工作流程。原始仓库将存在于共享服务器上(在时间上可能是一个测试环境),并且所有开发人员都将拥有可以继续工作和推送的克隆。从这里开始,我希望能够将更改从共享驱动器上的原始存储库推送到实时服务器,如果发现错误则再次返回。我还想在我的回购中包含序列化的内容项。

4 个答案:

答案 0 :(得分:10)

查看HedgeHog的Team Development Soultions(3.0是最新版本)。当与Visual Studio,Sitecore Rocks,Team City(或其他构建服务器)一起使用时,它满足了您的许多需求。请访问http://hhogdev.com/了解详情。

答案 1 :(得分:4)

修订后的问题修改后的答案:

好的,当我们收到您的更多背景信息时,让我现在扩展我最初的想法。既然你说你只有一次Sitecore许可证而且没有单独的测试服务器等,我们总是可以稍微修改它,但仍然可以达到同样的效果。

如果您在运行实时Sitecore的同一台服务器上有多个存储库,该怎么办?如果您可以将Sitecore设置为在同一文件系统上使用不同的根/存储库,例如您将网址更改为http://yoursite.com/blahblah/test以在测试模式下运行Sitecore。这取决于您拥有的许可证类型,即它是否与特定机器相关联。无论如何,通过这种方式,您可以在将内容合并到主服务器并让其上线之前,在另一个分支(例如测试存储库中的开发分支)上测试您的站点。

因此,您可以在服务器上拥有一个裸存储库,每个人都可以从中推送。并且您可以在同一台服务器上有两个额外的非裸存储库,一个检出主分支,另一个检查开发分支。通过ssh登录,如果要在Sitecore站点的测试版本上测试新功能,可以在测试库中轻松运行“git pull”。当您对更改感到满意时,请合并到master并在您的裸仓库上推送掌握并以相同方式更新实时仓库。

我认为您需要尝试找到一种方法来拥有两个版本的网站,这样您就可以在更改生效之前对其进行测试。


原帖:

我强烈建议您将实时服务器与当前正在处理的内容分开,即另一个您推送工作的存储库(并从中拉出)作为集成存储库。这样,您可以在将代码推送到实时服务器之前集成代码并在本地(组织本地)进行测试,因此没有人会意外地将代码/数据库/任何内容直接推送到实时服务器。

我还建议您备份中央存储库的数据,换句话说,git应该用作版本控制系统,而不是备份系统。即使git可能会失败并导致存储库损坏,如果你还没有任何备份,你就会被吸烟。

此外,如果可能,尝试将实际网站内容与处理数据的逻辑分开,即尝试保持良好的模型/视图概念。这样,您可以使用独立于代码的测试数据库轻松设置测试环境,并且无需提交数据库。除非你真的想要提交它们当然:)

答案 2 :(得分:2)

当我退后一步,试着看看你在做什么时,它正在管理失去业务连续性的风险。例如如果您的网站出现故障,您最好还是希望能够使用备份来完全自动恢复该网站。

数据存储并不昂贵。真的,事实并非如此。即使你拥有庞大的数据集。因此,要求所有开发人员使用git是个好主意。许多组织都设置了一个git服务器,你只需推/拉到该服务器即可。如果您的解决方案具有良好且完整的测试,您将很快知道代码合并是否破坏了软件。如果没有,你可能应该使用一个中央git服务器供开发人员推/拉,然后使用一个单独的发行版集成服务器,它使用“git fetch”来合并&从中央服务器测试更改。

您已经概述了解决方案的各种组件,例如备份代码,数据,数据库,CMS条目等等。但是,您应该问的总体问题是,您是否已经收集了足够的东西,只能从备份中完全激活您的网站。如果你不能这样做,你做得还不够。如果你能做到这一点,你已经做得足够了。

在许可问题上,您需要更好的许可证。向Sitecore的所有者询问测试服务器的许可证,并告诉他们它是用于测试服务器的。一个好的供应商会意识到如果他们以这种方式帮助你,你更有可能续订你的订阅。或者,向您的财务人员询问另一个Sitecore许可证。如果您的基于Sitecore的CMS站点对您的公司来说是一个非常好的实用程序,那么另一个许可证将不会更改这个好处。

答案 3 :(得分:0)

我花了一个小时来学习关于Sitecore的内容(在今天之前从未听说过,很酷的工具),我想我明白你在做什么。我就是这样做的:

  1. 在Linux机器上设置一个受祝福的裸仓库(物理或虚拟,无所谓)。
  2. 在生产环境中初始化git仓库,在基础文件夹中,可以将所有源代码,配置文件和数据添加到仓库中。 (请记住设置user.name和user.email,以识别系统管理员负责生产更新。)
  3. 为每个架构创建一个SQL Server转储文件,并将所有转储放在本地生产存储库中的特殊标记文件夹中。
  4. 暂存所有文件(git add --all)并提交“初始提交,版本X.Y.Z ”注释,其中版本号是您认为当前部署的任何内容。
  5. 推送到祝福的回购。
  6. 在所有开发环境中克隆受祝福的回购。 (再次记住在提交中设置user.name和user.email以进行正确识别。)
  7. 开始使用git-flow。
  8. 注意步骤3,创建SQL Server转储并将其添加到repo。这将允许您回滚以后对数据库的任何更改。请记住,每次进行更改时都需要生成新的转储,但仅限于实际更改的模式。序列化您需要序列化的内容,并提交新的序列化以及架构更改。这样,git revert {commit_hash}就是恢复这些特定更改所需的全部内容(当然,不会忘记恢复数据库)。

    我希望这有助于直接或间接。

    P.S:我不知道你的数据库结构;如果配置存储在与用户数据相同的模式中,那肯定会使事情变得复杂,因为您不能只恢复先前的转储而不会丢失新的(并且可能是重要的)用户数据。我已经习惯了Ruby on Rails,其中模式修订版被编码为升级和降级;我希望你的框架提供类似的功能。