Какие есть способы хранения и управления переменными (включая секреты) в GitLab CI/CD?

«Какие есть способы хранения и управления переменными (включая секреты) в GitLab CI/CD?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

GitLab CI/CD предоставляет гибкую и безопасную систему управления переменными с разными уровнями scope и защиты.

Уровни хранения (от самого узкого к широкому):

  1. Внутри .gitlab-ci.yml:

    variables:
      APP_VERSION: "1.0.0" # Открытая, несекретная переменная

    Не подходит для секретов, так как файл находится в репозитории.

  2. Project-level variables (Settings > CI/CD > Variables):

    • Protected: Доступны только в пайплайнах, запущенных на защищённых ветках/тегах.
    • Masked: Значение скрывается в логах джоб (не выводится).
    • File: Создаётся временный файл, путь к которому передаётся в переменной. Критично для больших значений (например, сертификатов).
    • Environment scope: Можно привязать переменную к конкретному окружению (например, staging, production).
  3. Group-level variables (Group > Settings > CI/CD > Variables): Общие переменные для всех проектов в группе. Идеально для общих регистров, URL-адресов внутренних сервисов.

  4. 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.