Группа переменных не разрешена в задаче создания файлов в Azure Pipelines

У меня есть проект в Azure DevOps по созданию и выпуску тестов e2e для других проектов FE. Мы переходим от обычных конвейеров графического пользовательского интерфейса с группами задач к конвейерам YAML, но у меня возникают проблемы при использовании переменных из группы переменных.

Что у меня было:

  • конвейер сборки для создания и публикации артефакта -> это отлично работает и в yaml
  • конвейер сборки с несколькими задачами — загрузка артефакта, установка npm, задача File Creator для создания файла .env (переменные были определены непосредственно в графическом интерфейсе), команда npm для запуска тестов
  • и отпустить.

Что у меня есть сейчас:

  • Шаблон YAML для создания файла и запуска теста (шаблон, поскольку я буду использовать его вместо группы задач и для других проектов)
  • 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

Чтобы передать переменную из группы переменных в шаблон, предлагается передать ее через параметры, как предложено Руи ниже. Однако, проверив ваши скрипты, файл cypress.env.json был успешно создан на моей стороне. Не могли бы вы сообщить мне, почему вы считаете, что «задача запуска тестов не удалась, поскольку переменные не разрешены»? Каково значение myVariable в журнале задачи eliostruyf.build-task.custom-build-task.file-creator@6?

Ziyang Liu-MSFT 11.04.2024 16:20

@ZiyangLiu-MSFT Спасибо за предложение просмотреть журналы! Я совершенно их пропустил. Я продолжал просматривать журналы неудачных тестовых задач, но не видел расширенных переменных в журнале создания файла. Так что действительно эта часть работает. Моя сборка по-прежнему терпит неудачу, но проблема должна заключаться где-то в другом месте, между созданием env и командой npm. К вашему сведению, причина, по которой я думал, что переменные не были расширены, заключалась в том, что мои тесты Cypress терпят неудачу на первом этапе, то есть cy.request(), который не может найти правильный URL-адрес (который я указываю в env).

Bice 11.04.2024 16:57

Судя по вашему описанию, я предполагаю, что для ваших тестовых этапов нужен артефакт, опубликованный на этапе BuildArtifact. Но на этапе RunTests вы его не загрузили, поэтому ваш тест не сможет найти его в $(System.DefaultWorkingDirectory)/somefilepath/MyArtifact. Вам необходимо загрузить артефакт «MyArtifact» в тестовый рабочий каталог. Ниже я делюсь образцом. Если вам это не помогло, создайте новый вопрос с подробной информацией, включая сообщение об ошибке.

Ziyang Liu-MSFT 12.04.2024 08:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Например:

Магистральный трубопровод
variables:
- group: End2EndV3

# code omitted for brevity

- stage: RunTests
  jobs:
  - job: RunTests
    steps:
    - template: template-test-release.yml
      parameters:
        foo: "$(myVariableFromLibraryValue)" # from variable group

шаблон-test-release.yml:

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 11.04.2024 15:59

@Bice дважды проверьте регистр имен переменных, т.е. используете ли вы ПРОПИСНЫЕ и строчные буквы? Вы используете специальные символы?

Rui Jarimba 11.04.2024 16:04

На самом деле это была типо-проблема, нехватка пары долларов была очевидна, когда я проверил логи. Спасибо за помощь! Я все еще не добился успешной сборки, но ошибка где-то в другом месте, так как теперь все переменные расширены.

Bice 11.04.2024 16:51

Добавьте задачу 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 ошибки не появлялись, и, поскольку это шаблон, он пропустил этап проверки. Еще раз спасибо за совет, могу отметить как полностью решенный!

Bice 12.04.2024 13:39

Другие вопросы по теме

Похожие вопросы

Невозможно развернуть группу ресурсов Azure из Devops с помощью шаблона ARM и Powershell
Проблема с развертыванием кода функции Azure в слоте FunctionApp с использованием yaml (zip-архив не найден)
Azure DevOps YAML – как получить имя ветки из ссылки на репозиторий?
Ошибка выдачи CircleCI: невозможно найти объявление для фильтрации пути шага/filtercci-language-server
Сбой развертывания после миграции cdk из-за того, что «ресурсы уже существуют в стеке и не могут быть импортированы»
Как проверить файл yaml в задаче azuredevops
Отправьте файлы в хранилище Azure с помощью Azure Devops Pipeline. невозможно запустить задание из-за ошибки: невозможно просканировать путь \\?\D:\a\1\s\drop\editor-docs
Получите разрешения пользователей в отношении репозиториев через API ADO
Проблема с «InputValue» в редакторе сценариев Google Home YAML
Проверка yaml. Все элементы сопоставления должны начинаться в одном столбце в строке 14, столбец 1