Ознакомьтесь с сервисом: https://yandex.cloud/ru/docs/load-testing/
Нагрузка в YC Load Testing генерируется нодами, называемыми агентами нагрузочного тестирования. На данный момент сервис предоставляет две опции по созданию таких агентов тестирования:
- Агент в Yandex Compute Cloud (подробнее...)
- Внешний агент (подробнее...)
Управление внешними агентами нагрузочного тестирования осуществляется пользователем.
Процесс подготовки конфигурационных файлов и файлов с тестовыми данными включает в себя непосредственно написание этих файлов и их отладку. Эти подготовительные работы рекомендуется проводить через UI - в консоли управления.
О том, как начать пользоваться сервисом и создать свои первые тесты, можно узнать в разделе "Практические руководства" в документации сервиса.
- Создайте сервисный аккаунт, от имени которого будут запускаться нагрузочные тесты
- Выдайте сервисному аккаунту необходимые роли:
loadtesting.loadTester
- (Опционально) Если вы планируете разворачивать
compute
агента нагрузочного тестирования в рамках CI, выдайте так же следующие роли:iam.serviceAccounts.user
compute.editor
vpc.user
vpc.publicAdmin
(опционально, если агент будет разворачиваться в публичной сети)
- (Опционально) Для использования файлов из репозитория в качестве тестовых данных, необходимо использовать промежуточное хранилище в виде бакета Object Storage (CI загружает -> агент скачивает -> СI удаляет):
- создайте бакет в Object Storage
- выдайте права на запись одним из следующих способов:
storage.editor
(глобальная роль в каталоге)editor
(ACL в бакете)
- Создайте авторизованный ключ для сервисного аккаунта, сохраните
json
файл с ключом локально на диск. - Добавьте переменную
YC_LOADTESTING_CI_AUTHORIZED_KEY_JSON
в настройках GitLab CI. В качестве значения, вставьте содержимое скачанногоjson
файла авторизованного ключа.
Для каждого теста, который планируется запускать, должна быть создана отдельная папка:
- файл конфигурации сохраните под именем, соответствующим маске
test-config*.yaml
. - файлы с тестовыми данными положите рядом - перед выполнением теста они будут временно загружены в Object Storage, а во время выполнения, агент их оттуда скачает.
Имя теста, в таком случае, будет соответствовать имени папки, в которой находится файл конфигурации.
Прим: О том, как переопределить имя создаваемого теста, а так же другие параметры запуска, можно прочитать здесь.
Примеры можно посмотреть в папке sample-tests.
Скопируйте скрипты из папки automation к себе в репозиторий.
Для наглядности, далее предполагается, что эта папка находится в корне. При копировании в другое место (или переименовании), просто поменяйте инструкции вызовов скриптов: automation/test.sh blahblah
-> my/custom/dir/test.sh blahblah
.
Для создания тестов и управления агентами в рамках CI, необходимо следующее:
- установлены утилиты командной строки:
curl
,jq
. - установлена и настроена утилита командной строки YC CLI.
В данной инструкции мы определим шаблон .test-loadtesting-template
, и все последующие CI шаги будем наследовать от него с помощью extends: .test-loadtesting-template
.
# .gitlab-ci.yml
.test-loadtesting-template:
variables:
# авторизованный ключ сервисного аккаунта
YC_LT_AUTHORIZED_KEY_JSON: ${YC_LOADTESTING_CI_AUTHORIZED_KEY_JSON}
# id каталога для сервиса Load Testing
YC_LT_FOLDER_ID: '%%%_CHANGE_ME_%%%'
before_script:
- if [[ -z $YC_LT_AUTHORIZED_KEY_JSON ]]; then exit 1; fi
- if [[ -z $YC_LT_FOLDER_ID ]]; then exit 1; fi
# ----------------------------- install utilities ---------------------------- #
- DEBIAN_FRONTEND=noninteractive apt update
- DEBIAN_FRONTEND=noninteractive apt install -y curl jq
- curl -f -s -LO https://storage.yandexcloud.net/yandexcloud-yc/install.sh
- bash install.sh -i /usr/local/yandex-cloud -n
- ln -sf /usr/local/yandex-cloud/bin/yc /usr/local/bin/yc
# ----------------------------- configure yc cli ----------------------------- #
- echo "${YC_LT_AUTHORIZED_KEY_JSON}" > key.json
- yc config profile create sa-profile
- yc config set service-account-key key.json
- yc config set format json
- yc config set folder-id ${YC_LT_FOLDER_ID}
Прим: Для того, чтобы избежать необходимости настройки окружения при каждом запуске, вы также можете выполнить эту настройку непосредственно на GitLab Runner.
Чтобы не держать постоянно поднятые агентские ВМ, добавьте шаги по их созданию и удалению в рамках pipeline
.
# .gitlab-ci.yml
stages:
# ... стадии "до"
- test-loadtesting
- test-loadtesting-cleanup
# ... стадии "после"
test-loadtesting-create-agents:
extends: .test-loadtesting-template-job
stage: test-loadtesting
script:
- set -e
- automation/agent.sh create --count 2 \
--description "CI agent" \
--labels "pipeline=${CI_PIPELINE_IID}" \
--service-account-id "###SECRET###" \
--zone "###SECRET###" \
--network-interface "subnet-id=###SECRET###,security-group-ids=###SECRET###" \
--cores 2 \
--memory 2G
test-loadtesting-delete-agents:
extends: .test-loadtesting-template-job
stage: test-loadtesting-cleanup
when: always
interruptible: false
script:
- set -e
- automation/agent.sh delete \
--labels "pipeline=${CI_PIPELINE_IID}"
-
test-loadtesting-create-agents
- создание агентов; параметры, передаваемые вautomation/agent.sh create
необходимо заменить на свои значенияstage: test-loadtesting
, в этой же стадии будут запускаться тестыautomation/agent.sh create
совместимyc loadtesting agent create
, но добавлен параметр--count
для удобного создания нескольких агентов одновременно.
-
test-loadtesting-delete-agents
- удаление агентовstage: test-loadtesting-cleanup
, стадия должна запускаться даже если при неудачном завершении шагов по созданию агентов или запуска тестов.automation/agent.sh delete
- дополнительный скрипт, который удаляет агентов с метками, перечисленными в--labels "label1=valu1,label2=value2"
.
# .gitlab-ci.yml
stages:
# ... стадии "до"
- test-loadtesting
# ... стадии "после"
test-loadtesting-run:
extends: .test-loadtesting-template-job
stage: test-loadtesting
# ресурсная группа, предотвращает параллельное выполнение
# нагрузочных тестов из нескольких pipeline
resource_group: loadtesting
# шаг создания compute агентов
needs: [test-loadtesting-create-agents]
script:
- set -e
# automation/test.sh умеет заменять ${YC_LT_TARGET} в файлах
# c тестовыми конфигурациями
#
- export YC_LT_TARGET="###SECRET###"
# имя Object Storage бакета, используемого для передачи на агент
# хранящихся в репозитории файлов с тестовыми данными
#
- export YC_LT_DATA_BUCKET="###SECRET###"
# определяем критерий выбора агентов, на которых будут запускаться тесты
#
- export YC_LT_TEST_AGENT_FILTER="labels.pipeline = '${CI_PIPELINE_IID}'"
# добавляем ссылку на pipeline в описание создаваемых тестов
#
- export YC_LT_TEST_EXTRA_DESCRIPTION="GitLab CI url - ${CI_PIPELINE_URL}"
# передаем список тестов для запуска
#
- automation/test.sh \
sample-tests/smoke \
sample-tests/mixed-synthetic-payload \
sample-tests/mixed-irl-payload \
sample-tests/mixed-irl-payload-multi \
sample-tests/root-const \
sample-tests/root-imbalance
automation/test.sh
принимает набор директорий, в которых находятся конфигурации тестов. Для каждого теста-директории скрипт выполняет следующие шаги:
- Подготовка:
- Помечает все неконфигурационные файлы в директории как файлы с тестовыми данными.
- Выгружает файлы с тестовыми данными в бакет
YC_LT_DATA_BUCKET
. - Определяет параметры создания теста с помощью
meta.json
. Параметры включают в себя: описание теста; метки теста; обязательные метки агентов; дополнительные файлы с тестовыми данными; количество агентов для параллельного запуска.
- Запуск:
- Создает тест.
- Дожидается завершения его выполнения.
- Проверка с помощью
automation/_test_check.sh
:- Выполняет скрипт проверки свойств теста
test_dir/check_summary.sh
. - Выполняет скрипт проверки результатов теста
test_dir/check_report.sh
.
- Выполняет скрипт проверки свойств теста
Дополнительно, automation/test.sh
учитывает следующие переменные окружения:
YC_LT_DATA_BUCKET
- имя Object Storage бакета, используемого для передачи на агент хранящихся в репозитории файлов с тестовыми данными.- WARNING: У сервисного аккаунта, с которым запускается агент, должны быть права на чтение файлов из этого бакета.
- WARNING2: У сервисного аккаунта, ключ которого используется в GitLab CI, должны быть права на загрузку файлов в этот бакет.
YC_LT_TEST_AGENT_FILTER
- дополнительный фильтр для выбора агентов- Прим: Протестировать валидность фильтра можно через CLI:
yc loadtesting agent list --filter "MY_FILTER_STRING"
.
- Прим: Протестировать валидность фильтра можно через CLI:
YC_LT_SKIP_TEST_CHECK
- флаг, отключащий стадию проверок (любое отличное от0
значение для отключения).
- По коммитам в основную ветку
- По обновлению в Pull Request
Чтобы следить за эволюцией производительности сервиса/теста во времени, вы можете создать и настроить графики регрессий.