在TDS CI部署结束时自动发布Sitecore内容

时间:2012-10-15 13:11:04

标签: continuous-integration sitecore sitecore6 tds

我正在使用Teamcity自动化(单击)部署到我们的QA环境中。目前正在部署内容项目,但QA人员必须手动触发重新发布网站。

无论如何都使用TDS,Sitecore Rocks或A.N.Other工具在部署过程结束时自动重新发布。

我知道我可以将Sitecore配置为每x分钟自动发布一次,但我宁愿将其停用,因为QA也会执行负载测试,我不希望调度程序妨碍。

3 个答案:

答案 0 :(得分:10)

我们通过在每日构建和触发发布的QA网站上设置ASPX来实现此目的。然后构建有一个Powershell调用来触发它。我们已经使用CruiseControl,TeamCity和Team Build完成了这项工作。

TeamCity配置

在部署文件和TDS之后,TeamCity的配置使用了额外的构建步骤:

  1. 亚军类型: Powershell
  2. 步骤名称:触发发布到Web DB
  3. Powershell运行模式: x64
  4. 工作目录: [无价值]
  5. 脚本:源代码
  6. 脚本来源:

    $ r = [System.Net.WebRequest] :: Create('http://myqasite/SomePath/Publish.aspx'); $ resp = $ r.GetResponse();

  7. 脚本执行模式:使用“-Command - ”参数将脚本放入Powershell stdin中
  8. Publish.aspx

    我们的发布页面的代码是这样的:

        string full = Request.QueryString["full"];
    
        // Set up the publish mode
        PublishMode publishMode = PublishMode.Smart;
        if (!string.IsNullOrWhiteSpace(full) && (full == "1" || full.Equals("true", StringComparison.InvariantCultureIgnoreCase)) ) {
            publishMode = PublishMode.Full;
        }
    
        using (new Sitecore.SecurityModel.SecurityDisabler()) {
            //We need the target database
            var webDb = Sitecore.Configuration.Factory.GetDatabase("web");
    
            //source db
            var masterDb = Sitecore.Configuration.Factory.GetDatabase("master");
    
            try {
                foreach (Language language in masterDb.Languages) {
                    //loops on the languages and do a full republish on the whole sitecore content tree
                    var options = new PublishOptions(masterDb, webDb, publishMode, language, DateTime.Now)
                                  {RootItem = masterDb.Items["/sitecore"], RepublishAll = true, Deep = true};
                            var myPublisher = new Publisher(options);
                            myPublisher.Publish();
                }
            }
            catch (Exception ex) {
                Sitecore.Diagnostics.Log.Error("Could not publish the master database to the web", ex);
            }
    
        }
    

答案 1 :(得分:7)

在等待答案时,我在推特上分享了这个问题,这得到了斯蒂芬·波普( his response )的指导。 他建议使用Sitecore Rocks提供的PowerShell enhancements,这需要一段时间(文档很薄)但我已经达到了我所追求的结果:)

作为我发现的记录,以下是我自己的问题的潜在答案,但非常感谢Jay S,如果不是这样的话,我会使用它的解决方案..

反正.. 使用Teamcity构建中的其他构建步骤,我有以下内容:

  • 亚军类型:Powershell
  • 步骤名称:发布网站
  • Powershell运行模式: x64
  • 脚本:源代码
  • 脚本执行模式:使用“-Command - ”参数将脚本放入powershell stdin中
  • 其他命令行参数: -ExecutionPolicy Unrestricted
  • 脚本来源:

    import-module'。\ build-modules \ sitecore \ sitecore.psd1';
    new-psdrive -name“rocks”-psp SitecoreRocks -root“”-host“%QA.Url%” - usr“%QA.sitecore.user%” - pwd“%QA.sitecore.password%” - databasename“master”-scope “脚本”;
    设置位置岩石:
    发布-SCDatabase;

神奇发生在Publish-SCDatabase命令行开关中,当你运行Get-Help时会显示一堆参数,结果只有两个参数可用 -Name - 模式

在上面的vs-plugins链接之外找到文档是不可能的,因此一些.net反射和良好的patiense表明参数有以下选项:

  • -Name 运行发布的数据库的名称(默认为psdrive数据库
  • -Mode 使用以下可用选项设置comandlet的发布模式:
    • 0:重新发布
    • 1:增量
    • 2:智能
    • 3:重建

当然,更好的文档,以及可能通过Get-Help命令行开关的其他信息会很好..如果rock项目是开源的,我可能已经分叉项目以产生额外的帮助。

现在这个问题有两个非常好的解决方案,我会让人们投票决定哪个是最好的答案,在几天内我会检查投票并将投票最多的标记作为接受的答案。

答案 2 :(得分:5)

惠斯特这些都是很好的解决方案(定制的aspx和通过Rocks的Powershell),它们都有一些缺点。

  1. 自定义aspx页面。除非你在C#解决方案上“去城镇”进行发布,否则提供一种非常复杂的方式来更改发布目标,Root节点和其他选项(例如智能,增量),并允许以尽可能灵活的方式调用这些选项,您可能需要更改代码以定期更改部署策略。 Richard R在Rocks下面的评论回答了这一点。与某种脚本解决方案形成对比。它不会被编译成代码的事实有助于被切割和更改,甚至扩散到许多不同的脚本中用于不同的目的。

  2. Powershell via Rocks。同样,在定制方面存在缺点。您仅限于该特定实现支持的命令行开关(以及最终的CRUD操作)。更不用说它是封闭源并且文档有限。

  3. 我可能需要详细说明我可能需要照顾的用例。如果在部署中仅发布内容树的一部分(/ templates,/ system,/ layouts等方面)对我们来说特别重要怎么办?在我们的部署中,我们拥有大量/内容和/媒体库部分,因此更加细化某些部署的发布内容对于加快部署至关重要。现在,尽管创建自己的/Publish.aspx页面是完全可行的,它将指定Root项目并为您做这些(深层)发布,但通过某种脚本执行它会更加优雅。不仅如此,还要考虑您可能希望在脚本化部署和环境设置上实现自动化的无数其他操作,例如添加内容,应用工作流e.t.c。

    将这两者与Adam Najmanowicz的Powershell控制台/扩展程序进行对比。通过允许您在sitecore中开发PowerShell脚本,您可以通过脚本化解决方案有效地创建任何您想要的内容,甚至可以从外部工具调用它,以便在CI服务器或协调器中实现这一步: http://blog.najmanowicz.com/2011/12/19/continuous-deployment-in-sitecore-with-powershell/