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

Не всё чувствительно: для нечувствительной конфигурации есть отдельные переменные.

Variable (vars) — нечувствительное конфигурационное значение, которое, в отличие от секрета, видно в открытом виде и доступно через контекст vars.

Секрет или переменная?

Простое правило: если значение тайна — это секрет; если просто настройка — переменная.

SecretVariable
Видно значениенет, скрытода, открыто
Маскируется в логахданет
Контекстsecrets.*vars.*
Для чегопароли, токены, ключиимя региона, URL API, флаги

Создание и использование

Переменные создают там же: Settings → Secrets and variables → Actions → вкладка Variables. Использование симметрично секретам:

steps:
  - run: echo "Регион — ${{ vars.AWS_REGION }}"
  - run: deploy --url "${{ vars.API_BASE_URL }}"
    env:
      API_TOKEN: ${{ secrets.API_TOKEN }}

Обратите внимание: открытый AWS_REGION можно печатать в логах, а API_TOKEN — нет.

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

И секреты, и переменные можно привязать к environment — именованному окружению (staging, production). Тогда одно и то же имя даёт разные значения в зависимости от того, куда катит job:

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production       # подтянет vars/secrets окружения production
    steps:
      - run: echo "URL — ${{ vars.API_BASE_URL }}"

В environment staging у API_BASE_URL будет адрес стенда, в production — боевой. Один workflow — разные значения по окружениям.

Приоритет

Если имя переменной задано и на уровне репозитория, и на уровне environment, при выполнении job в этом окружении побеждает значение environment. Это позволяет иметь общий дефолт и точечно переопределять его.

Итог

  • Секрет — для тайн (secrets.*, скрыт), переменная — для настроек (vars.*, видна).
  • И те, и другие можно привязать к environment, получая разные значения по стендам.
  • Значение environment перекрывает одноимённое значение репозитория.
Проверьте себя
1. Когда стоит использовать переменную (vars), а не секрет?
AДля пароля от базы данных
BДля нечувствительной настройки вроде региона облака или базового URL API
CДля приватного ключа деплоя
DВсегда вместо секретов
2. Через какой контекст обращаются к переменной репозитория?
A${{ secrets.* }}
B${{ vars.* }}
C${{ matrix.* }}
D${{ env.secret.* }}
3. Что произойдёт с переменной, заданной и на уровне репозитория, и на уровне environment, при запуске job в этом окружении?
AВозьмётся значение репозитория
BВозьмётся значение environment (оно перекрывает репозиторий)
CБудет ошибка конфликта
DОба значения склеятся
Поддержать проект