В этом сценарии вы добавите этап запуска нагрузочных тестов Yandex Load Testing в ваш деплойный GitHub Actions CI Workflow.
Взаимодействие с Yandex Load Testing (запуск тестов, создание и удаление агентов нагрузочного тестирования) будет осуществляться с помощью экшенов, опубликованных в официальном аккаунте Yandex Cloud на GitHub: https://github.com/yandex-cloud/yc-github-loadtesting-ci.
Tip
Примеры workflow:
- yandex-cloud/yc-github-loadtesting-ci: YC Load Testing example actions CI - пример из репозитория с экшенами
- yandex/pandora: Performance tests - перф-тесты генератора нагрузки Pandora
Ознакомьтесь с сервисом Yandex Load Testing; используя веб интерфейс консоли управления Yandex Cloud, проведите тесты, которые планируете запускать в CI.
- Создайте (зарегистрируйте) агента, с которого будет проводиться нагрузочный тест
- Проведите нагрузочные тесты
- См. "Практические руководства" в документации сервиса.
- Сохраните файлы конфигураций тестов и тестовые данные
1.1. Создайте сервисный аккаунт, от имени которого будет осуществляться создание тестов и управление агентами
-
Создайте сервисный аккаунт в используемом для нагрузочного тестирования каталоге
-
Назначте на созданный аккаунт необходимые роли:
- Обязательные:
loadtesting.loadTester
- Опциональные:
- Для создания и удаления агентов нагрузочного тестирования в Compute Cloud:
iam.serviceAccounts.user
compute.editor
vpc.user
vpc.publicAdmin
- Для заливки файлов в Object Storage:
storage.editor
(либо как клобальную роль в каталоге, либо в ACL конкретного бакета)
- Для создания и удаления агентов нагрузочного тестирования в Compute Cloud:
- Обязательные:
-
Создайте авторизованный ключ для сервисного аккаунта, сохраните
json
файл с ключом локально на диск -
Преобразуйте сохраненный файл ключа в base64, воспользовавшись стандартной утилитой командной строки:
cat authorized_key.json | base64 > authorized_key.json.pem
Note
Object Storage может использоваться как промежуточное хранилище необходимых для корректной работы теста файлов, к которым у агента изначально нет доступа:
- хранящиеся в репозитории файлы с тестовыми данными
- собираемые в рамках workflow исполняемые файлы генераторов)
- ...
Warning
Для того, чтобы агент имел возможность скачать файлы из бакета Object Storage, его сервисному аккаунту должна быть выдана роль storage.viewer
.
В настройках вашего GitHub репозитория, перейдите в раздел Secrets and variables -> Actions и добавьте**:
- Секреты:
YC_LOADTESTING_KEY_JSON_BASE64
:******
- в качестве значения, вставьте содержимое закодированного в base64 файла авторизованного ключа (см. выше).
- Переменные:
YC_LOADTESTING_FOLDER_ID
:aje*****************
- значение должно соответствовать идентификатору каталога, в котором будут создаваться тестыYC_LOADTESTING_AGENT_SA_ID
:b1g*****************
- значение должно соответствовать идентификатору сервисного аккаунта, используемого для авторизации исполняющего тесты агента
Tip
Подробные инструкции:
В произвольном месте репозитория, для каждого теста, создайте отдельную папку с именем, соответствущим имени теста. Добавьте в нее:
- файл конфигурации нагрузочного теста (имя файла должно соответствовать маске
test-config*.yaml
); - (опционально) файлы с тестовыми данными;
- (опционально) файл
meta.json
с дополнительными параметрами теста (имя, описание, метки, файлы Object Storage, и т.д; см. инструкцию ниже);
Important
О структуре файлов и задании параметров теста: README-howto-add-test.md.
Tip
Примеры: sample-tests.
Note
Спецификация экшена test-suite: yandex-cloud/yc-github-loadtesting-ci/test-suite.
- Используя консоль управления, создайте (или подключите внешний) агент нагрузочного тестирования с именем
lt-manual-agent
- Убедитесь, что агент успешно подключился к сервису - статус должен быть
READY_FOR_TEST
- Добавьте шаг с запуском нагрузочного теста на этом агенте
name: on: - workflow_dispatch jobs: deploy-service: runs-on: ubuntu-latest steps: - run: 'echo "Here we deploy"' loadtesting-run-smoke: name: 'execute sample-tests/smoke' continue-on-error:true needs: - deploy-service runs-on: ubuntu-latest steps: # используем actions/checkout для того, чтобы получить доступ к файлам # в репозитории - uses: actions/checkout@v4 # используем yandex-cloud/yc-github-loadtesting-ci/test-suite для запуска тестов - id: run # экшен для запуска uses: yandex-cloud/yc-github-loadtesting-ci/test-suite@main with: # значение секрета с авторизованным ключом auth-key-json-base64: ${{ secrets.YC_LOADTESTING_KEY_JSON_BASE64 }} # идентификатор каталога, в котором будет сохранятся информация # о запусках тестов. folder-id: ${{ vars.YC_LOADTESTING_FOLDER_ID }} # фильтр, по которому сервис будет определять, какой агент (один или несколько) # должен выполнять тест agent-filter: "name='lt-manual-agent'" # перечисление директорий с конфигурациями тестов. # одна директория - один запущенный тест test-directories: |- "${{ github.workspace }}/sample-tests/smoke
- Запустите workflow
После первого запуска, результаты выполнения теста (и возможные ошибки) можно будет посмотреть на странице workflow.
Note
Спецификация экшена agents-create: yandex-cloud/yc-github-loadtesting-ci/agents-create.
Note
Спецификация экшена agents-delete: yandex-cloud/yc-github-loadtesting-ci/agents-delete.
В целях экономии ресурсов и гарантированной изоляции среды выполнения тестов, можно модифицировать workflow так, чтобы агенты создавались и удалялись автоматически:
name:
on:
- workflow_dispatch
jobs:
deploy-service:
runs-on: ubuntu-latest
steps:
- run: 'echo "Here we deploy"'
loadtesting-create-agent:
name: 'create loadtesting compute agent'
needs:
- deploy-service
runs-on: ubuntu-latest
steps:
- id: create-agents
# используем yandex-cloud/yc-github-loadtesting-ci/agents-create для создания агентов
uses: yandex-cloud/yc-github-loadtesting-ci/agents-create@main
with:
# значение секрета с авторизованным ключом
auth-key-json-base64: ${{ secrets.YC_LOADTESTING_KEY_JSON_BASE64 }}
# идентификатор каталога, в котором агент будет создан
folder-id: ${{ vars.YC_LOADTESTING_FOLDER_ID }}
# количество создаваемых агентов
count: 1
# идентификатор сервисного аккаунта, который будет использоваться для авторизации
# агентами в сервисе Load Testing
service-account-id: ${{ vars.YC_LOADTESTING_AGENT_SA_ID }}
# зона доступности, в которой будет развернута ВМ агента
vm-zone: ru-central1-b
# префикс имени создаваемого агента
name-prefix: 'gh-actions-${{ github.run_id }}'
loadtesting-run-smoke:
name: 'execute sample-tests/smoke'
continue-on-error:true
needs:
- loadtesting-create-agent
runs-on: ubuntu-latest
steps:
# используем actions/checkout для того, чтобы получить доступ к файлам
# в репозитории
- uses: actions/checkout@v4
# используем yandex-cloud/yc-github-loadtesting-ci/test-suite для запуска тестов
- id: run
# экшен для запуска
uses: yandex-cloud/yc-github-loadtesting-ci/test-suite@main
with:
# значение секрета с авторизованным ключом
auth-key-json-base64: ${{ secrets.YC_LOADTESTING_KEY_JSON_BASE64 }}
# идентификатор каталога, в котором будет сохранятся информация
# о запусках тестов.
folder-id: ${{ vars.YC_LOADTESTING_FOLDER_ID }}
# фильтр, по которому сервис будет определять, какой агент (один или несколько)
# должен выполнять тест
agent-filter: "name contains 'gh-actions-${{ github.run_id }}'"
# перечисление директорий с конфигурациями тестов.
# одна директория - один запущенный тест
test-directories: |-
"${{ github.workspace }}/sample-tests/smoke
loadtesting-delete-agent:
name: delete agents
needs:
- loadtesting-create-agent
- loadtesting-run-smoke
if: always()
runs-on: ubuntu-latest
steps:
- id: delete-agents
# используем yandex-cloud/yc-github-loadtesting-ci/agents-create для создания агентов
uses: yandex-cloud/yc-github-loadtesting-ci/agents-delete@main
with:
# значение секрета с авторизованным ключом
auth-key-json-base64: ${{ secrets.YC_LOADTESTING_KEY_JSON_BASE64 }}
# идентификатор каталога c агентами, которые нужно удалить
folder-id: ${{ vars.YC_LOADTESTING_FOLDER_ID }}
# идентификаторы удаляемых агентов
agent-ids: ${{ needs.loadtesting-create-agent.outputs.agent-ids }}
По сравнению с предыдущим шагом, в примере выше произошли следующие изменения:
- добавлен job
loadtesting-create-agent
для создания агента; - в
loadtesting-run-smoke.steps.run.with.agent-filter
указан фильтр по имени, совпадающему с (уникальным) именем создаваемого агента; - добавлен job
loadtesting-delete-agent
для автоматического удаления агента:- условие
if: always()
нужно для того, чтобы удаление агентов происходило даже в случае возникновения ошибки на предыдущих шагах; agent-ids: ${{ needs.loadtesting-create-agent.outputs.agent-ids }}
гарантирует, что удаляться будут только те агенты, которые были созданы на шагеloadtesting-create-agent
;
- условие
Чтобы следить за эволюцией производительности сервиса/теста во времени, вы можете создать и настроить графики регрессий.