Docker 在多分支项目中标记图像的最佳做法是什么?

What's the best practice for Docker images tagging in a multibranch project?

我有一个 C# 应用程序,不同的团队在该应用程序上并行工作,每个团队可能在功能分支上工作。我正在配置构建 Docker 图像并将它们推送到 Azure 容器注册表的构建管道。 在我们的日常工作中,在部署期间,我们需要为每个 branch/team 处理特定的 Docker 图像,以便每个团队可以随时部署他们的图像。

我想知道,在多分支项目中是否有任何最佳实践来标记 Docker 图像?例如,<version>-<commit_hash>-<branch_name>?

既然您提到了 .NET,我建议您根据当前分支的历史查看 GitVersion. GitVersion is an open source tool that generates a SemVer 版本号。

有很多规则规定了版本号的计算方式,您可以对其进行配置以适合您的特定工作流程。

例如,运行 gitversion 在具有默认设置的 master 分支上将产生如下内容:

{
  "Major":0,
  "Minor":1,
  "Patch":0,
  "PreReleaseTag":"",
  "PreReleaseTagWithDash":"",
  "PreReleaseLabel":"",
  "PreReleaseNumber":"",
  "WeightedPreReleaseNumber":60000,
  "BuildMetaData":45,
  "BuildMetaDataPadded":"0045",
  "FullBuildMetaData":"45.Branch.master.Sha.66042002fd0ddeb167932a2726de8f35364b1352",
  "MajorMinorPatch":"0.1.0",
  "SemVer":"0.1.0",
  "LegacySemVer":"0.1.0",
  "LegacySemVerPadded":"0.1.0",
  "AssemblySemVer":"0.1.0.0",
  "AssemblySemFileVer":"0.1.0.0",
  "FullSemVer":"0.1.0+45",
  "InformationalVersion":"0.1.0+45.Branch.master.Sha.66042002fd0ddeb167932a2726de8f35364b1352",
  "BranchName":"master",
  "EscapedBranchName":"master",
  "Sha":"66042002fd0ddeb167932a2726de8f35364b1352",
  "ShortSha":6604200,
  "NuGetVersionV2":"0.1.0",
  "NuGetVersion":"0.1.0",
  "NuGetPreReleaseTagV2":"",
  "NuGetPreReleaseTag":"",
  "VersionSourceSha":"835cac8f9c24a5f7d980f1ccc26af4eab399bbf0",
  "CommitsSinceVersionSource":45,
  "CommitsSinceVersionSourcePadded":"0045",
  "UncommittedChanges":1,
  "CommitDate":"2021-07-06"
}

您可以使用 FullSemVer 的值作为特定分支生成的 Docker 图像的标签。但是,有一个问题:Docker 不支持 tag name:

中的 + 个字符

A tag name must be valid ASCII and may contain lowercase and uppercase letters, digits, underscores, periods and dashes. A tag name may not start with a period or a dash and may contain a maximum of 128 characters.

为了解决这个问题,您必须配置 GitVersion 以在不使用 + 字符的情况下生成唯一的版本号。查看 GitVersion 支持的不同 versioning modes 以找到适合您的分支和部署策略的版本。

你应该试试我下面提到的这种docker图像标签,它可以很容易地找到该分支的分支名称和注释。

分支名-branchcommit