我一直在自己的解决方案(和回购)每个服务和只在部署时带的东西汇集成一个单一的应用程序。构建和部署通过PowerShell进行,可以作为CI/CD进程的一部分进行触发。只有更新的服务被修改,并且我使用当前日期/时间自动更新清单版本。
对于具有其他服务依赖项的服务,我已经在解决方案中引用了它们的项目,以便我可以轻松地进行调试,但只部署了主要服务。
在答案中增加更多细节,注释块太小。
我创建了一个目录,将发布版本放在正确的SF目录结构中。我将该版本的ApplicationManifest.xml复制到该目录中,尽管您可以将其作为回购并仅检查该文件。我有一个buildrelease.ps1,它枚举了回购并为发布配置运行msbuild。对于这种配置,我没有构建任何东西,只是要部署的服务(没有单元测试或其他用于调试的测试应用程序)。该版本根据日期和时间自动生成,例如, 2017_05_31_1702。这是服务清单中更新的内容,最终在应用程序清单中进行更新。创建成功后,服务清单中的解决方案目录更新回这样的:
$serviceManifestPath = "$solutionDir\src\${ServiceName}Service\PackageRoot\ServiceManifest.xml"
Set-ItemProperty $serviceManifestPath -name IsReadOnly -value $false
$serviceManifestXml = [xml](Get-Content $serviceManifestPath)
$ns = New-Object System.Xml.XmlNamespaceManager($serviceManifestXml.NameTable)
$ns.AddNamespace("ns", $serviceManifestXml.DocumentElement.NamespaceURI)
$serviceManifestXml.ServiceManifest.Version = $NewVersion
$serviceManifestXml.ServiceManifest.CodePackage.Version = $NewVersion
$serviceManifestXml.ServiceManifest.ConfigPackage.Version = $NewVersion
$serviceManifestXml.Save($serviceManifestPath)
接下来的MSBuild再次调用打包SFProj。
$buildResult = & $msBuild $sfproj /p:Configuration=Release /nologo /v:M /fl /flp:LogFile="msbuild.log;Verbosity=Normal" /nr:false /target:package
今天我只是建立具有修改服务清单的服务,所以您必须记住修改代码/配置时修改清单。我想改善这一点,但时间不够。
打包后,解决方案的发布{service name} Service.pkg被复制到发布文件夹。脚本完成后,生成的目录包含正确格式的所有已更改的服务。
下一个脚本是每个群集的部署脚本。我确信可以创建一个数据驱动的应用程序。这将连接到远程集群,测试软件包,将软件包上载到映像存储并根据应用程序是否已存在进行新的升级或升级。我有一个可以部署到我的单箱的版本,所以我可以使用本地配置来测试/调试所有运行在一起的服务。
为什么你不能把每个人放在自己的应用程序中的任何原因?无论如何,这就是我所做的。似乎工作得很好。 – Mardoxx
@mardoxx你能详细说明吗?你如何决定何时将它们组合在应用程序中而不是? – RPM1984
如果情况需要或不需要;)我不完全确定!我想如果你需要一个简单的可部署多租户解决方案,那么你会在一个应用程序中拥有一切。应用程序的服务可以独立升级,但对于每个服务在其自己的err soirce存储库中独立开发并不是非常友好。 – Mardoxx