Я подготовил шаблон, чтобы повторно использовать его во всех своих конвейерах. Это выглядит так:
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)
в этом конвейере через шаблон, я не вижу там файлов шаблона. Только файлы из репозитория, в котором используется шаблон.
Вопрос в том, как прочитать файл конфигурации, сохраненный в том же репозитории, что и шаблон, используемый в этом конвейере?
Вместо использования относительных путей в конвейере попробуйте использовать абсолютный путь, которому предшествует предопределенная переменная , например:
$(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
Кроме того, убедитесь, что имя файла конфигурации правильное.