gpt4 book ai didi

azure - 如果有更改或手动触发,则将 azure-pipelines.yaml 设置为在子目录上运行

转载 作者:行者123 更新时间:2023-12-02 06:09:08 25 4
gpt4 key购买 nike

我在年初问了以下问题:

Multiple separate triggers in azure-pipelines.yml

基本上,我的设置是我的“微服务”是 monorepo 中的子目录。我希望根据每个子目录是否有更改来单独触发它们。我试图避免使用 Polyrepo,它听起来像 this answer就是解决方案。否则,只要项目中的任何地方发生变化,所有内容都会被触发重建和重新部署。

我开始遇到问题,所以我禁用了它。两个主要问题:

  • 似乎当管道在 CI 或 CD 阶段失败时,我会手动触发它,但由于某种原因它找不到更改并且无法运行。我必须通过注释掉检查更改的任务来修改 azure-pipeline.yaml,然后运行。或者我必须做一些小的改变,重新提交,重新触发等等。
  • 有时我只是想手动触发子目录及其关联的管道,并且我必须执行前面的操作。

因此,我禁用了它,并在触发管道时停止重建和重新部署所有内容,并在我想要的子目录上手动运行。

如何在 azure-pipeline.yaml 中实现此功能?

  1. 仅在发生更改时在子目录上运行。
  2. 即使没有更改,也会在手动触发时运行。
trigger:
branches:
include:
- staging
- master
paths:
include:
- admin/*
- client/*
- api/*
- azure-pipelines.yml

最佳答案

您需要结合两件事:

  • 检测子文件夹中的更改,例如 here for instance (代码位于powershell中)
$editedFiles = git diff HEAD HEAD~ --name-only
$editedFiles | ForEach-Object {
Switch -Wildcard ($_ ) {
'SubFolderA/*' { Write-Output "##vso[task.setvariable variable=MicroserviceA]true" }
# The rest of your path filters
}
}

(您也可以离开检测更改)

  • 并使用变量 Build.Reason 检测原因更改

所以你最终会遇到与此类似的情况

or(eq(variables['MicroserviceA'], true), eq(variables['Build.Reason'], 'Manual'))

如果您使用阶段进行分离,则需要创建一个新阶段,并在其中放置检测子文件夹更改的逻辑,使其他阶段依赖于该阶段并在其他阶段条件中使用。但是您需要记住[阶段依赖关系及其命名]

stages:
- stage: A
jobs:
- job: A1
steps:
- powershell: |
$editedFiles = git diff HEAD HEAD~ --name-only
$editedFiles | ForEach-Object {
Switch -Wildcard ($_ ) {
'SubFolderA/*' { Write-Output "##vso[task.setvariable variable=MicroserviceA;isOutput=true]true" }
# The rest of your path filters
}
}
name: detectChange
- stage: B
condition: or(and(succeeded(), eq(dependencies.A.outputs['A1.detectChange.MicroserviceA'], true)), eq(variables['Build.Reason'], 'Manual'))
dependsOn: A
jobs:
- job: B1
steps:
- script: echo hello from Stage B

以上方式触发了手动触发的所有部件,如果您希望能够选择一个,您可以使用 runtime parameters

parameters:
- name: configs
type: string
default: 'all'

trigger: none

jobs:
- ${{ if or(contains(parameters.configs, 'MicroserviceA'),contains(parameters.configs, 'all')) }}:
- job: MicroserviceA
steps:
- script: echo Building MicroserviceA...
- ${{ if or(contains(parameters.configs, 'MicroserviceB'),contains(parameters.configs, 'all')) }}:
- job: MicroserviceB
steps:
- script: echo Building MicroserviceB...
- ${{ if or(contains(parameters.configs, 'MicroserviceC'),contains(parameters.configs, 'all')) }}:
- job: MicroserviceC
steps:
- script: echo Building MicroserviceC...

关于azure - 如果有更改或手动触发,则将 azure-pipelines.yaml 设置为在子目录上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64289480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com