我正在使用 Teamcity 自动(单击)部署到我们的 QA 环境中。目前正在部署内容项,但 QA 人员必须手动触发重新发布该站点。
无论如何使用 TDS、Sitecore Rocks 或其他工具在部署过程结束时自动重新发布。
我知道我可以将 Sitecore 配置为每 x 分钟自动发布一次,但我宁愿将其停用,因为 QA 也将执行负载测试,我不希望调度程序妨碍。
我正在使用 Teamcity 自动(单击)部署到我们的 QA 环境中。目前正在部署内容项,但 QA 人员必须手动触发重新发布该站点。
无论如何使用 TDS、Sitecore Rocks 或其他工具在部署过程结束时自动重新发布。
我知道我可以将 Sitecore 配置为每 x 分钟自动发布一次,但我宁愿将其停用,因为 QA 也将执行负载测试,我不希望调度程序妨碍。
我们通过在我们的日常构建和 QA 网站上设置一个触发发布的 ASPX 来做到这一点。然后构建有一个 Powershell 调用来触发它。我们已经使用 CruiseControl、TeamCity 和 Team Build 完成了这项工作。
部署文件和 TDS 后,TeamCity 的配置使用额外的构建步骤:
脚本来源:
$r = [System.Net.WebRequest]::Create('http://myqasite/SomePath/Publish.aspx'); $resp = $r.GetResponse();
我们发布页面的代码是这样的:
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);
}
}
在等待答案时,我在 twitter 上分享了这个问题,结果得到了 Stephen Pope 的指导(他的回应)他建议使用Sitecore Rocks 提供的PowerShell 增强功能,这需要一段时间(文档很少)但是我已经达到了我想要的结果:)
作为我发现的记录,以下内容作为我自己问题的潜在答案提供,但非常感谢 Jay S,如果不是这个我会使用的解决方案。
无论如何..在 Teamcity 构建中使用额外的构建步骤,我有以下内容:
脚本来源:
导入模块 '.\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 "脚本";
设置位置岩石:
Publish-SCDatabase;
魔法发生在 Publish-SCDatabase 命令行开关中,当您运行 Get-Help 时会显示一堆参数,事实证明只有两个参数可用-Name和-Mode
在上面的 vs-plugins 链接之外找到文档是不可能的,所以一点 .net 反射和大量的耐心表明参数具有以下选项:
当然,更好的文档,以及可能通过 Get-Help 命令行开关提供的附加信息会很好。如果 Rocks 项目是开源的,我可能会分叉该项目以生成附加帮助。
既然这个问题有两个很好的解决方案,我会让人们投票决定哪个是最佳答案,几天后我会检查投票并将投票最多的标记为接受的答案。
虽然这些都是很好的解决方案(自定义 aspx 和通过 Rocks 的 Powershell 之一),但它们都有一些缺点。
自定义 aspx 页面。除非你在你的 C# 解决方案上“去城里”进行发布,否则提供一种非常复杂的方式来更改发布目标、根节点和其他选项(例如智能、增量),并允许以尽可能灵活的方式调用这些选项,您将面临不得不定期更改代码以更改部署策略的风险。Richard R 在 Rocks 答案下方的评论承认了这一点。将其与某种脚本解决方案进行对比。它不会被编译代码的事实使其本身被砍掉和改变,甚至为了不同的目的而扩散成许多不同的脚本。
Powershell 通过 Rocks。在定制方面再次存在缺点。您仅限于该特定实现支持的命令行开关(以及最终的 CRUD 操作)。更不用说它是封闭源代码并且文档有限。
我可能需要详细说明我想到的可能需要满足的用例。如果在部署时仅发布部分内容树(如 /templates、/system、/layouts 等方面)对我们来说特别重要,该怎么办?在我们的部署中,我们有巨大的 /content 和 /media 库部分,因此更精细地了解为某些部署发布的内容对于加快部署至关重要。现在,虽然创建您自己的 /Publish.aspx 页面是完全可行的,该页面将指定根项目并为您执行这些(深度)发布,但通过某种脚本来完成它会更加优雅。不仅如此,还要考虑您可能希望在脚本部署和环境设置上自动化的无数其他操作,例如添加内容、应用工作流等
将这两者与 Adam Najmanowicz 的 Powershell Console/Extensions 进行对比。通过允许您在 sitecore 中开发 powershell 脚本,您可以通过脚本解决方案有效地创建您想要的任何内容,甚至可以从外部工具调用它,以便在 CI 服务器或协调器中执行该步骤: http:// blog.najmanowicz.com/2011/12/19/continuous-deployment-in-sitecore-with-powershell/