在舞台上添加条件以检查文件夹上的更改

Jyo*_*oti 7 yaml azure-devops azure-repos

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

stages: 
- stage: 'Server'
 condition: 

- stage: 'Client'
 condition: 
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Lev*_*SFT 7

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

ChangedFolders1,在 stage Server 之上添加另一个 stage ,在 stage ChangedFolders 中,添加具有单个 powershell 任务的单个作业。(您不需要为服务器文件夹和客户端文件夹创建变量。)

2、在powershell任务中,运行上面线程中提到的脚本。并通过脚本设置输出变量。请参阅此处的文档了解更多信息。

请参阅下面的示例:

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: 
Run Code Online (Sandbox Code Playgroud)

3、然后您可以为服务器和客户端阶段添加依赖关系和条件。请参阅此处的文档。检查下面的 yaml 示例:

引用条件中的输出变量的格式如下:dependencies.dependOnStageName.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')
Run Code Online (Sandbox Code Playgroud)

请让我知道,如果你有任何问题。


Jyo*_*oti 4

我正在发布对我有用的解决方案。我有 3 个阶段:服务器、客户端和部署。我已将同一分支上的两个管道的阶段分开。现在,我在一个管道中有服务器和部署阶段,在另一个管道中有客户端和部署阶段。另外,我在服务器端(Web Api)管道中使用了以下代码

 paths:
  exclude:
  - folder Path for Client side /*

 stages: 

 - stage: 'Server'
  #  steps for building server side code
 - stage: 'Deploy'
  #  steps for Deploying server side code
Run Code Online (Sandbox Code Playgroud)

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

  paths:
   include:
   - folder Path for Client side/*   

stages: 

   - stage: 'Client'
   #  steps for building client side code
   - stage: 'Deploy'
   #  steps for Deploying client side code
Run Code Online (Sandbox Code Playgroud)

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