我的问题是关于 vNext/Octopus 进程与基于 XAML 的进程的可维护性。或者更确切地说,因为不可能保持他们的理智让我相信我们正在做一些非常错误的事情。
鉴于:
- 微软推动逐步淘汰其 TFS XAML 构建以支持 vNext 构建
- Octopus Deploy 是一个流行的部署自动化框架
- 我们有许多基于 XAML 的构建,但开始移植到 vNext
- 使用 Octopus Deploy 自动部署
具体来说,我们在 QA 中进行了三种构建:
- 旧的基于 XAML 的编译生成生成要部署的工件
- 最终只是构建代码,将其压缩并放置在众所周知的位置
- 新的 vNext 编译构建生成要部署的工件
- 和上面一样
- 部署构建
- 每个部署环境的基于 XAML 的构建定义。这是特定部署的真实来源,包含所有配置 URL、连接字符串、证书指纹等。构建定义有 100 多个构建参数。每次设置新环境时,我们都会克隆现有的 XAML 构建定义并更改参数。
- 此构建解压构建工件,根据配置参数生成所有 web/app 配置文件,并使用 octo.exe 启动带有大量参数的 Octopus Deploy 并等待结束
- 八达通部署流程
- 从先前由 XAML 构建解包的构建工件创建 3 个包,以匹配三个部署区域 - Web 场、后台作业引擎集群和数据库
- 将相关包裹递送至相关触手。
- 触手解包并设置它们各自的包
- 每个部署环境的基于 XAML 的构建定义。这是特定部署的真实来源,包含所有配置 URL、连接字符串、证书指纹等。构建定义有 100 多个构建参数。每次设置新环境时,我们都会克隆现有的 XAML 构建定义并更改参数。
因此,如果我们有 50 个部署环境,那么我们就有 50 个 XAML 部署构建,每个构建都捕获各自环境的上下文。但是 XAML 部署构建将部署工作委托给 Octopus,在这里我们被迫拥有 50 个 Octopus 项目 - 每个部署一个。
为什么会这样?我们研究了仅拥有一个 Octopus 项目的选项,但该项目的发布版本是什么?为了让我们能够在海量版本中导航,发布版本必须包括:
- 已部署代码的构建版本,例如
55.0.18709.3
- 部署环境的名称,例如
atwfm
使用上面的例子,这给了我们55.0.18709.3-atwfm
,但有时我们想在同一个部署环境中部署相同的构建工件两次。但是唯一的 Octopus 项目已经有 release 了55.0.18709.3-atwfm
,那么如何在不删除已经存在的 release 的情况下再次部署55.0.18709.3
呢atwfm
?
我们找不到解决方法,因此,我们每个部署都有 Octopus 项目。
这太疯狂了,因为 Octopus 项目更新起来很痛苦。假设我们需要添加一个步骤——在 50 个项目中进行。互联网上有很多建议使用自动化来编辑多个项目。一点都不理想。
vNext,顺便说一句,也有同样的问题。如果我要将现有的 XAML 构建移植到 vNext,我最终会得到 50 个 vNext 部署构建。如果我决定添加一个步骤,我需要在所有 50 个构建中都这样做!!!!
请注意,XAML 构建没有这个问题(尽管它们还有很多其他问题),因为它们的过程与参数是分开的。我可以修改一次工作流,所有 XAML 构建现在都使用新的流程更改进行更新。
我的问题是——人们如何使用 vNext 和 Octopus,因为我们的流程让我发疯。一定会有更好的办法。
编辑 1
我想澄清一下。我们有时想要两次部署相同的构建工件。我们不会重新编译它们并重用相同的版本。不。我们已经有了方便的构建工件,构建版本在工件内部烘焙。我们可能希望第二次将其部署到同一环境中,因为例如,该环境中的某些数据库配置错误,现在已修复,我们需要重新部署。这并不意味着我们可以重新运行已经存在的 Octopus 版本,因为修复可能涉及调整相应 XAML 部署构建定义的部署参数。因此,我们可能会被迫重新启动 XAML 部署构建,它永远不会编译代码。
编辑 2
首先,为什么我们从 TFS XAML 构建而不是从 Octopus 驱动部署?历史原因。起初我们没有八达通。部署是由我们的临时代码完成的。当我们介绍 Octopus 时,我们决定保留 XAML deploymenet 构建有两个原因:
- 为了节省将具有所有大量部署参数的所有 XAML 部署构建迁移到 Octopus 的成本。也许这是一个错误的决定,也许我们可以自动化迁移。
- 因为 TFS 有更好的工具来显示测试结果。部署可能以部署冒烟测试结束,其结果必须在某处发布。我们看不到 Octopus 如何帮助我们发布结果,TFS 可以。
为什么要重新部署?例如,部署参数之一是证书指纹。更新证书时,必须更改此参数(我们确实可以自动更新 XAML 构建参数)。但我们经常发现它已经使用错误的指纹进行部署。因此,我们修复了部署并重新部署。或者,我们发现已部署应用程序的一些奇怪行为,并希望重新部署一些额外的跟踪/调试功能。