Концепции

Переменные окружения

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

Обзор

Environment Variables (на странице Configurations) — реестр значений рабочего пространства, от которых зависят тесты: API_BASE_URL, API-токены, DSN, cookie-секреты. У реестра две задачи:

  1. Убрать значения из скриптов. Боковая панель редактора тестов показывает доступные переменные, поэтому скрипт ссылается на имя, а не на зашитое значение — и одна правка перенаправляет все тесты на staging или production.
  2. Убрать секреты из логов. У каждой переменной есть флаг видимости; значения, помеченные masked, вырезаются везде, где могли бы появиться в выводе.

Visible vs masked

  • visible — обычные справочные значения (хосты, имена окружений). Показываются в UI, в логах не трогаются.
  • masked — секреты. Прячутся за ••• в UI и заменяются на *** на каждой лог-поверхности, которую контролирует платформа: живой поток прогона, сохранённый лог, который вы потом скачиваете, и сырые OTEL-чанки метрик в бакете логов.

Маскирование по значению, а не по имени: платформа вырезает секрет везде, где он встретится, — внутри URL, DSN (postgres://user:SECRET@host/db превращается в postgres://user:***@host/db), дампа заголовков или текста ошибки. Значения от 4 символов вырезаются в любом вхождении; более короткие — только как отдельные токены, чтобы короткое значение вроде abc не испортило посторонние слова.

Одна честная граница: участники рабочего пространства всё ещё могут прочитать значения переменных через API — masked защищает логи и UI, но это не механизм контроля доступа. Воспринимайте реестр как удобство плюс гарантию вырезания из логов, а не как секрет-хранилище.

Как тесты используют переменные

Зарегистрируйте значение один раз и используйте где нужно — в блоке variables: теста, заголовке, DSN. Если ровно это значение когда-либо попадёт в строку лога, маска узнаёт его и вырежет. В этом контракт: masked-значением можно пользоваться свободно — в логи оно не утечёт.

Для скриптов k6/JMeter/Locust верно то же самое: если скрипт печатает зарегистрированное masked-значение (через __ENV или литерал), платформа вырежет его до того, как лог будет отстримлен, сохранён или разбит на чанки.

Окружение на стороне машины (${{ env.* }})

Нативные perfscale-тесты умеют читать процессное окружение машины напрямую через ${{ env.NAME }} — канал для секретов, которые должны жить на генераторе нагрузки и больше нигде (переменная вообще не попадает в YAML теста):

steps:
  - use: std/http@v1
    with:
      url: https://api.example.com/me
      headers:
        authorization: "Bearer ${{ env.API_TOKEN }}"

Отсутствующая переменная падает шагом с понятной ошибкой вместо того, чтобы молча отправить пустой креденшл. А движок записывает каждое значение, разрешённое из env.*, в реестр прогона и автоматически маскирует его в логе прогона — по тем же правилам ***, что выше, — так что даже секрет, попавший в URL запроса или отладочное сообщение std/log@v1, не окажется в выводе. Полный контракт интерполяции — в OSS-справочнике YAML.

Дальше