← Назад к вопросам

Где хранятся переменные в GitLab CI?

1.3 Junior🔥 211 комментариев
#CI/CD и автоматизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Хранение переменных в GitLab CI/CD

В GitLab CI/CD переменные являются фундаментальным механизмом для управления конфигурацией, хранения секретов и передачи данных между этапами пайплайна. Система предлагает многоуровневый подход к хранению, обеспечивающий гибкость и безопасность. Вот основные места, где могут храниться и определяться переменные.

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

  • Переменные, определенные в коде задания (job) (Наивысший приоритет): Переменные, заданные непосредственно в блоке variables конкретного задания в файле .gitlab-ci.yml. Они переопределяют все остальные.

    deploy_job:
      script:
        - echo $DEPLOY_ENV
      variables:
        DEPLOY_ENV: "production" # Эта переменная определена на уровне job
    
  • Переменные, определенные в коде пайплайна (pipeline) (Второй по приоритету): Переменные, заданные в блоке variables на верхнем уровне файла .gitlab-ci.yml. Они действуют глобально для всех заданий, если не переопределены на уровне job.

    variables:
      APP_NAME: "my-awesome-app"
      NODE_ENV: "test"
    
    build_job:
      script:
        - echo "Building $APP_NAME for $NODE_ENV"
    
  • Project CI/CD Variables (Третий по приоритет): Хранятся в настройках самого проекта GitLab (Settings > CI/CD > Variables). Это основное место для хранения чувствительных данных (паролей, токенов, ключей). Здесь можно установить флажки:

    *   **Protect variable**: Переменная будет доступна только в пайплайнах, запущенных на защищенных ветках или тегах.
    *   **Mask variable**: Значение переменной будет скрыто (замаскировано) в логах выполнения пайплайна, чтобы предотвратить случайную утечку.
    *   **Expand variable**: Определяет, будет ли переменная раскрываться (интерполироваться) в контексте других переменных (отключите для хранения многострочных секретов вроде приватных ключей).

  • Group CI/CD Variables (Четвертый по приоритет): Хранятся в настройках группы GitLab (Group > Settings > CI/CD > Variables). Доступны всем проектам внутри этой группы. Идеально для общих конфигураций, таких как адреса внутренних реестров артефактов или групповые токены доступа. Также поддерживают флажки Protect, Mask и Expand.

  • Instance CI/CD Variables (Пятый по приоритет): Хранятся на уровне всего экземпляра GitLab (администрирование). Доступны во всех проектах и группах. Используются для глобальных настроек, например, URL внешних сервисов или корпоративных прокси. Настройка доступна только администраторам.

  • Предопределенные (predefined) переменные GitLab (Наименьший приоритет): Автоматически создаваемые системой переменные, предоставляющие контекст о выполняющемся пайплайне, коммите, проекте и т.д. (например, $CI_PROJECT_ID, $CI_COMMIT_SHA, $CI_JOB_NAME). Их значения нельзя изменить. Полный список можно найти в официальной документации.

2. Файлы как источник переменных

Переменные также могут быть прочитаны из файлов, созданных в процессе выполнения пайплайна, с помощью ключевого слова artifacts:reports:dotenv. Это позволяет динамически генерировать конфигурацию в одном задании и использовать её в последующих.

generate_vars:
  stage: build
  script:
    - echo "DEPLOYMENT_TAG=$(date +%Y%m%d-%H%M)" > deploy.env
  artifacts:
    reports:
      dotenv: deploy.env

deploy:
  stage: deploy
  script:
    - echo "Deploying with tag: $DEPLOYMENT_TAG" # Переменная загружена из файла
  needs: ["generate_vars"]

3. Ключевые особенности и лучшие практики

  • Приоритет: При совпадении имен переменная с более высоким приоритетом (см. список выше) переопределяет переменную с более низким.
  • Безопасность: Никогда не храните секреты (пароли, приватные ключи) в файле .gitlab-ci.yml, так как он находится в репозитории. Всегда используйте Project, Group или Instance Variables с включенной опцией Mask.
  • Защищенные переменные: Используйте флажок Protect для переменных, которые должны быть доступны только в production-среде (т.е., в пайплайнах, запущенных с защищенных веток, например, main или production).
  • Переменные типа File: В настройках проекта/группы можно создать переменную, значение которой будет сохранено во временный файл, а путь к нему передан через переменную среды. Это критически важно для инструментов, ожидающих конфигурацию в виде файла (например, $KUBECONFIG, $GCP_SA_KEY).
  • Наследование и переопределение: Можно запретить наследование глобальных переменных в конкретном задании, задав пустой блок variables: {}.

Таким образом, выбор места хранения переменной в GitLab CI зависит от её предназначения и требуемого уровня видимости: секреты и параметры конкретного проекта — в Project Variables, общие настройки для нескольких проектов — в Group Variables, а динамические или несекретные параметры логики пайплайна — прямо в файле .gitlab-ci.yml.