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

В общем, у меня есть один конвейер (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): шаблон. выражение не разрешено в этом контексте

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Спасибо за ваш ответ. Я обновил свой основной пост, добавив EDIT 1 в ответ на ваш ответ.

Kreg 02.09.2024 16:37

Привет @Kreg, спасибо за твои новости. Сожалеем, что использование параметра в поле источника не сработало. По своему опыту я верил, что так и будет, но оказалось, что это не так. Приносим извинения за возможные неудобства. Я думаю, это потому, что когда мы определяем триггеры ресурсов конвейера, у нас должно быть явное имя конвейера. Если он динамический, мы не будем знать, какой конвейер запустить.

Miao Tian-MSFT 03.09.2024 04:24

Кстати, я могу придумать и другие возможные решения: ① Добавить задачу после первого конвейера для запуска команды az Pipelines run или запуска REST API Runs — Run Pipeline. ② Или напишите два конвейера в одном файле YAML, чтобы они стали многоэтапными конвейерами. Однако эти методы могут потребовать соответствующих изменений шаблона в глобальных конвейерах.

Miao Tian-MSFT 03.09.2024 04:26

Да, с некоторыми исправлениями теперь всё работает. Спасибо за время и поддержку. Я ценю вашу помощь.

Kreg 04.09.2024 11:43

Другие вопросы по теме