如何管理包含多个包的系统版本?

问题描述 投票:0回答:1

我们需要做的是能够找到一个一致的解决方案来创建包含多个包的单个包(我们称之为主包),检查这些包是否彼此兼容并对它们进行版本控制。

我们需要一起发布的软件包有很多(15+),并且基于不同的技术,其中许多软件包相互依赖,因此将它们合并到一个存储库中并不是一个可能的解决方案。

我们需要考虑用于 CI/CD/Artifacts 的工具的最终限制,即 Azure Devops 和 Yaml 管道。

目前,我们正在为每个要发布的组件生成一个通用包,并且我们正在使用 gitflowsemver(x.y.z 版本)对它们进行版本控制。

现在的主要问题是试图找到一种方法以简单的方式将所有这些部分组合在一起并管理这些部分的兼容性。

这些包的分发超出了这个问题的范围,我们只需要创建包含所有内容的包,安装/分发过程已经就位。

我们现在在做什么

目前流程是这样的。

对于每个组件,我们正在创建一个具有 x.y.z 版本的通用包。

当我们想要创建主包(也是通用包)时,我们在 Azure Devops 上有这个管道,其参数是每个组件的所有版本,默认情况下下载包的最新版本(使用“*”通配符,因此它不支持包含破折号的版本,仅支持 x.y.z)。使用latest作为默认参数使管道易于每个人运行。

这种方法的问题在于:

  1. Azure Devops 管道参数不提供显示每个包的可用版本下拉列表的方法,因此每次我们需要运行构建时都必须打开 Azure Artifacts feed 来选择某个版本并不是一个可行的解决方案

  2. 我们无法检查组件是否相互兼容,只能希望所有最新版本都可以一起工作

处理我们实现的第一个问题的方法是在包含管道定义的存储库上创建一个发布分支,并使用固定版本作为管道的默认参数,但如果我们需要更改版本,我们仍然需要制作一个新的提交,仍然需要大量的手动处理。

我想到的一些解决方案

可以使用

CalVer YYYY.MM.Build 来对主包进行版本控制,因为这是一个独立的系统。

为了解决兼容性问题,我们可以为每个组件编写一个清单文件,并在其中定义对其他组件所需版本的约束。

示例:

如果组件 C 依赖于 B 并且 B 依赖于 A
在C的清单文件中我们说B必须是1.*,在B的清单文件中我们说A必须是2.0.0

但在此解决方案中,我们可能需要进行提交并发布 C 或 B 的新版本,以提升已接受的版本。

为了解决用户体验的问题,我们可以创建一个外部门户,这样我们就可以创建某种下拉列表,以便于版本选择(市场上已经有解决方案来解决这个问题了吗?)。在此解决方案中,我们还可以集成对清单文件的检查,这样我们就可以事先查看主包本身是否一致。

我认为解决用户体验问题的另一个解决方案是创建一个单独的存储库,在其中编写一个清单文件,在其中定义要打包在一起的所有包及其版本,并以某种方式将其传递到管道。通过这种方式,我们解决了必须检查 foreach 运行 azure 工件提要的问题,但我们仍然需要进行大量手动处理,并且它没有提供检查包兼容性的解决方案(除了在管道本身)。

azure-devops package continuous-integration release release-management
1个回答
0
投票
不同语言编写的包可能支持不同的包管理器(如

NuGet

npm
Maven
Python
等)。
默认情况下,这些包管理器通常不能相互包含/组合。


针对您的情况,作为解决方法,您可以尝试以下步骤,看看是否可以满足您的需求:

    使用与每个包管理器对应的相关 CLI 来构建和打包每种类型的包。打包每个包时,可以指定包版本。
  1. 将所有生成的包文件放入一个文件夹中。
  2. 将上述文件夹中的所有包发布为通用包。您可以为通用包设置版本。
© www.soinside.com 2019 - 2024. All rights reserved.