Вызов нагрузочного тестирования из GitLab CI
GitLab
В этом сценарии вы добавите в пайплайн непрерывной интеграции и непрерывной поставки (CI/CD) этап вызова нагрузочного тестирования развертываемого приложения с помощью сервиса Load Testing. На этом этапе скрипт создаст агент тестирования, запустит тест и проверит результат тестирования.
Чтобы добавить вызов нагрузочного тестирования из GitLab CI:
- Подготовьте облако к работе.
- Подготовьте инфраструктуру.
- Подготовьте файл с тестовыми данными.
- Создайте переменные окружения GitLab.
- Добавьте этап нагрузочного тестирования в файл конфигурации сценария CI.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
-
Если агент размещается на платформе Yandex Cloud, взимается плата за вычислительные ресурсы (см. тарифы Yandex Compute Cloud).
-
Плата за хранение данных в бакете и операции с ними (см. тарифы Object Storage).
Подготовьте инфраструктуру
Создайте сервисный аккаунт
-
Создайте сервисный аккаунт
sa-loadtest
в каталоге, где будет размещаться агент, с которого будет подаваться нагрузка. -
Назначьте сервисному аккаунту роли:
loadtesting.generatorClient
;loadtesting.loadTester
;iam.serviceAccounts.user
;compute.editor
;vpc.user
;vpc.publicAdmin
(опционально, если агент будет разворачиваться в публичной сети).
-
Создайте авторизованный ключ для этого сервисного аккаунта и сохраните ключ в файл
key.json
.
Настройте сеть
Создайте и настройте NAT-шлюз в подсети, где размещается цель тестирования и будет размещен агент. Это обеспечит доступ агента к сервису Load Testing.
Настройте группу безопасности
Настройте группу безопасности агента тестирования:
- Создайте группу безопасности агента
agent-sg
. - Добавьте правила:
-
Правило для исходящего HTTPS-трафика к публичному API Load Testing:
- Диапазон портов:
443
. - Протокол:
TCP
. - Назначение:
CIDR
. - CIDR блоки:
0.0.0.0/0
.
Это позволит подключить агент к сервису Load Testing, чтобы управлять тестами из интерфейса и получать результаты тестирования.
- Диапазон портов:
-
Правило для входящего SSH-трафика:
- Диапазон портов:
22
. - Протокол:
TCP
. - Назначение:
CIDR
. - CIDR блоки:
0.0.0.0/0
.
Это позволит подключаться к агенту по протоколу SSH и управлять тестами из консоли или собирать отладочную информацию.
- Диапазон портов:
-
Правило для исходящего трафика при подаче нагрузки к цели тестирования:
- Диапазон портов:
0-65535
. - Протокол:
Любой
. - Назначение:
Группа безопасности
.
ВыберитеИз списка
. Укажите группу безопасности, в которой находится нужная цель тестирования.
Создайте такое правило для каждой цели тестирования с уникальной группой безопасности.
- Диапазон портов:
-
Подготовьте пайплайн CI/CD в GitLab для развертывания цели тестирования
В данном сценарии, в качестве примера цели тестирования, будем использовать приложение с публичным IP-адресом 51.250.103.44
. С примером построения пайплайна CI/CD в GitLab вы можете ознакомиться в статье.
Подготовьте файл с тестовыми данными
-
Сформируйте тестовые данные в формате HTTP_JSON:
{"host": "51.250.103.44", "method": "GET", "uri": "/", "tag": "url1", "headers": {"User-agent": "Tank", "Connection": "Close"}}
Где:
host
— значение заголовкаHost
;method
— метод HTTP-запроса;uri
— URI запроса;tag
— тег запроса для отображения в отчетах;headers
— заголовки запроса.
Для подготовки тестовых данных вы также можете воспользоваться инструментом Dispatcher.
-
Сохраните тестовые данные в файл
httpjson.payload
. -
Выдайте сервисному аккаунту права на чтение в бакете. Для этого отредактируйте ACL бакета:
- В консоли управления
выберите каталог, в котором находится бакет. - В списке сервисов выберите Object Storage.
- Напротив нужного бакета нажмите
и выберите ACL бакета. - В открывшемся окне введите имя сервисного аккаунта, выберите права на чтение в бакете —
READ
и нажмите кнопку Добавить. - Нажмите кнопку Сохранить.
Сервисному аккаунту будут предоставлены права на чтение данных только из этого бакета.
- В консоли управления
Создайте переменные окружения GitLab
-
На панели слева в GitLab перейдите в раздел Settings и во всплывающем списке выберите пункт CI/CD.
-
Нажмите кнопку Expand напротив пункта Variables.
-
Добавьте переменные окружения с выключенной опцией защиты:
SERVICE_ACCOUNT_ID
— идентификатор сервисного аккаунтаsa-loadtest
;SA_AUTHORIZED_KEY
— содержимое авторизованного ключа для сервисного аккаунтаsa-loadtest
;SECURITY_GROUP_ID
— идентификатор группы безопасностиagent-sg
агента тестирования;SUBNET_ID
— идентификатор подсети, в которой будет размещен агент тестирования;ZONE
— зона доступности, в которой будет размещен агент тестирования, например,ru-central1-a
;YC_FOLDER_ID
— идентификатор каталога, в котором будут размещены ресурсы.
Для добавления переменной:
- Нажмите кнопку Add variable.
- В появившемся окне в поле Key укажите имя переменной, в поле Value — значение переменной.
- Выключите опцию Protect variable.
- Нажмите кнопку Add variable.
Добавьте этап нагрузочного тестирования в файл конфигурации сценария CI
-
Добавьте в репозиторий вашего проекта на GitLab файл конфигурации нагрузочного теста
test-config.yaml
:pandora: enabled: true package: yandextank.plugins.Pandora config_content: pools: - id: HTTP gun: type: http target: 51.250.103.44 ssl: false ammo: type: http/json file: httpjson.payload result: type: phout destination: ./phout.log startup: type: once times: 1000 rps: - type: line from: 0 to: 500 duration: 60s discard_overflow: true log: level: error monitoring: expvar: enabled: true port: 1234 autostop: enabled: true package: yandextank.plugins.Autostop autostop: - limit(5m) # Обязательный параметр - quantile(50,100,5,) core: {}
В поле
target
укажите адрес вашего приложения. Тест по этой конфигурации будет генерировать линейную нагрузку от 0 до 500 запросов в секунду в течение 60 секунд. Также настроен критерий автостопа. Этот критерий остановит тест, если в течение 5 секунд 50 процентиль превысит 100 миллисекунд. -
Добавьте в файл
.gitlab-ci.yml
этап нагрузочного тестирования после развёртывания приложения:stages: ... - loadtesting ... loadtesting-job: stage: loadtesting allow_failure: true artifacts: when: always name: "tests_output" paths: - agent_id.txt before_script: # Установка инструментов. - sudo apt-get install -y jq - curl --fail --silent --location --remote-name https://storage.yandexcloud.net/yandexcloud-yc/install.sh - sudo bash install.sh -i /usr/local/yandex-cloud -n - sudo ln -f -s /usr/local/yandex-cloud/bin/yc /usr/local/bin/yc # Аутентификация с помощью ключа сервисного аккаунта - echo "$SA_AUTHORIZED_KEY" > key.json - yc config profile create sa-profile || echo "Profile already exists" - yc config set service-account-key key.json - yc config set folder-id ${YC_FOLDER_ID} script: # Создание агента тестирования - agent_id=$(yc loadtesting agent create --name agent${CI_JOB_ID} --zone ${ZONE} --service-account-id ${SERVICE_ACCOUNT_ID} --network-interface security-group-ids=${SECURITY_GROUP_ID},subnet-id=${SUBNET_ID} --format json | jq -r .id) - echo $agent_id > agent_id.txt # Ожидание готовности агента - | while true; do if ! _status=$(yc loadtesting agent get "$agent_id" --format json | jq -r '.status'); then sleep 10 continue fi if [[ "$_status" == "READY_FOR_TEST" ]]; then echo "Agent is ready" break fi echo "Waiting for agent..." sleep 10 done # Создание конфигурации - config_id=$(yc loadtesting test-config create --from-yaml-file test-config.yaml --format json | jq -r .id) # Запуск теста - test_id=$(yc loadtesting test create --name "test_${CI_COMMIT_SHORT_SHA}" --description "${CI_COMMIT_MESSAGE}" --labels auto=true --configuration agent-id=$agent_id,id=$config_id,test-data=httpjson.payload --test-data name=httpjson.payload,s3bucket=payload-bucket,s3file=httpjson.payload --wait --format json | jq -r .id) - yc loadtesting test wait --idle-timeout 120s $test_id # Оценка результатов теста - q50=$(yc loadtesting test get-report-table $test_id --format json | jq -r .overall.quantiles.q50) - | if [[ $q50 -gt 100 ]]; then echo "Q50 больше 100 мс, тест не пройден" exit 1 fi after_script: # Удаление агента тестирования - agent_id=$(cat agent_id.txt) - yc loadtesting agent delete $agent_id - rm agent_id.txt
На описанном этапе скрипт создаст агент тестирования, запустит тест и проверит результат тестирования. В качестве оценки результата используется 50 процентиль. Если его значение будет больше 100 миллисекунд, этап завершится с ошибкой.
После сохранения файла конфигурации
.gitlab-ci.yml
запустится сценарий сборки.Подробнее результаты теста вы можете посмотреть в консоли управления:
- В консоли управления
выберите сервис Load Testing. - На панели слева выберите Тесты.
- Выберите созданный тест и перейдите на вкладку Результаты теста.
Логику подключения этого этапа можно сделать произвольной:
- по коммитам в основную ветку;
- по обновлению в Pull Request.
Более сложные сценарии разобраны в видео:
- В консоли управления
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- Удалите сервисные аккаунты.
- Удалите бакет Object Storage.
- Убедитесь, что удален агент тестирования, созданный скриптом. Вы можете удалить агент вручную.
- Удалите таблицу маршрутизации.
- Удалите NAT-шлюз.