0

我正在使用 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我的管道。

4

1 回答 1

1

我建议您执行以下操作:

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 时执行此操作,因此您会将第一次执行放在它自己的 if 块中。

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

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

于 2019-05-16T15:35:07.647 回答