В общем, у меня есть один конвейер (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): шаблон. выражение не разрешено в этом контексте
Согласно вашему описанию, у вас есть два конвейера Azure DevOps (SourcePipeline и DependantPipeline) в репозитории devops-med
. DependantPipeline запускается SourcePipeline с помощью триггера ресурса конвейера .
Имя SourcePipeline — devops-med
, оно совпадает с именем репозитория, поэтому вы используете source: 'devops-med'
в триггере ресурса конвейера.
Если вы не хотите жестко запрограммировать его в триггере ресурса конвейера, вы можете изменить конвейер, чтобы использовать новое имя вместо имени репозитория.
Вы также можете рассмотреть возможность использования универсальных триггеров на основе веб-перехватчиков для конвейеров YAML для запуска второго конвейера после завершения первого вместо использования триггеров ресурсов конвейера.
Вот подробные шаги:
Создайте подключение к службе «Входящий веб-перехватчик» в настройках проекта > Подключения к службе.
Создайте веб-перехватчик 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-адресе — это тот, который вы установили при подключении к службе.
Измените 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