У меня есть проект в Azure DevOps по созданию и выпуску тестов e2e для других проектов FE. Мы переходим от обычных конвейеров графического пользовательского интерфейса с группами задач к конвейерам YAML, но у меня возникают проблемы при использовании переменных из группы переменных.
Что у меня было:
Что у меня есть сейчас:
Переменные следует считывать из группы переменных в библиотеке, где находится мой проект. Группа переменных имеет доступ к конвейеру. Конвейер проверяет, но затем задача запуска тестов завершается сбоем, поскольку переменные не разрешены. Правильно ли я на них ссылаюсь? Я хотел бы избежать жесткого кодирования переменных в файле yml.
Вот мой многоступенчатый конвейер yml
variables:
- group: End2EndV3
trigger:
branches:
include:
- refs/heads/main
stages:
- stage: BuildArtifact
jobs:
- job: Job_1
displayName: Agent job 1
pool:
vmImage: windows-2019
steps:
- checkout: self
fetchDepth: 1
- task: NodeTool@0
displayName: Use Node 10.x
inputs:
versionSpec: 10.x
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
inputs:
TargetFolder: $(Build.ArtifactStagingDirectory)
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: MyArtifact'
inputs:
ArtifactName: MyArtifact
- stage: RunTests
jobs:
- job: RunTests
steps:
- template: template-test-release.yml
...
и здесь шаблон yml вызывает проблемы
steps:
- task: eliostruyf.build-task.custom-build-task.file-creator@6
displayName: 'Create cypress.env.json'
inputs:
filepath: 'somefilepath/MyArtifact/cypress.env.json'
filecontent: |
{
"myVariable": "$(myVariableFromLibraryValue)",
}
fileoverwrite: true
verbose: true
- task: Npm@1
displayName: 'npm ci install'
inputs:
command: ci
workingDir: '$(System.DefaultWorkingDirectory)/somefilepath/MyArtifact'
verbose: false
- task: Npm@1
displayName: 'npm run tests'
inputs:
command: custom
workingDir: '$(System.DefaultWorkingDirectory)/somefilepath/MyArtifact'
verbose: false
customCommand: 'run cy:run:tests'
- task: PublishTestResults@2
displayName: 'Publish Test Results *-test-output.xml'
inputs:
testResultsFiles: '*-test-output.xml'
searchFolder: '$(System.DefaultWorkingDirectory)/somefilepath/MyArtifact/cypress/results'
mergeTestResults: true
@ZiyangLiu-MSFT Спасибо за предложение просмотреть журналы! Я совершенно их пропустил. Я продолжал просматривать журналы неудачных тестовых задач, но не видел расширенных переменных в журнале создания файла. Так что действительно эта часть работает. Моя сборка по-прежнему терпит неудачу, но проблема должна заключаться где-то в другом месте, между созданием env и командой npm. К вашему сведению, причина, по которой я думал, что переменные не были расширены, заключалась в том, что мои тесты Cypress терпят неудачу на первом этапе, то есть cy.request(), который не может найти правильный URL-адрес (который я указываю в env).
Судя по вашему описанию, я предполагаю, что для ваших тестовых этапов нужен артефакт, опубликованный на этапе BuildArtifact
. Но на этапе RunTests
вы его не загрузили, поэтому ваш тест не сможет найти его в $(System.DefaultWorkingDirectory)/somefilepath/MyArtifact
. Вам необходимо загрузить артефакт «MyArtifact» в тестовый рабочий каталог. Ниже я делюсь образцом. Если вам это не помогло, создайте новый вопрос с подробной информацией, включая сообщение об ошибке.
Попробуйте передать переменную из группы переменных в качестве параметра в шаблон, где они будут использоваться.
Например:
variables:
- group: End2EndV3
# code omitted for brevity
- stage: RunTests
jobs:
- job: RunTests
steps:
- template: template-test-release.yml
parameters:
foo: "$(myVariableFromLibraryValue)" # from variable group
parameters:
- name: foo
type: string
displayName: 'Foo'
steps:
- task: eliostruyf.build-task.custom-build-task.file-creator@6
displayName: 'Create cypress.env.json'
inputs:
filepath: 'somefilepath/MyArtifact/cypress.env.json'
filecontent: |
{
"myVariable": "${{ parameters.foo }}",
}
fileoverwrite: true
verbose: true
# .....
Рекомендуемое чтение:
Спасибо, я последовал предложению и использовал параметры, но ошибка не устранена. Мне интересно, записаны ли переменные, например, не в тот файл, но я не могу понять, что происходит.
@Bice дважды проверьте регистр имен переменных, т.е. используете ли вы ПРОПИСНЫЕ и строчные буквы? Вы используете специальные символы?
На самом деле это была типо-проблема, нехватка пары долларов была очевидна, когда я проверил логи. Спасибо за помощь! Я все еще не добился успешной сборки, но ошибка где-то в другом месте, так как теперь все переменные расширены.
Добавьте задачу DownloadBuildArtifacts@1
в свой template-test-release.yml
перед созданием cypress.env.json
файла. Установите downloadPath
в рабочий каталог вашего теста npm.
steps:
- task: DownloadBuildArtifacts@1
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'MyArtifact'
downloadPath: '$(System.DefaultWorkingDirectory)/somefilepath' #The working directory of your npm test
- task: eliostruyf.build-task.custom-build-task.file-creator@6
displayName: 'Create cypress.env.json'
inputs:
filepath: 'somefilepath/MyArtifact/cypress.env.json'
filecontent: |
{
"myVariable": "$(myVariableFromLibraryValue)",
}
fileoverwrite: true
verbose: true
- task: CmdLine@2
inputs:
script: |
ls
cat cypress.env.json
workingDirectory: '$(System.DefaultWorkingDirectory)/somefilepath/MyArtifact'
Я не знаю ценности somefilepath
. Убедитесь, что ваш артефакт и cypress.env.json
находятся в рабочем каталоге вашего теста npm. Вы можете запустить ls
, чтобы просмотреть все файлы в $(System.DefaultWorkingDirectory)/somefilepath/MyArtifact
перед «npm ci install».
Все решено. В конце концов, и мне потребовалось больше времени, чтобы это понять, в файле env все еще отсутствовали кавычки и дополнительная запятая - поскольку я не копировал последнюю версию из своего локального репозитория, а редактировал ее напрямую в Azure ошибки не появлялись, и, поскольку это шаблон, он пропустил этап проверки. Еще раз спасибо за совет, могу отметить как полностью решенный!
Чтобы передать переменную из группы переменных в шаблон, предлагается передать ее через параметры, как предложено Руи ниже. Однако, проверив ваши скрипты, файл
cypress.env.json
был успешно создан на моей стороне. Не могли бы вы сообщить мне, почему вы считаете, что «задача запуска тестов не удалась, поскольку переменные не разрешены»? Каково значениеmyVariable
в журнале задачиeliostruyf.build-task.custom-build-task.file-creator@6
?