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

Я подготовил шаблон, чтобы повторно использовать его во всех своих конвейерах. Это выглядит так:

stages:
- stage: Defender
  displayName: Defender
  pool:
    vmImage: windows-latest
  jobs:
  - job: Scan
    displayName: Scan
    steps:
    - task: MicrosoftSecurityDevOps@1
      displayName: Microsoft Security DevOps
      inputs:
        config: ../configs/config.gdnconfig

Структура папок выглядит следующим образом:

 - PROJ/ado-templates (root folder of template's repo)
   - templates
     - template.yml
   - configs
     - config.gdconfig

Затем в конвейере я использую этот шаблон как есть:

resources:
  repositories:
    - repository: templates
      type: git
      name: PROJ/ado-templates

stages:
- template: templates/microsoft-security.yml@templates

Но во время сканирования я получил ошибку:

##[ошибка]ConfigurationPathNotFoundException: не удалось найти файл конфигурации для: ../configs/config.gdnconfig. Часто это происходит из-за попытки использовать инструмент на платформе, где он еще не поддерживается. ##[error]MSDO CLI завершился с ошибкой кода выхода: 1

Когда я запускаю скрипт ls -al $(Build.SourcesDirectory) в этом конвейере через шаблон, я не вижу там файлов шаблона. Только файлы из репозитория, в котором используется шаблон.

Вопрос в том, как прочитать файл конфигурации, сохраненный в том же репозитории, что и шаблон, используемый в этом конвейере?


50
2

Ответы:

Вместо использования относительных путей в конвейере попробуйте использовать абсолютный путь, которому предшествует предопределенная переменная , например:

$(System.DefaultWorkingDirectory)/path/to/my/config.file

Или, как альтернатива:

$(Build.SourcesDirectory)/path/to/my/config.file

Оба $(Build.SourcesDirectory) и $(System.DefaultWorkingDirectory) указывают на локальный путь агента, куда загружаются файлы исходного кода.

Проверка общих шаблонов

Как упоминалось в Вэйд Чжоу - ответ MSFT:

Вы ссылаетесь только на yaml, но не проверяете репозиторий, в котором существует config.gdnconfig.

Вы можете добавить этап оформления заказа в свой общий шаблон, но я предлагаю использовать параметр, содержащий имя репозитория для оформления заказа, следующим образом:

parameters:
  - name: checkoutRepository
    type: string
    default: templates

stages:
  - stage: Defender
    displayName: Defender
    pool:
      vmImage: windows-latest
    jobs:
    - job: Scan
      displayName: Scan
      steps:
      - checkout: ${{ parameters.checkoutRepository }}
      - task: MicrosoftSecurityDevOps@1
        displayName: Microsoft Security DevOps
        inputs:
          config: $(System.DefaultWorkingDirectory)/configs/config.gdnconfig

Затем вы можете использовать шаблон, используя значение по умолчанию для параметра checkoutRepository:

resources:
  repositories:
    - repository: templates
      type: git
      name: PROJ/ado-templates

stages:
  - template: templates/microsoft-security.yml@templates

Или, в качестве альтернативы, передайте имя репозитория при оформлении заказа (например, в случае, если имя templates уже задано в другом repository ресурсе):

resources:
  repositories:
    - repository: templates
      type: git
      name: PROJ/my-other-templates
    - repository: adotemplates
      type: git
      name: PROJ/ado-templates

stages:
  - template: templates/microsoft-security.yml@adotemplates
    parameters:
      checkoutRepository: adotemplates

Решено

Вы только ссылаетесь на yaml, но не проверяете репозиторий, в котором существует config.gdnconfig.

Добавьте этап оформления заказа в template.yaml:

stages:
- stage: Defender
  displayName: Defender
  pool:
    vmImage: windows-latest
  jobs:
  - job: Scan
    displayName: Scan
    steps:
     - checkout: templates
     - script: |
        cat configs/config.gdnconfig            # check the content
    - task: MicrosoftSecurityDevOps@1
      displayName: Microsoft Security DevOps
      inputs:
        config: configs/config.gdnconfig           # remove .. at the begining

Кроме того, убедитесь, что имя файла конфигурации правильное.


Интересные вопросы для изучения