将模块发布到专用注册表

已完成

现在你已了解什么是 Bicep 注册表,以及它如何为在组织中共享模块提供帮助。 在此单元中,你将了解如何将模块发布到专用注册表。

模块路径

当你以前使用模块时,你很可能已经使用了模块的文件路径在模板中引用它。 使用模块和专用注册表时,需要使用不同的模块路径,从而使 Bicep 知道如何在注册表中找到该模块。

下面是专用 Azure 容器注册表中模块的示例路径:

Diagram that shows the syntax for a module path.

此路径包含四段:

  • 架构:Bicep 支持多种模块类型,称为架构。 使用 Bicep 注册表时的方案为 br
  • 注册表:注册表名称,其中包含要使用的模块。 在上面的示例中,注册表名称为 toycompany.azurecr.io,即容器注册表的名称。
  • 模块标识符:注册表中模块的完整路径。
  • 标记:标记通常表示模块的版本,因为单个模块可发布多个版本。 你将在下一节中详细了解标记和版本。

发布自己的模块标识符时,请使用指示模块用途的有意义的标识符。 你可以选择使用“命名空间”,在其中使用斜杠 (/) 来区分名称的各个部分。 但是,Azure 容器注册表和 Bicep 不了解层次结构, 它们将模块标识符视为一个值。

标记和版本

标记表示模块的版本。 注册表中的一个模块可以拥有多个版本。 所有版本共享一个模块标识符,但拥有不同标记。 使用模块时,需要使用标记来指定要使用的版本,以便 Bicep 知道要检索的模块文件。

建议对模块的版本管理进行仔细的规划。 需要完成两项关键的决策:要采用的版本控制方案和版本控制策略。

版本控制方案

版本控制方案决定了生成版本号的方式。 常见版本控制方案包括:

  • 可将基本整数用作版本号。 例如,第一个版本可称为 1,第二个版本可称为 2,依此类推。 或者,可以向每个版本号添加前缀,例如 v1v2
  • 日期也是用于编写版本号的理想选择。 例如,如果你在 2022 年 1 月 16 日发布了模块的首个版本,则该版本可命名为 2022-01-16(采用 yyyy-mm-dd 格式)。 若在 3 月 3 日发布另一个版本,可将其命名为 2022-03-03
  • 语义化版本控制是软件中常用的版本控制系统,其中单个版本号包含多个部分。 每一部分都代表着关于变化性质的不同信息。

尽管你可以采用任何自己喜欢的版本控制方案,但最好选择可按合理顺序排序的方案。 数字和日期通常是很好的选择。

注意

Azure 容器注册表存储每个标记的创建日期。 即使不采用基于日期的版本管理方案,仍可查看此信息。

版本控制策略

使用模块,可以灵活地选择何时创建新版本或更新现有版本。 例如,通过创建和发布名为 latest 的单个版本。可以有效地选择退出版本控制。 每当需要更改模块时,只需更新该版本即可。 尽管此策略可行,但并不是一种好的做法。

相反,如果要对现有模块进行不影响其使用方式的小更改,则最好不要创建新的版本。 如果这样做,就需要告知使用该模块的所有人新的版本号。

下面是一个通常效果不错的版本控制策略:

  • 每当对模块进行了重大更改时,请创建一个新版本。 重大更改包括可能会对使用此模块的人员造成影响的任何内容。 例如,将其他资源添加到模块或更改资源的属性。
  • 每当对模块进行微小更改(有时称为“修补程序”)时,请更新现有模块版本。
  • 删除不再相关或者你不希望任何人使用的旧版本。

提示

请考虑使用模块的用户,且务必考量他们对模块的预期。 如果有人在多次使用模块后都获得同一个结果,然后在添加修补程序后再次使用它却获得不同的结果,他们可能会感到惊讶。 尽量避免让用户感到惊讶。

发布模型

创建要共享的 Bicep 模块时,请照常创作另一个 Bicep 文件。 然后,使用 bicep publish 命令将文件发布到注册表。 发布时,需要指定要将模块保存到的模块路径:

az bicep publish \
   --file module.bicep \
   --target 'br:toycompany.azurecr.io/mymodules/modulename:moduleversion'
bicep publish module.bicep `
   --target 'br:toycompany.azurecr.io/mymodules/modulename:moduleversion'

在生成或部署 Bicep 文件时,发布操作会执行相同的验证步骤。 这些步骤包括:

  • 检查代码是否没有任何语法错误。
  • 验证是否指定了有效的资源定义。
  • 运行 Bicep linter,验证代码是否通过一系列质量检查。

如果验证步骤通过,则模块将发布到注册表。