Попытка сделать конвейер более гибким

В общем, у меня есть один конвейер (SourcePipeline), который запускает другой (DependantPipeline), и два из них находятся в конкретном репозитории devops-med. Кроме того, двое из них используют определения конвейеров из другого репозитория global-pipelines.

Мой набор конвейеров работает так, как и ожидалось, однако их необходимо внести в некоторые настройки, чтобы не использовать жестко закодированные имена в определениях некоторых конвейеров. Я использую жестко запрограммированное имя репозитория, к которому подключен конвейер.

Определения конвейеров в репозитории devops-med основаны на моем уже работающем подходе:

devops-med/devops/pipeline.yml

name: $(Build.DefinitionName) # added new line on 08/31
name: SourcePipeline  # removed that line on 08/31

resources:
  repositories:
    - repository: global-pipelines
      type: git
      name: global-pipelines
      ref: test/pipeline

trigger:
  batch: true
  branches:
    include:
      - test/pipeline

pr: none

parameters:
  - name: pipelineMode
    displayName: Pipeline Mode
    type: string
    default: main
    values:
      - auto
      - feature
      - main
    
extends:
  template: /cicdTemplates/pipeline.yml@global-pipelines
  parameters:
    variablesTemplate: devops/variables/global_variables.yml@self
    pipelineMode: ${{parameters.pipelineMode}}
    buildJobs: devops/build_jobs.yml@self

К этому я добавил в первую строку name: $(Build.DefinitionName) и удалил name: SourcePipeline. Все еще работает.

Devops-med/devops/dependentpipeline.yml

trigger: none

resources:
  repositories:
    - repository: global-pipelines
      type: git
      name: global-pipelines
      ref: test/pipeline
  pipelines:
    - pipeline: SourcePipeline
      project: DEV
      # source: 'devops-med'
      source: $(Build.DefinitionName) # added new line on 08/31
      trigger:
        branches:
          include:
            - test/pipeline

parameters:
  - name: pipelineMode
    displayName: Pipeline Mode
    type: string
    default: main
    values:
      - auto
      - feature
      - main

extends:
  template: /cicdTemplates/pipeline.yml@global-pipelines
  parameters:
    variablesTemplate: devops/variables/global_variables.yml@self
    pipelineMode: ${{parameters.pipelineMode}}
    devEnvironment: dev
    devVariables: devops/ew/variables/dev_variables.yml@self
    deployEnvironmentTemplate: devops/deploy_environment.yml@self

В нем я изменил source: 'devops-med' на source: $(Build.DefinitionName), как описано в приведенном выше определении конвейера. Это не работает, я получаю сообщение об ошибке в Azure DevOps:

/devops/dependentpipeline.yml (строка: 12, столбец: 17): ресурс конвейера. Входные данные SourcePipeline должны быть действительными.

Возможно, я ошибаюсь в своем предположении и не могу использовать Build.DefinitionName в файлеdependentpipeline.yml, и он должен быть жестко запрограммирован, чтобы знать, какой именно конвейер его вызвал. Однако я попробовал, основываясь на документации: https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml

В общем, цель состоит в том, чтобы не использовать жестко закодированное имя devops-med.

РЕДАКТИРОВАТЬ 1.

Когда я сделал это таким образом:

    parameters:
      - name: sourcePipelineName
        type: string
        default: 'devops-med'
    
    resources:
      pipelines:
        - pipeline: SourcePipeline
          project: DEV
          source: ${{ parameters.sourcePipelineName }}
          trigger:
            branches:
              include:
                - test/pipeline
    extends:
      template: /cicdTemplates/pipeline.yml@global-pipelines
      parameters:
        variablesTemplate: devops/variables/global_variables.yml@self
        pipelineMode: ${{parameters.pipelineMode}}
      devEnvironment: dev
      devVariables: devops/ew/variables/dev_variables.yml@self
      deployEnvironmentTemplate: devops/deploy_environment.yml@self

Я получил ошибку:

devops/dependentpipeline.yml (строка: 17, столбец: 15): шаблон. выражение не разрешено в этом контексте


77
1

Ответ:

Решено

Согласно вашему описанию, у вас есть два конвейера Azure DevOps (SourcePipeline и DependantPipeline) в репозитории devops-med. DependantPipeline запускается SourcePipeline с помощью триггера ресурса конвейера .

Имя SourcePipeline — devops-med, оно совпадает с именем репозитория, поэтому вы используете source: 'devops-med' в триггере ресурса конвейера.

Если вы не хотите жестко запрограммировать его в триггере ресурса конвейера, вы можете изменить конвейер, чтобы использовать новое имя вместо имени репозитория.

Вы также можете рассмотреть возможность использования универсальных триггеров на основе веб-перехватчиков для конвейеров YAML для запуска второго конвейера после завершения первого вместо использования триггеров ресурсов конвейера.

Вот подробные шаги:

  1. Создайте подключение к службе «Входящий веб-перехватчик» в настройках проекта > Подключения к службе.

  2. Создайте веб-перехватчик Service Hook с событием, связанным с рабочим элементом, в настройках проекта > Service Hooks и выберите событие Сборка завершена для SourcePipeline devops-med.

    URL-адрес запроса:

    "https://dev.azure.com/<ADO Organization>/_apis/public/distributedtask/webhooks/<WebHook Name>?api-version=6.0-preview"
    

    WebHook Name в URL-адресе — это тот, который вы установили при подключении к службе.

  3. Измените DependantPipeline, указав тип ресурса webhooks. Конвейер будет запущен, когда SourcePipeline devops-med завершится успешно.

Пример YAML:

trigger: none

resources:
  repositories:
    - repository: global-pipelines
      type: git
      name: global-pipelines
      ref: test/pipeline
  webhooks:
    - webhook: MyWebhookTrigger         ### Webhook name
      connection: MyWebhookConnection    ### Incoming webhook service connection name