如何为 Azure DevOps 和 Cake 获取唯一的内部版本号?

How to get a unqiue build number into Azure DevOps and Cake?

我正在使用 Cake Build 脚本来构建我们的 .NET 软件,我需要一个唯一的内部版本号来烘焙到 DLL 中,主要是因为我们需要知道我们使用的确切二进制文件,以防我们需要调试转储文件二进制文件。

首先,这是我当前的 Cake 版本任务:

Task("Version")
    .Does(() => 
    {
        Information("Versioning software for configuration {0} of {1}...", configuration, solution);
        var gitVersionSettings = new GitVersionSettings {
            UpdateAssemblyInfo = true
        };
        var Version = GitVersion(gitVersionSettings);
    });

非常简单,但它会使用正确的 FileVersion 和 ProductVersion 更新程序集文件,从而更新 DLL。

其次,我发现 Azure DevOps 中的内部版本号到处都是。以下是一些示例:

2.1.0-PullRequest0019.7
2.0.1-beta.1+4
2.1.0-alpha.4
2.1.0-PullRequest0017.4
2.0.1-beta.1+2
2.0.0
0.1.0+70

这些是最后 7 个内部版本号,它们来自不同分支的内部版本,包括将修补程序合并到 master 中,然后合并到 dev 中。我注意到这个构建管道,构建号是空的,所以我认为它只是使用我最后一组标签(到目前为止只标记了 2.0.0 和 2.0.1)将任何东西转储到构建管道中。

存在三个问题:

  1. 如何将唯一的内部版本号添加到我的 Azure DevOps 管道中(我有 3 个并且每个内部版本,无论管道如何,都需要是唯一的)?
  2. 如何将唯一内部版本号获取到我的语义版本控制中并尊重我在 Master 中的标签?
  3. 当我在 Azure DevOps 构建服务器上构建时,以及当我在我的机器上本地构建(调试)时,如何将构建号获取到我的 Cake 脚本中?

编辑

我发现您可以使用 $(BuildId) 获取 Azure DevOps 生成的唯一内部版本号,从而回答问题 1。我还认为我可以通过参数将内部版本号从 Azure DevOps 传递到我的 Cake 脚本这很好。现在更多的是本地构建的问题以及如何为它们获取唯一的构建号。另外,什么格式应该保存我的版本控制。我正在尝试为标签使用 1.0.0 格式,所以我应该使用第四个数字作为不断增加的内部版本号吗?以及如何将其保存到 AssemblyInfo.cs 文件中?

从我的第一次编辑开始编辑...在 运行 成功构建后,构建编号从构建 ID 更改为其他内容“2.1.0-alpha.7”,我不知道为什么因为我指定在我的管道中使用构建 ID。

我建议您执行以下操作:

GitVersion(new GitVersionSettings {
    OutputType = GitVersionOutput.BuildServer,
});

var gitVersionSettings = new GitVersionSettings {
    UpdateAssemblyInfo = true
};

var Version = GitVersion(gitVersionSettings);

即运行 GitVersion 两次。第一个使用 BuildServer 输出类型,这应该会导致 GitVersion 更新 Azure DevOps 内部版本号以匹配存储库的断言版本号。

第二次执行允许您将版本号获取到局部变量中,就像您当前所做的那样。

这是必要的原因是 GitVersion 不能同时更新构建服务器版本和输出用于生成断言版本号的 JSON 文件,这些版本号在第二次调用中返回.

注意:您可能只想在实际 运行使用 Azure DevOps 时执行此操作,因此如果块。

我在我的 Cake.Recipe 项目中对这个问题的建议使用了类似的方法:

https://github.com/cake-contrib/Cake.Recipe/blob/develop/Cake.Recipe/Content/gitversion.cake#L56