Azure devops 在阶段上添加条件以检查文件夹上的更改

Azure devops 在阶段上添加条件以检查文件夹上的更改,azure-devops,yaml,azure-repos,Azure Devops,Yaml,Azure Repos,我在同一分支中有服务器端(使用c#的web api)和客户端(angular)代码。我已经为要构建的服务器端和客户端代码创建了单独的阶段,还创建了一个要部署的阶段。如果我签入客户端或服务器端的代码,所有3个阶段都会运行。为了避免这种情况,我正在寻找在阶段级别添加条件的方法,以便如果有服务器端更改,那么只有服务器阶段将运行,如果签入代码只有客户端代码,那么只有客户端阶段将运行。我不明白如何检查哪些文件已签入。我在搜索时发现了类似的问题,但解决方案是使用git给出的。我的代码在azure repos

我在同一分支中有服务器端(使用c#的web api)和客户端(angular)代码。我已经为要构建的服务器端和客户端代码创建了单独的阶段,还创建了一个要部署的阶段。如果我签入客户端或服务器端的代码,所有3个阶段都会运行。为了避免这种情况,我正在寻找在阶段级别添加条件的方法,以便如果有服务器端更改,那么只有服务器阶段将运行,如果签入代码只有客户端代码,那么只有客户端阶段将运行。我不明白如何检查哪些文件已签入。我在搜索时发现了类似的问题,但解决方案是使用git给出的。我的代码在azure repos中。是否有任何方法可以让我根据文件夹检查是否有更改,并在阶段的条件下进一步使用它。大概是这样的:

stages: 
- stage: 'Server'
 condition: 

- stage: 'Client'
 condition: 

提前感谢。

首先,我们无法在阶段条件下设置文件路径过滤器,因此此方法不可行

作为解决方法,您可以尝试中提到的方法。使用自定义布尔变量作为阶段的运行条件

  • 创建值为“False”的变量

  • 通过tf diff命令获取更改的文件

  • 通过脚本确定修改文件所在的文件夹

  • 根据文件夹名称将相应的变量值更改为“True”

  • 添加自定义阶段条件:
    condition:eq(变量['RunProjectA','True')

  • 链接中给出了过滤器脚本示例,因为您使用的是tfvc版本控制,所以可以将
    git diff
    命令更改为
    tf diff
    命令

    此外,正如Krzysztof Madej所建议的,创建单独的管道并为每个管道设置单独的路径过滤器触发器也是一个不错的选择。

    中提到的解决方案应该适合您。我将分享有关此解决方案的更多详细信息

    1,在stage Server的顶部添加另一个stage
    ChangedFolders
    ,在stage ChangedFolders中,使用单个powershell任务添加单个作业。(不需要为服务器文件夹和客户端文件夹创建变量。)

    2,在powershell taslk中,运行上述线程中提到的脚本。并通过脚本设置输出变量。有关更多信息,请参阅文档

    请参见以下示例:

    stages: 
    - stage: ChangedFolders
      jobs:
      - job: preCheck
        steps:
        - powershell: |
            $files=$(git diff HEAD HEAD~ --name-only)
            $temp=$files -split ' '
            $count=$temp.Length
            echo "Total changed $count files"
            For ($i=0; $i -lt $temp.Length; $i++)
            {
              $name=$temp[$i]
              echo "this is $name file"
              if ($name -like 'ServerFolder/*')  #if ServerFolder is a subfolder under a folder use "- like '*/ServerFolder/*'"
              {
                Write-Host "##vso[task.setvariable variable=severFolder;isOutput=true]True"
              }
              if ($name -like 'ClientFolder/*')
              {
                Write-Host "##vso[task.setvariable variable=clientFolder;isOutput=true]True"
              }
            }
          name: taskVariable
        
    - stage: 'Server'
     condition: 
    
    - stage: 'Client'
     condition: 
    
    3,然后可以为服务器和客户端阶段添加依赖项和条件。见文件。检查以下yaml示例:

    在条件中引用输出变量的格式如下:
    dependencies.dependensagename.outputs['jobName.taskName.variableName']

    - stage: ChangedFolders
      jobs:
      - job: preCheck
        steps:
        - powershell: |
            ...
          name: taskVariable
    
    - stage: 'Server'
      dependsOn: preCheck
      condition: eq(dependencies.ChangedFolders.outputs['preCheck.taskVariable.serverFolder'], 'True')
    
    - stage: 'Client'
      dependsOn: preCheck
      condition: eq(dependencies.ChangedFolders.outputs['preCheck.taskVariable.clientFolder'], 'True')
    

    如果您有任何问题,请告诉我。

    我正在发布适合我的解决方案。 我有三个阶段:服务器、客户端和部署。我已经在同一分支上的两条管道中分离了阶段。现在我在一个管道中有了服务器和部署阶段,在另一个管道中有了客户机和部署阶段。此外,我在服务器端(WebAPI)管道中使用了以下代码

    以及客户端管道中的以下代码

      paths:
       include:
       - folder Path for Client side/*   
    
    stages: 
    
       - stage: 'Client'
       #  steps for building client side code
       - stage: 'Deploy'
       #  steps for Deploying client side code
    

    现在它触发各自的管道并部署各自的构建。

    azure repos也使用git,所以您使用的是git。@Shaykibaramczyk我指的是中提到的解决方案。这似乎对我不起作用。@ShaykiAbramczyk提供的链接是你的方式。每个阶段没有路径过滤器。如果您想简化这个过程,您需要为客户机和服务器创建sperate管道,在触发器上使用不同的路径过滤器。@KrzysztofMadej是的,它对我有用。谢谢
      paths:
       include:
       - folder Path for Client side/*   
    
    stages: 
    
       - stage: 'Client'
       #  steps for building client side code
       - stage: 'Deploy'
       #  steps for Deploying client side code