Ответ
GitLab CI/CD предоставляет гибкую и безопасную систему управления переменными с разными уровнями scope и защиты.
Уровни хранения (от самого узкого к широкому):
-
Внутри
.gitlab-ci.yml:variables: APP_VERSION: "1.0.0" # Открытая, несекретная переменнаяНе подходит для секретов, так как файл находится в репозитории.
-
Project-level variables (
Settings > CI/CD > Variables):- Protected: Доступны только в пайплайнах, запущенных на защищённых ветках/тегах.
- Masked: Значение скрывается в логах джоб (не выводится).
- File: Создаётся временный файл, путь к которому передаётся в переменной. Критично для больших значений (например, сертификатов).
- Environment scope: Можно привязать переменную к конкретному окружению (например,
staging,production).
-
Group-level variables (
Group > Settings > CI/CD > Variables): Общие переменные для всех проектов в группе. Идеально для общих регистров, URL-адресов внутренних сервисов. -
Instance-level variables (Admin Area): Глобальные переменные для всего инстанса GitLab (самоуправляемая установка).
Практический пример безопасной работы с секретами:
# .gitlab-ci.yml
stages:
- deploy
deploy_to_prod:
stage: deploy
environment: production
script:
# Переменная `PROD_KUBECONFIG` определена как File-type variable на уровне проекта
# Она содержит конфиг для доступа к Kubernetes-кластеру
- export KUBECONFIG=${PROD_KUBECONFIG}
- kubectl set image deployment/my-app app=${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHORT_SHA}
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Рекомендация: Использовать Project/Group variables для всех чувствительных данных (токены, пароли, ключи), обязательно помечая их как Masked и Protected. Для конфигурационных файлов (kubeconfig, .env) использовать тип File.