Как использовать шаблон со ссылками на сценарий в другом репозитории в Azure DevOps Pipelines?

Я пытаюсь использовать шаблон, который хранится в другом репозитории Git в Azure DevOps, где этот шаблон имеет ссылку на сценарий, также содержащийся в этом репозитории. Хотя я могу успешно использовать шаблон из основного конвейера, он не ссылается на сценарий, который требуется для шаблона.

Могу я как-нибудь это сделать?

Шаблон / сценарий HelloWorld хранятся в репозитории Azure DevOps «HelloWorld» в подпапке «Шаблоны».

Сценарий HelloWorld.ps1 в том же каталоге, что и шаблон ниже.

param($Name)

Write-Host "Hello, $Name!"

Шаблон №1 со ссылкой на локальный скрипт

  parameters:
  - name: azureSubscription
    type: string
  - name: name
    type: string
  
  jobs:
  - job: HelloWorld
    displayName: Hello World
    variables:
      name: ${{ parameters.name }}
    steps:
    - task: AzurePowerShell@4
      name: HelloWorld
      displayName: Hello World
      inputs:
        azureSubscription: ${{ parameters.azureSubscription }}
        scriptType: filePath
        scriptPath: ./HelloWorld.ps1
        azurePowerShellVersion: latestVersion
        failOnStandardError: true
        scriptArguments:
          -Name "$(name)"

Шаблон # 2


resources:
  repositories:
    - repository: helloworld
      type: git
      name: HelloWorld

stages:
- stage: Variables
  jobs:
  - template: Scripts/hello-world.yml@helloworld
    parameters:
      azureSubscription: 'My Subscription'
      name: 'Billy'

person Benjamin    schedule 05.11.2020    source источник


Ответы (2)


Если в вашем конвейере есть шаблоны в другом репозитории или если вы хотите использовать проверка нескольких репозиториев с репозиторием, для которого требуется подключение к службе, вы должны сообщить системе об этом репозитории. Ключевое слово repository позволяет указать внешний репозиторий.

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

Как и в репозитории шаблонов, мы ожидаем найти test.yml в корне.

resources:
  repositories:
  - repository: templates
    type: git
    name: templates
steps:
- template: test.yml@templates

Обновление1

Я обновляю ваш код, и он работает, проверьте его.

Структура репо HelloWord и репо содержат файл шаблона и файл PS1

введите описание изображения здесь

Шаблон №1 со ссылкой на локальный скрипт. Примечание. Я добавляю этап оформления заказа для проверки HelloWord и саморепозитория конвейера.

  parameters:
  - name: azureSubscription
    type: string
  - name: name
    type: string
  
  jobs:
  - job: HelloWorld
    displayName: Hello World
    variables:
      name: ${{ parameters.name }}
    steps:
    - checkout: self
    - checkout: helloworld
    - task: AzurePowerShell@4
      name: HelloWorld
      displayName: Hello World
      inputs:
        azureSubscription: ${{ parameters.azureSubscription }}
        scriptType: filePath
        scriptPath: $(build.sourcesdirectory)/Helloworld/Subfolder/HelloWorld.ps1
        azurePowerShellVersion: latestVersion
        failOnStandardError: true
        scriptArguments:
          -Name "$(name)"

В другом репо создайте определение сборки yaml.

resources:
  repositories:
    - repository: helloworld
      type: git
      name: HelloWorld
pool:
  vmImage: 'windows-latest'
 
stages:
 
- stage: Variables
  jobs:
  - template: hello-world.yml@helloworld
    parameters:
      azureSubscription: 'My Subscription'
      name: 'Billy'

Результат:

введите описание изображения здесь

person Vito Liu    schedule 05.11.2020
comment
Вот как мы это делаем. Однако весьма прискорбно, что вы вынуждены использовать конкретное имя для ресурса репозитория в корневом конвейере (то есть точно такое же имя, как то, которое вы используете на этапе оформления заказа в шаблоне). Фактически, я столкнулся с этим, потому что я ищу способ узнать по шаблону, какой ресурс репозитория (или, по крайней мере, ссылка на ветку) использовался для доступа к шаблону. - person Willem M.; 02.04.2021

Когда у вас есть несколько репозиториев в вашем конвейере, и они у вас есть, когда вы используете шаблон из другого репо, они загружаются в свои собственные папки, а не в корневую. Это кажется очевидным, но мы должны помнить об этом.

Если у вас есть несколько этапов проверки в вашей работе, ваш исходный код извлекается в каталоги, названные в честь репозиториев, как подпапка s в (Agent.BuildDirectory). Если (Agent.BuildDirectory) - C: \ agent_work \ 1, а ваши репозитории - это инструменты и код, ваш код извлекается в C: \ agent_work \ 1 \ s \ tools и C: \ agent_work \ 1 \ s \ code.

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

Например:

trigger: none
pr: none

resources:
  repositories:
    - repository: devops
      type: github
      name: kmadof/devops-templates
      endpoint: kmadof

stages:
- template: templates/start.yaml@devops
  parameters:
    repo: devops-templates
    buildSteps:
      - checkout: self
      - checkout: devops
      - bash: echo Test #Passes
        displayName: succeed
      - bash: echo "Test"
        displayName: succeed

Я передаю туда параметр репо, чтобы использовать его в своем шаблоне:

parameters:
- name: repo  # defaults for any parameters that aren't specified
  default: ''

steps:
  - task: PowerShell@2
    inputs:
      filePath: ${{ parameters.repo }}/scripts/myscript.ps1

Вы можете проверить код здесь

person Krzysztof Madej    schedule 05.11.2020