Мы можем запускать тесты либо локально (запущенные с нашей собственной машины), либо с помощью контроллера тестирования, который передает тесты нескольким агентам тестирования, чтобы их можно было запускать параллельно.
поэтому мы планируем использовать второй вариант, который использует тестовый контроллер для запуска тестов из конвейеров Azure.
Если мы используем файл настроек теста с несколькими агентами, наши тесты будут запускаться через контроллер тестирования. Поскольку мы выбираем этот вариант, нам нужно будет поместить файл ConfigClient.endpoint.config в Pp\bin из репозитория Azure. Вот скриншот файла ConfigClient.endpoint.config.
и этот файл ConfigClient.endpoint.config, который указывает на службу конфигурации в среде, которую мы хотим протестировать. Этот файл будет скопирован в агенты тестирования, и таким образом каждый агент тестирования будет знать, в какой среде запускать.
можем ли мы выбрать/параметризировать среду, которую мы задаем в сборке для указанного выше местоположения, если да, то как? Поскольку нам нужно запустить большое количество тестов автоматизации, мы можем использовать контроллер тестирования, который передает тесты нескольким агентам тестирования, чтобы их можно было запускать параллельно. В настоящее время у нас есть Контроллер: ConrollerServer.Domain.local Агенты: от Controllerserver.Domain.local до server.domain.local. итак у нас 12 агентов
здесь, в коде, мы выбираем контроллер, выделенный ниже, можем ли мы выбрать/параметризировать контроллер? если да, то как?
Я слышал, что это можно сделать с помощью токена замены, но как этого добиться, можете привести пример.
1.Я пытался использовать параметр, но это не сработало. 2. Я пытался использовать токен замены, но не знаю, как изменить эту задачу и получить желаемые результаты. 3. Я пытался использовать переменные вместе с параметрами, но это не сработало.
Правильно, вы можете использовать задачу Заменить токены, чтобы передать выбранный контроллер в файл testsettings
:
testsettings
вы можете установить, как показано ниже. {{ TestSettings_Name }}
и {{ RemoteController_Name }}
— это токены-заполнители, которые будут заменены фактически выбранными значениями при выполнении задачи «Заменить токены».<?xml version = "1.0" encoding = "UTF-8"?>
<TestSettings name = "{{ TestSettings_Name }}" id = "32wfwerfsdr34rtt" xmlns = "http://microsoft.com/schemas/visualstudio/xxx">
<Description>My tests.</Description>
<RemoteController name = "{{ RemoteController_Name }}" />
<Execution location = "Remote">
<Timeouts runTimeout = "27000000" testTimeout = "10740000" />
. . .
</Execution>
. . .
</TestSettings>
parameters:
- name: TestSetting
default: testSet01
values:
- testSet01
- testSet02
- testSet03
- name: Controller
default: controller01
values:
- controller01
- controller02
- controller03
testsettings
.echo "##vso[task.setvariable variable=TestSettings_Name;]${{ parameters.TestSetting }}"
echo "##vso[task.setvariable variable=RemoteController_Name;]${{ parameters.Controller }}"
parameters:
- name: TestSetting
default: testSet01
values:
- testSet01
- testSet02
- testSet03
- name: Controller
default: controller01
values:
- controller01
- controller02
- controller03
stages:
- stage: A
jobs:
- job: A1
steps:
- task: Bash@3
displayName: 'Set variable'
inputs:
targetType: inline
script: |
echo 'The selected TestSetting is ${{ parameters.TestSetting }}.'
echo 'The selected Controller is ${{ parameters.Controller }}.'
echo "##vso[task.setvariable variable=TestSettings_Name;]${{ parameters.TestSetting }}"
echo "##vso[task.setvariable variable=RemoteController_Name;]${{ parameters.Controller }}"
- task: Bash@3
displayName: 'Print file before replace'
inputs:
targetType: inline
script: cat relative/path/to/Azure_Dev.testsettings
- task: replacetokens@6
inputs:
root: '$(Build.SourcesDirectory)'
sources: 'relative/path/to/Azure_Dev.testsettings'
tokenPattern: 'doublebraces'
missingVarAction: 'keep'
missingVarLog: 'error'
- task: Bash@3
displayName: 'Print file after replace'
inputs:
targetType: inline
script: cat relative/path/to/Azure_Dev.testsettings
Полученные результаты:
@user25518631 user25518631, Да, вы также можете использовать параметры для выбора и передачи целевой среды в конвейер для использования. Если вы также хотите передать значение целевой среды в файлы конфигурации, вы можете использовать тот же метод, что и в моем ответе выше.
Привет, Яркий. Хорошо, предположим, что этот файл конечной точки конфигурации доступен только в папке bin в агенте (агент масштабируемого набора VMSS -selfhosted) только во время работы конвейера, в этом случае, как использовать этот метод замены токена, не могли бы вы помочь мне в этом. ..
@user25518631 user25518631, вы имеете в виду, что файл конечной точки конфигурации создается на этапе задания конвейера, а не в виде существующего файла в исходном репозитории? Если да, то я боюсь, что невозможно использовать задачу замены токена для обновления файла. Потому что перед использованием задачи замены токена, как упоминалось выше, вам необходимо установить в файлах токены-заполнители.
Привет, Брайт, здесь я использую задачу пакетного сценария для создания файла в каталоге агента, а затем в качестве следующего шага я использую задачу замены токена, это не сработает?
@user25518631 user25518631, как я уже говорил ранее, чтобы использовать задачу замены токена, вам сначала необходимо установить токены-заполнители в целевом файле. Если в файле, созданном с помощью пакетного сценария, не установлены токены-заполнители, задача замены токена не распознает действительные токены для замены в файле. Обычно целевым файлом должен быть существующий файл, хранящийся в исходном репозитории, чтобы вы могли вручную редактировать его и устанавливать в файле токены-заполнители.
@user25518631 user25518631, если файл конечной точки конфигурации имеет стабильный и распространенный формат, вы можете рассмотреть возможность размещения файла шаблона в исходном репозитории. Для свойств, которым необходимо устанавливать разные значения в зависимости от разных сред, вы можете установить их значения в качестве токенов-заполнителей в файле шаблона. Затем вы можете обратиться к шагам из моего ответа выше, чтобы передать выбранные вами фактические значения в файл шаблона для замены токенов-заполнителей. Тогда вы сможете использовать обновленный файл в последующем тестовом задании.
Привет, Брайт Ран, я вижу следующую ошибку, когда я запустил конвейер с вышеуказанными задачами, задача, которую он выдал, содержит ошибку, задана переменная задача, и ошибка: невозможно найти исполняемый файл: «bash». Убедитесь, что путь к файлу существует или файл можно найти в каталоге, указанном переменной среды PATH. Также убедитесь, что файл имеет допустимое расширение для исполняемого файла и, к вашему сведению: git уже есть в агенте. какой масштабируемый набор виртуальной машины. Подскажите, пожалуйста.
Привет, Брайт, я попытался добавить вышеуказанные задачи, но столкнулся со следующей ошибкой ##[ошибка]Невозможно найти исполняемый файл: 'bash'. Убедитесь, что путь к файлу существует или файл можно найти в каталоге, указанном переменной среды PATH. Также убедитесь, что файл имеет допустимое расширение для исполняемого файла. Я попытался добавить задачу PowerShell, которая устанавливает git и добавит переменную среды, как показано ниже, но все равно та же ошибка:
и еще один вопрос, поскольку задача bash выдает ошибку, связанную с env var. path, можем ли мы использовать какой-либо другой тип задачи для работы над назначением токена замены?
В соответствии с рекомендациями и стандартным подходом к файлам конфигурации в процессах CI/CD для обработки сценария, когда файл ConfigClient.endpoint.config доступен только в папке bin на агенте во время выполнения конвейера, вы все равно можете использовать метод замены токенов.
Вам нужно будет сделать следующее:
Во-первых, вам нужно будет определить необходимые переменные или параметры в YAML-файле Azure Pipelines или в пользовательском интерфейсе конвейера, чтобы указать среду. Например:
parameters:
- name: environment
displayName: Environment
type: string
default: 'development'
values:
- development
- staging
- production
Затем вы также подтвердите и убедитесь, что ваш файл ConfigClient.endpoint.config содержит токены, которые будут заменены. Как вы сказали в комментарии, файл должен находиться в каталоге bin агента. Например:
<configuration>
<appSettings>
<add key = "ConfigServiceEndpoint" value = "#{ConfigServiceEndpoint}#" />
</appSettings>
</configuration>
Наконец, добавьте задачу «Заменить токены» в YAML-файл Azure Pipelines. Настройте его для использования файла ConfigClient.endpoint.config в каталоге bin. Например:
jobs:
- job: RunTests
pool:
vmImage: 'ubuntu-latest' # Change this to your VMSS scale set agent pool
variables:
ConfigServiceEndpoint: ${{ parameters.environment == 'development' && 'https://dev.configservice.domain.local' || parameters.environment == 'staging' && 'https://staging.configservice.domain.local' || parameters.environment == 'production' && 'https://prod.configservice.domain.local' }}
steps:
- task: qetza.replacetokens.replacetokens-task.replacetokens@3
inputs:
targetFiles: '**/bin/ConfigClient.endpoint.config' # Target the config file in the bin directory
encoding: 'auto'
writeBOM: true
actionOnMissing: 'warn'
keepToken: false
tokenPrefix: '#{'
tokenSuffix: '}#'
useLegacyPattern: false
- script: |
echo "Running tests with the following configuration:"
cat **/bin/ConfigClient.endpoint.config
displayName: 'Display Config File'
Обратите внимание на все параметры, только displayName является необязательным. Вы можете включить задачи сценариев для запуска тестов.
Вторая часть на основе вашего комментария:
Чтобы заменить часть dev02 в файле ConfigClient.Endpoint.config параметризованным значением на основе выбранной среды, вы можете применить аналогичный подход, используя задачу «Заменить токены».
parameters:
- name: environment
displayName: Environment
type: string
default: 'development'
values:
- development
- staging
- production
jobs:
- job: RunTests
pool:
vmImage: 'ubuntu-latest' # Change this to your VMSS scale set agent pool
variables:
EnvironmentSuffix: ${{ parameters.environment == 'development' && 'dev02' || parameters.environment == 'staging' && 'staging01' || parameters.environment == 'production' && 'prod01' }}
steps:
- task: qetza.replacetokens.replacetokens-task.replacetokens@3
inputs:
targetFiles: '$(Pipeline.Workspace)/test/Payerpath/bin/ConfigClient.Endpoint.config' # Target the config file in the bin directory
encoding: 'auto'
writeBOM: true
actionOnMissing: 'warn'
keepToken: false
tokenPrefix: '#{'
tokenSuffix: '}#'
useLegacyPattern: false
- script: |
echo "Running tests with the following configuration:"
cat $(Pipeline.Workspace)/test/Payerpath/bin/ConfigClient.Endpoint.config
displayName: 'Display Config File'
Каким-то образом я мог сделать доступным соответствующий файл с желаемым содержимым по следующему пути. который доступен в агенте $(Pipeline.Workspace)\test\Pp\bin\ConfigClient.Endpoint.config, теперь содержимое, доступное в файле ConfigClient.Endpoint.config, меньше единицы: Services-dev02.ConfigWebService/ConfigService.asmx %22 , теперь я хочу заменить это значение dev02, означающее параметризованное. не могли бы вы подсказать по этому поводу –
Если условное выражение && или || или == не работает, мы можем использовать оператор if: EnvironmentSuffix: ${{ if eq(parameters.environment, 'development') }}: 'dev02' ${{ if eq(parameters.environment, 'staging') } }: 'staging01' ${{ if eq(parameters.environment, 'production') }}: 'prod01'
Привет, Брайт. Спасибо за ответ. На первом снимке экрана, которым я поделился, есть конечная точка конфигурации, где мне нужно выбрать целевую среду. Как мы можем сделать это? Не могли бы вы предложить пример снимка экрана или приведенные выше параметры позаботятся об этой среде? и агенты?