如何在Azure DevOps和Cake中获得统一的内部版本号?

时间:2019-05-16 13:48:58

标签: azure-devops cakebuild gitversion

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

1 个答案:

答案 0 :(得分:1)

我建议您执行以下操作:

grep "This was the message we received" + above result in mylogs.log

即运行两次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

相关问题