我将每个服务保留在其自己的解决方案(和存储库)中,并仅在部署时将其整合到单个应用程序中。构建和部署通过 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
今天我只构建具有修改后的服务清单的服务,因此您必须记住在修改代码/配置时修改清单。我想改进一下,只是时间不够。
打包后,将解决方案的release{服务名称}Service.pkg复制到release文件夹中。脚本完成后,生成的目录将以正确的格式包含所有已更改的服务。
下一个脚本是每个集群的部署脚本。我确信可以创建一个数据驱动的系统。这将连接到远程集群,测试包,将包上传到映像存储,并根据应用程序是否已存在进行新的或升级。我有一个可以部署到我的一体机的版本,这样我就可以使用本地配置来测试/调试一起运行的所有服务。