GitHub Secrets: храним чувствительные данные

Где хранить пароли и токены, чтобы они не попали в репозиторий.

Secret — зашифрованное значение, которое хранится в настройках GitHub и подставляется в workflow без раскрытия в коде и логах.

Чего нельзя делать никогда

Пароли, API-ключи, токены деплоя нельзя писать прямо в YAML или в коде. Репозиторий — это история: даже удалённый из последнего коммита секрет остаётся в git-истории навсегда. Утёкший ключ нужно считать скомпрометированным и отзывать.

Где создаются секреты

В репозитории: Settings → Secrets and variables → Actions → New repository secret. Задаёте имя (например, API_TOKEN) и значение. После сохранения значение нельзя посмотреть — только перезаписать или удалить.

Как использовать в workflow

Секреты доступны через контекст secrets:

steps:
  - name: Запрос к API
    run: curl -H "Authorization: Bearer $TOKEN" https://api.example.com
    env:
      TOKEN: ${{ secrets.API_TOKEN }}

Здесь секрет кладётся в переменную окружения TOKEN только для этого шага. Передавать секрет через env безопаснее, чем вставлять прямо в строку команды — он не «засветится» в списке процессов.

Автоматическое маскирование

GitHub автоматически маскирует значения секретов в логах: если секрет случайно попадёт в вывод, вместо него будет ***. Но это не повод расслабляться — об умышленных утечках поговорим отдельно.

Уровни секретов

УровеньГде доступен
Repository secretво всех workflow этого репозитория
Environment secretтолько в job, привязанных к конкретному environment (напр., production)
Organization secretсразу во многих репозиториях организации

Environment-секреты особенно полезны для деплоя: ключ от прода доступен только когда job катит на production, и может требовать апрува (об этом в разделе CD).

Итог

  • Секреты создают в Settings → Secrets and variables → Actions; значение потом не подсмотреть.
  • Обращение — через ${{ secrets.ИМЯ }}, обычно кладут в env шага.
  • GitHub маскирует секреты в логах; есть уровни repository/environment/organization.
Проверьте себя
1. Почему нельзя хранить API-ключ прямо в YAML-файле workflow?
AYAML не поддерживает длинные строки
BОн попадёт в git-историю навсегда и будет скомпрометирован, даже если удалить из последнего коммита
CGitHub не читает ключи из YAML
DЭто замедляет пайплайн
2. Как обратиться к секрету с именем API_TOKEN внутри workflow?
A$API_TOKEN напрямую
B${{ secrets.API_TOKEN }}
C${{ env.API_TOKEN }}
Dsecrets().get('API_TOKEN')
3. Что произойдёт, если значение секрета случайно попадёт в лог?
AЛог удалится целиком
BGitHub автоматически замаскирует его как ***
CWorkflow будет заблокирован навсегда
DНичего, секрет будет виден полностью
Поддержать проект