如何允许多种类型的部署?

How to allow for multiple types deployment?

在搜索 meaning of life 时,我偶然发现了一个博客 post,其中提到 您的部署策略不是您的架构 ,它只是实现细节,因此我们需要设计以允许不同的部署模式,无论您是想将系统部署到 1 个节点还是多个节点节点,或其他类型的结构。

Visual Studio 的最新版本是否提供了某种灵活性(除了 azure)以能够以各种策略部署服务?

例如,假设我有一个解决方案

    Acme Solution
    --Acme Startup Proj
    --Acme Service A.csproj
    --Acme Service B.csproj
    --Acme Service C.csproj

我希望能够将整个解决方案部署为 1 个解决方案,或者我希望能够部署 3 个单独的二进制文件,每个 microservice。

AcmeServiceA.exe
AcmeServiceb.exe
AcmeServicec.exe

Visual Studio在部署配置的灵活性方面给您带来了什么?

这实际上有点取决于具体用例如何实现所请求的 某种灵活性 以及您对 可接受级别的定义 这样的灵活性。

将这三个不同的可执行文件作为单独的微服务(服务 A、B、C)并作为 Web.Api 上下文中的完整服务(启动)的示例,您可以执行以下操作:

  1. 每个项目(服务 A、B、C)都可以设计为单独的 OWIN 自托管可执行文件(如 Use OWIN to Self-Host ASP.NET Web API 2 中所述)并提供一个或多个要公开的端点。

  2. 主项目(启动)也可以是 OWIN 自托管或常规 IIS Web.Api 引用三个项目(服务 A、B、C)并加载其各自的应用程序它自己的 Startup 例程中的端点(以及 iteself 的可选附加端点)。

然后,您可以在 Visual Studio 中使用单独的配置项目(或完全不同环境中的外部项目),并根据您的场景使用 Puppet、Chef 等部署技术进行部署。

您的代码将不受您实际希望执行的部署的影响,并且相应的配置将单独管理。

如果这不能回答你的问题,或者我误解了你的问题,你能澄清一下并提供更多细节吗?

部署技术会因构建应用程序的技术而异。举个例子,我假设我们正在处理 Web 服务或网站。

您指定了两种部署方案:部署单个项目(例如微服务)和部署所有项目(全面推出)。让我们从小处着手...

部署单个项目

要计划的主要事情是每个可部署的原子(这可能是一个项目或一个服务 + 数据库后端......小到你不希望将其拆分成更小的部署)。

对于web项目(无论是Web API项目还是其他类型),Visual Studio的内置选项一般可以概括为:WebDeployAzure,现在有了 .NET Core,Docker 图片。我不打算详细介绍每个问题,因为这些是不同的问题。但如果它们听起来很有趣,我可能会提到一些细节供您研究(我在概念上更熟悉 WebDeploy,所以我会经常提到它;但我不提倡或反对它)。

例如,如果您使用的是 WebDeploy,则可以让每个项目生成一个 WebDeploy 包。 (同样,查看此内容以了解有关 如何 执行此操作的更多详细信息)。可以精心设计此包以包含文件有效负载(site/service 文件)以及数据库有效负载或使用 WebDeploy 提供程序模型的其他子原子。 Visual Studio 对这种情况有很好的支持,并且有相关文档。

或者您可以生成 Docker 图像。根据我的理解(并且还缺乏 Docker 的经验),如果你想部署你的网络服务和数据库,它们应该在单独的容器中。您很快就会发现自己在 VS 之外自己构建这些。这不是一件坏事,一旦掌握了 Docker 听起来就非常灵活;但是你为此离开了 IDE。

无论如何,现在您可以部署原子包了。这是简单的部分。

部署解决方案

所以,您有很多这样的原子部署包。如何将它们全部推出?

好吧,此时 VS 并没有为您提供很多东西。并且很难证明 VS 应该在这里做什么。几乎每个组织都会提出略有不同的规则。您是从 CI 部署的吗?您是否创建包并将它们部署到发布管道中的不同环境?还是在云和热交换环境(如 Azure 部署槽)中进行?

VS 本机解决方案要么必须非常可配置(因此非常复杂),要么太简单而无法满足大多数客户的需求。 (顺便说一句,VS2010 中对 WebDeploy 的最初支持在第一个错误上出现了错误。它是极其可配置的,并且对于客户甚至产品团队来说很难围绕所有可能的场景进行思考。来源:我是曾几何时,该功能的 QA。)

实际上,此时您需要确定部署的方式和时间。您需要一些东西来协调 这些部署中的每一个。

VS 通常使用 MSBuild 进行编排。同样,我并不是在提倡将此作为您的编排平台(我实际上不喜欢它……它对您的项目配置没问题,但 IMO 不适合任务管理),但是 如果这是你想要使用的,它可以工作。如果您将它用于 Web 项目场景,它实际上非常简单。您可以构建解决方案并使用参数 /p:PublishOnBuild=true。如果你是使用 WebDeploy 直接发布,就大功告成了!如果您正在创建 WebDeploy 包,那么您仍然需要推送它们,但至少您已经一次性创建了它们。

如果您使用的是 WebDeploy 包,它们将各自生成一个用于发布的脚本。还有一些方法可以传递不同的 WebDeploy 参数,因此您可以重复使用相同的包(构建输出)来发布到不同的环境。但是,您必须编写自己的脚本以将所有这些组合到一个巨石部署中。

Docker 也是如此。您可能会得到一组图像,但您仍然需要一些东西来协调发布所有这些图像。 Kubernetes 等工具可以帮助您推出,或者在出现问题时回滚。

还有更通用的编排平台,例如 Octopus Deploy

多么不满意!

是的,没有针对大规模部署的开箱即用的解决方案,这有点糟糕。但即使有,它也不适用于 95% 的团队。 VS 提供的大部分功能足以让个人或非常小的开发团队将他们的代码发送到他们的服务器。任何规模较大的团队,您都可以从构建针对您的团队运作方式量身定制的系统中获得更好的收益。那里有很多工具,其中 none 在所有情况下都能完美运行。找到一个适合你的,你会没事的。最后,这一切都归结为推送文件和 运行 脚本。如果你不喜欢一个系统或工具,你可以尝试另一个。

如果您正在 Visual Studio 中寻求改进的部署体验,请查看 Flexera 的 InstallShield Limited Edition 内置解决方案(ISLE,http://blogs.msdn.com/b/visualstudio/archive/2013/8/15/what-s-new-in-visual-studio-2013-and-installshield-limited-edition.aspx)。对于那些寻求 Visual Studio 安装程序项目中没有的附加功能的客户来说,ISLE 是一个很好的解决方案,例如 TFS 和 MSBuild 集成、对创建新网站的支持和 ISO 19770-2 标记支持等。

VS2015: https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2015InstallerProjects

VS2017: https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects

使用设置和部署项目模板,您可以选择将解决方案中的所有程序集打包,或者使用设置、Web、CAB 或合并模块项目将每个程序集单独打包为微服务:

然后选择包含哪些程序集:

当我们谈论生命的意义时,这是部署(安装)专家关于它的两分钱 :-)- 答案(似乎 :-) 很长,但它将包含具体信息在哪里寻找每一个点..

首先,让我们声明部署并不是一件容易的事,尽管许多开发人员都希望看到它(并且作为一名部署专家,我经常观察到软件开发过程中的利益相关者实际上是这样想的-简单地说,直到发货前一天才忘记部署:-)

将它与可乐进行比较,以获得一个大胆而简单的例子。 "developers" 产生了液体,但在这里很容易意识到,工作还没有完成。 :-)

Visual Studio本身并没有真正支持部署策略。基于以下列表中提到的几个部署领域当然有很多技术,一些由微软提供帮助。 我要做的是为不同的客户或场景构建安装包,这些场景安装服务的子集,例如 client/server 场景或其他场景(请参见以下列表中的第 3 条。)


其次,您可能从其他答案中已经看到,部署不是部署。 部分地,这取决于人们是否将部署视为仅通过 MSBuild 生成二进制文件或部署到测试系统或部署到客户,例如通过更新生产网站或制作 DVD 或将可执行文件上传到更新网站...

有几个不同的领域肯定有关系,但每个编号的领域都很大很复杂,需要有自己的专家:

  1. 作为体系结构一部分的部署必须处理源和二进制结构和实体,例如项目和二进制结构(多少 .exe、.dll 文件,它们的依赖性如何,变体计划。 => 正如您所提到的,您在 (Visual Studio, 等) 解决方案、项目以及命名空间领域,尤其是在 WCF 领域,您有合同等,您有 (POC#) 接口等。您有 Nuget 或其他工具来解决和管理依赖项。 .NET 必须提供程序集的概念来处理这个问题,架构,例如如果在自己的程序集中部署接口和契约,如何处理client/server场景,程序集如何相互依赖,取决于你和架构..

  2. 作为本地 Windows 或其他操作系统集成的一部分进行部署:您必须考虑通常必须在哪些系统目录中放置某些文件或数据。您必须考虑共享 dll、共享数据、项目数据、临时数据、用户特定数据、注册表、文件系统、Windows 徽标要求、最佳实践、服务配置等

  3. 部署作为创建设置、拥有安装的过程,除其他外,还完成了所需的2 中提到的操作以及其他任务,例如图形安装前端(设置 GUI)、许可证确认、新功能部分、select 可选组件的离子(只需考虑 Visual Studio 设置)、uninstall/repair/modify 可能性等等。

  4. 部署为 devops process, e.g. part of 。这里有两个要点:从技术上讲,要有一个定义的过程,它在构建过程中自动执行 2. 和 3. 中提到的事情(或者 web 部署步骤)("post-build step")。
    这可以包括创建设置或设置层次结构 - 或者根本没有设置就可以工作)。第二个是让测试人员、开发人员和管理人员(甚至客户)至少每天早上或更频繁地看到最近每晚或每天构建的已安装示例,可能有几个部署变体(client/server?, basic/prof?) 或在不同的系统上。 你一半在开发者世界,一半在管理世界。 这里的要点通常不是像 3. 中那样创建复杂的设置,而是主要定义自己的 "pack" 和复制(和签名...等)流程,并将它们作为开发(以及测试和交货)过程。 PuppetChef 已经提到。

  5. 部署为 Web 或云部署(也可以是 devops 流程的端点)- 其他人已经说过一些,我将在这里省略细节,但一个重要的区别是,如果你是谈论部署到客户或部署到中间测试或登台系统。 也许让这一点值得除了 devops 之外的一件事是部署到在线服务器、服务器场或云有自己的挑战。

  6. 部署主要被视为分发可交付产品的管理过程,购买 and/or 自己的编程软件到公司及其子公司的所有数千台 PC 上。当然,有专门的工具可以做到这一点,包括更新策略、监控、许可证管理等等。你在管理世界,而不是开发者世界。 微服务 对主要用于安装和分发 "large" 软件包(如 MS Office 或 Oracle 等)的管理员来说将是一个新的高挑战。

    • 这个话题对于开发人员来说并不像看起来那么无聊。主要是因为开发人员和管理员这两个 "worlds" 正在合并。并且开发人员必须关心 "running the software in the real world" 的客户视图。 DevOps 仅仅是个开始。每个人都知道虚拟机,但现在我们有了软件定义的网络、虚拟应用程序、虚拟服务器场、云等。您可以通过依赖项定义部署架构,而无需任何编程,只需通过配置即可。所以部署应该是您的应用程序架构的一部分,但大多数情况下它还不够(足够)。事实上,到目前为止,管理视图几乎没有与软件视图集成 producers/developers。关于微软,Windows 团队在这里做了很多工作,尤其是。在服务器产品线中,这从未真正与开发团队 AFAIK 进行战略协调(直到现在这可能对每个软件商店都有效 :-)

目前,很多发布与 devops 或连续流行语相关的人对设置不是很有经验。建筑设置可以看作是其他必要步骤中的一项特殊技术。

鉴于您有兴趣了解更多关于 3.(设置)的信息: 如果您不想只复制可执行文件,而是想要拥有完整设置的功能,而不仅仅是复制,那么设置策略的一部分可以是使用自己的捆绑包设置(有时称为套件设置或引导程序设置)select离子特征。他们可以调用底层的小型设置,例如为您的微服务。

Visual Studio 本身不再支持像 MSI 这样的更复杂的设置类型,尤其是从来没有将设置分组到捆绑包中,可以是一个部署一堆(或一堆变体)服务的可能解决方案 - VS 有一些支持,例如 "ClickOnce" 部署,但这更多地用于数据库("smart")客户端而不是服务甚至微服务. 点击一次:https://msdn.microsoft.com/de-de/library/31kztyey.aspx

Visual Studio 中缺少 "real" 安装创建的替代品可以是 WiX 工具集,这是一个由 Microsoft 员工创建的开源项目。或 InstallShield Express(它是免费的,但是商业版本的有限变体)。 您可以使用两者创建 完整的 MSI 设置,这可能是 windows setup zoo 中最复杂的设置类型。

a) 当然,除了 MSI(又名 Windows 安装程序)之外还有其他安装类型,它们来自第三方供应商,这些供应商或多或少是专有的但更简单:,例如Nullsoft - NSIS and InnoSetup.
我不会提供用于创建单个 MSI 设置的链接,因为可以通过下一行中提供的创建 MSI 设置捆绑包的给定链接轻松找到它们:

b) 用于创建设置 select 并在 Wix "world" 中安装其他(定义的底层子集)的工具称为 "Burn":

使用 Burn 创建设置包: http://wixtoolset.org/documentation/manual/v3/bundle/

例如,您可以从 WiX 的创始人那里获得对此的特殊(付费)支持,他专门为此创建了一家公司: https://www.firegiant.com/wix/tutorial/net-and-net/bootstrapping/ 可以在 SA 上找到创始人 Rob Mensching 并回答专门的问题。

c) InstallShield 套件设置: 另一个是已经提到的工具 InstallShield,但是为此你需要他们的 InstallShield Premium 变体,它要花钱:
http://helpnet.installshield.com/installshield21helplib/helplibrary/SteCreatingSuites.htm

d) 设置工厂 : https://www.indigorose.com/setup-factory/

e) 我敢肯定,很多人会建议看一下 Docker。 虚拟应用程序不仅是设置,而且它们在 "installed" 状态下将自己与其他应用程序(如沙箱)隔离开来。 例如参见 [​​=20=]

f) 如果我不提及 APP-V 作为虚拟应用程序安装技术,该列表将不完整,它与 docker 共享一些但不是全部功能。但这些技术并不是真正用于编排多个交付,而是只交付一个应用程序。 微软定义了一种新的设置类型,称为 AppX。 特别是如果您想为 Windows 创建 "legacy"(完整)桌面应用程序,其中 MSI 设置是自 Windows 以来的新型应用程序的已知技术或存储应用程序,则您必须有所不同 8 (又名通用 Windows 应用程序又名 Windows 商店应用程序又名现代应用程序又名 Metro 应用程序)。

AppX: https://msdn.microsoft.com/en-us/library/windows/desktop/hh446767(v=vs.85).aspx AppX 针对比 MSI 更简单的设置类型。

通用 Windows 应用程序 (UWP)https://docs.microsoft.com/en-us/windows/uwp/get-started/whats-a-uwp

对于更详细的内容,我们必须了解您的更多要求。