azure-pipelines.yml中的多个单独的触发器

yvfmudvl  于 2023-06-30  发布在  其他
关注(0)|答案(3)|浏览(151)

我目前有一个monorepo,子目录中有服务,我倾向于将其转变为带有元存储库的多存储库。
我决定给予Azure DevOps的原因之一是有人告诉我,您可以在子目录上设置触发器,例如:

trigger:
  branches:
    include:
    - master
  paths:
    include:
    - client

测试和它的工作。
然而,我想知道的是,是否有可能有多个独立的触发器,或者这需要一个polyrepo或多个.yml?原因是如果只有client服务中的更改,则它只会触发该测试、构建和部署集,而不会触发api服务运行测试、构建和部署。
例如:

trigger:
  branches:
    include:
    - master
  paths:
    include:
    - client

  stages:
    ...
    Run tests
    If tests pass, build and push to ACR
    Deploy to AKS
    ...

trigger:
  branches:
    include:
    - master
  paths:
    include:
    - api

  stages:
    ...
    Run tests
    If tests pass, build and push to ACR
    Deploy to AKS
    ...

这样,一个应用程序中的更改不会导致整个应用程序被重新构建,而只是更改了什么。
然而,这是否需要多个.yml文件(甚至不确定是否可以识别除azure-pipelines.yml之外的任何文件),这是否需要polyrepo,或者这在我没有看到的单个azure-pipelines.yml中是可行的?

ijxebb2r

ijxebb2r1#

如果我对您的请求理解正确的话,您可以在一个azure-pipeline. yml中实现这一点。请检查下面的示例yml。

trigger:
  branches:
    include:
    - master
  paths:
    include:
    - client/*
    - api/*

jobs:
- job: getchangepath
  pool:
    vmImage: 'windows-latest'
  steps: 
  - powershell: |
      $url="$(System.CollectionUri)/$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.ID)/commits/$(Build.SourceVersion)/changes?api-version=5.1"
      $result = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method GET
                       
      $changesFolder = $result.changes | Where-Object{$_.item.gitObjectType -match "tree"} | Select-Object -Property {$_.item.path}
     
      foreach($path in $changesFolder){
        if($path -match '/client'){
          echo "##vso[task.setvariable variable=Client;isOutput=true]$True"
          break
        }
      }

      foreach($path in $changesFolder){
        if($path -match '/api'){
          echo "##vso[task.setvariable variable=Api;isOutput=true]$True"
          break
        }
      }
    name: MyVariable

- job: client
  pool :
    vmImage: 'windows-latest'
  dependsOn: getchangepath
  condition: eq(dependencies.getchangepath.outputs['Myvariable.Client'], 'true')
  steps:
  - powershell: echo 'client job start'
  
- job: api
  pool :
    vmImage: 'windows-latest'
  dependsOn: getchangepath
  condition: eq(dependencies.getchangepath.outputs['Myvariable.Api'], 'true')
  steps:
  - powershell: echo 'api job start'

在上面的YML中,我有三份工作。在第一个作业getchangepath中,我在PowerShell任务中调用git get changes Rest API,以获取触发构建的更改路径。如果路径包含路径/client/api,它也会输出变量。
作业client和作业API依赖于作业getchangepath,将以作业getchangepath中的输出变量为条件执行。
假设我在文件夹客户端中更改了一个文件,并将更改提交到Azure Repo。然后作业getchangepath完成后。MyVariable.Client将被设置为true。然后Jobclient将评估其条件并开始。作业API条件将为false,并被跳过。

0pizxfdo

0pizxfdo2#

我最近遇到了这个问题。您不需要硬编码和访问上述解决方案中的DevOps API和PowerShell代码。
下面是一个更简单的解决方案,使用开箱即用YAMLworkingDirectory属性,根据官方Azure DevOps文档。
设置一个类似于下面的项目结构,每个存储库都有自己的YAML文件:

.
├── README.md
├── azure-pipelines.yml
├── service-a
|── azure-pipelines-a.yml
│   └── …
└── service-b
        |── azure-pipelines-b.yml
        └── …

您可能不需要根管道,但如果需要,您将希望忽略子项目:

# Excerpt from /azure-pipeline.yml 

trigger:
  paths:
    exclude: # Exclude!
      - 'service-a/*'
      - 'service-b/*'

而在子项目中,你希望他们关注自己:

# Excerpt from /service-a/azure-pipeline-a.yml

trigger:
  paths:
    include: # Include!
      - 'service-a/*' # or 'service-b/*'

警告-工作目录!

您的子项目管道仍在以根目录作为工作目录运行。您可以使用workingDirectory键来更改它,例如(使用变量来避免重复):

variables:
  - name: working-dir
    value: 'service-b/'

steps:
- script: npm install
  workingDirectory: $(working-dir)

- script: npm run task
  workingDirectory: $(working-dir)

如果您的项目共享步骤,则应该使用Pipeline Templates (in another repository) per official docs

t40tm48m

t40tm48m3#

如果你用上面的方法得到203响应,你可以试试这个方法

$userName = "whatever"
$AuthInfo = [Conver]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $userName,$(PAT)))
$result = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic {0} $AuthInfo" } -Method GET

我在Powershell上运行了这个,它工作得很好。

相关问题