仅当项目已更改时才创建Nuget包

时间:2020-01-10 09:27:42

标签: visual-studio azure-devops azure-pipelines nuget-package

给出一个包含Web Api项目,Api Client项目和包含共享Dto对象的程序集项目的解决方案,如下所示:

  • 解决方案
    • Web Api项目
    • 共享的Dto项目
    • Api客户项目
    • 单元测试

我有一个Azure Devops构建管道来构建和测试所有项目。 在该构建管道中,我有一个步骤,为Api Client和Shared Dto项目创建2个Nuget程序包。

但是,我不需要一直都在创建新的软件包,比如说我只添加了单元测试或修复了Web Api项目中的错误,我不想创建新的Nuget软件包(或者担心如果没有更改Api客户端项目(或其依赖项),但我仍然想对其进行回归测试。

我认为也许我可以通过具有多个构建管道来实现此目的,一个用于Web Api项目,另一个用于Api Client&Shared项目,然后使用路径过滤器触发适当的构建。

还有其他方法可以实现这一目标吗? 最佳做法是什么? 我不想维护比我需要更多的构建定义。

2 个答案:

答案 0 :(得分:1)

我最终对做了一点修改 this answer

# Checks which files have been updated to determine if new Nuget packages are required
$editedFiles = git diff HEAD HEAD~ --name-only
echo "$($editedFiles.Length) files modified:"
$editedFiles | ForEach-Object {
   echo $_
    Switch -Wildcard ($_ ) {
        'Whds.Configuration.Models/*' { 
              # If the Models project is updated, we need to create both packages
              Write-Output "##vso[task.setvariable variable=CreateModelsPackage]True"
              Write-Output "##vso[task.setvariable variable=CreateClientPackage]True"  
         }        
        'Whds.Configuration.Standard/*' { Write-Output "##vso[task.setvariable 
variable=CreateClientPackage]True" }
        # The rest of your path filters
    }
}

此脚本设置变量,然后在构建管道的dotnet pack步骤中的自定义条件中引用这些变量:

and(succeeded(), eq(variables['CreateModelsPackage'], 'True'))

如果更改了Dto项目,则将设置两个变量以创建两个包。 如果只有客户(aka标准)项目是唯一更改的项目,则不会创建Dto项目的程序包。

答案 1 :(得分:0)

还有其他方法可以实现这一目标吗?最佳做法是什么?我不想维护比我需要更多的构建定义。

有多种方法可以实现它,但是不确定哪种是最佳实践,这完全取决于您的要求或口味。

简单方法与您的想法类似。还需要创建一个新的构建管道。区别在于我们不需要维护此构建定义。

详细信息:

  • 添加一个新管道,而该管道中没有任何其他任务,并使用 path过滤器可触发适当的构建(Api Client和 共享的Dto项目)。
  • 向原始Azure Devops构建管道添加构建完成enter image description here
  • 为基于Build.Reason创建2个Nuget包的步骤添加一个custom condition,例如:

    and(succeeded(), eq(variables['Build.Reason'], 'BuildCompletion'))
    

现在,当文件更改来自特定项目时,仅执行创建两个Nuget包的步骤。当然,此解决方案的局限性在于,如果您已经具有构建完成功能,它将无法正常工作。

如果上述方法不是您想要的,我们可以调用REST API commits来获取每个构建的提交信息:

GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits/{commitId}?changeCount=100&api-version=5.1

我们可以在返回的正文中找到更改/路径:

  "changes": [
    {
      "item": {
        "gitObjectType": "blob",
        "path": "/.gitattributes",
        "url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/.gitattributes?versionType=Commit"
      },
      "changeType": "add"
    },
    {
      "item": {
        "gitObjectType": "blob",
        "path": "/.gitignore",
        "url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/.gitignore?versionType=Commit"
      },
      "changeType": "add"
    },
    {
      "item": {
        "gitObjectType": "tree",
        "path": "/MyWebSite",
        "isFolder": true,
        "url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/MyWebSite?versionType=Commit"
      },
      "changeType": "add"
    },

然后,我们可以使用powershell脚本遍历这些路径,以查看它们是否包含Api Client和Shared Dto项目。如果是,则为变量设置一个值,并基于此值添加条件以创建2 Nuget程序包。

注意:在使用REST API commits之前,我们需要使用Commits - Get Commits来获取最新的提交ID:

GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits?$top=1&api-version=5.1

希望这会有所帮助。

相关问题