Гид по технологиям

Переменные GitLab CI: руководство и практики

9 min read CI/CD Обновлено 12 Dec 2025
Переменные GitLab CI: руководство
Переменные GitLab CI: руководство

Переменные GitLab CI — это гибкий способ передавать конфигурацию и секреты в окружение задач CI/CD. Используйте уровни (инстанс, группа, проект, pipeline, job) для контроля области видимости и порядка переопределений. Защитите чувствительные значения через «protected» и «masked», используйте тип “File” для больших секретов, и следуйте правилам именования и проверки, чтобы избежать утечек и ошибок выполнения.

Important: маскирование не заменяет надёжное хранение секретов. Маскируются только строки, соответствующие определённым требованиям формата, и максимум 4 KiB.

Логотип GitLab — стилизованная голова лисы

Быстрые ссылки

  • Основы
  • Создание переменной
  • Установка в .gitlab-ci.yml
  • Переопределение переменных
  • Рекомендации по безопасности
  • Примеры и сценарии
  • Чеклисты ролей
  • Сводка

Основы

Переменные в GitLab CI — это простые пары «ключ: значение», которые инжектируются в окружение задач как переменные окружения. Их можно использовать для:

  • передачи конфигурационных данных;
  • хранения токенов и ключей (с соблюдением мер безопасности);
  • удобного переиспользования частей pipeline;
  • уменьшения дублирования в .gitlab-ci.yml.

Определение в job-скриптах выглядит как стандартные переменные окружения.

Пример вывода переменной в shell-скрипте:

# Пример job-скрипта
echo "$EXAMPLE_VARIABLE"

Если вы хотите вывести буквальные символы $VARIABLE, можно экранировать $ двойным долларом:

# Выведет строку "$EXAMPLE_VARIABLE" вместо её значения
echo "$$EXAMPLE_VARIABLE"

Переменные доступны не только в скриптах — их можно интерполировать в других полях .gitlab-ci.yml (например, в image или артефактах):

build:
  image: $CI_REGISTRY_IMAGE/build-utils:latest
  script:
    - make all

GitLab также предоставляет набор предопределённых переменных (predefined), содержащих информацию о коммите, ветке, pipeline, артефактах и прочем. Эти переменные всегда доступны и служат базой контекста для ваших задач.

Где можно хранить переменные

Переменные можно задавать на нескольких уровнях:

  • Уровень инстанса (Administrator → Settings → CI/CD) — доступно для всех проектов на сервере;
  • Уровень группы — применяется ко всем проектам группы;
  • Уровень проекта — доступно только в конкретном проекте;
  • Уровень pipeline/job — задаётся в .gitlab-ci.yml или при ручном запуске pipeline.

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

Создание переменной в UI

Переменные добавляются через Settings → CI/CD → Variables в интерфейсе соответствующего уровня (проект/группа/инстанс). Нажмите Add variable и заполните форму.

Скриншот: добавление переменной в интерфейсе GitLab CI

Требования и рекомендации при создании:

  • Key: уникальное имя переменной. Допускаются буквы, цифры и подчёркивания. Имя должно соответствовать правилам используемой оболочки.
  • Value: значение переменной. Может быть любым текстом; при выборе типа “Variable” значение инжектируется как строка.
  • Type: можно выбрать “Variable” или “File”. В режиме “File” значение создаст временный файл, а переменная будет содержать путь до этого файла.
  • Protected: переменная будет доступна только в pipeline, запускаемых для защищённых веток и тегов.
  • Masked: GitLab попытается фильтровать значение из логов задач (работает для значений, соответствующих допустимым форматам и до 4 KiB).
  • Environment scope: ограничивает видимость переменной конкретной средой (environment).

Скриншот: добавление переменной в интерфейсе GitLab CI

После сохранения переменная доступна для всех pipeline этого уровня. Кнопки редактирования и удаления позволяют управлять существующими переменными.

Защищённые переменные

Отметка Protected означает, что переменная доступна только в pipeline, запускаемых для защищённых веток и тегов (protected branches/tags). Хорошая практика — помечать как protected переменные, используемые для деплоя на production.

Маскированные переменные

Mask variable скрывает значение в логах задач. Ограничения:

  • Значение должно соответствовать допустимому формату (наиболее распространённые токены подходят).
  • Работает для значений ≤ 4 KiB.
  • Не защищает от утечек через другие каналы (например, если сборка отправляет значение в удалённую систему в явном виде).

Переменные уровня окружения

Environment scope позволяет назначить переменную конкретной среде (например, staging, production). Переменная будет видима только в задачах, которые указывают это окружение через поле environment в .gitlab-ci.yml.

Установка переменных в .gitlab-ci.yml

В .gitlab-ci.yml можно объявлять переменные глобально и локально для job’ов. Переменные, объявленные в файле, будут создаваться при запуске job’а и переопределять значения уровня проекта и выше.

Пример использования:

variables:
  DEPLOY_URL: example.com

deploy_staging:
  variables:
    DEPLOY_URL: staging.example.com
    DEPLOY_IS_STAGING_ENV: "true"
  script:
    - ./deploy.sh

deploy_production:
  script:
    - ./deploy.sh

Заметьте: строки и булевы значения требуют аккуратной обработки. Для безопасности обычно явно указывают кавычки для значений, которые могут быть интерпретированы шеллом.

Переменные в .gitlab-ci.yml чаще используются как «псевдо-переменные конфигурации» — они помогают избежать дублирования и делают файл читабельным.

Порядок приоритета переменных

Переопределение значений может происходить на нескольких уровнях. Упрощённый порядок приоритета (с наименьшим приоритетом — внизу):

  1. Значения, переданные при ручном запуске pipeline (Run pipeline) — самые приоритетные для конкретного запуска.
  2. Переменные триггера pipeline (trigger).
  3. Переменные уровня pipeline и job, определённые в .gitlab-ci.yml — job-переменные более специфичны, чем глобальные.
  4. Переменные проекта, группы, инстанса — чем выше уровень, тем ниже приоритет.
  5. Предопределённые переменные GitLab — задаются системой и доступны всегда.

Рекомендуем проверять значение переменной на этапе отладки, чтобы понять, какое определение действует в текущем запуске. Для отладки удобно временно вывести значения в закрытый лог или использовать job, который сохраняет переменные в артефакт (только безопасные данные).

Ручной запуск с локальными переменными

Вы можете запустить pipeline вручную и указать набор переменных, которые будут использованы только для этого запуска. Это делается на странице CI/CD → Pipelines → Run pipeline.

Скриншот: ручной запуск pipeline с переменными

Переменные, заданные здесь, применяются в самом конце цепочки переопределений и не сохраняются в настройках проекта.

Примеры использования и сценарии

  1. Хранение приватных токенов для доступа к реестру образов. Пометьте такие переменные как protected и masked, либо используйте Type: File и предоставьте приложению путь к файлу с секретом.

  2. Разделение конфигурации по окружениям: DEPLOY_URL, API_BASE и т. п. — задавайте с Environment scope: staging/production.

  3. Параметризация сборок: передавайте флаги сборки и версии через переменные в .gitlab-ci.yml, чтобы переиспользовать один pipeline для нескольких целей.

  4. Feature-branch pipelines: задавайте значения, специфичные для ветки, с помощью protected/не-protected комбинации и правил запуска (rules).

Рекомендации по безопасности

  • Минимизируйте область видимости: помещайте секреты только в тот уровень, где они нужны.
  • Используйте protected для секретов деплоя в production.
  • Для больших файлов или сертификатов применяйте Type: File.
  • Не логируйте секреты; если необходимо — маскируйте, но помните про ограничения (формат, размер).
  • Для абсолютной безопасности интегрируйте секрет-менеджеры (HashiCorp Vault, AWS Secrets Manager) и используйте динамические креденшлы, если это возможно.

Важно: маскирование в GitLab фильтрует только совпадающие подстроки; если приложение разбивает значение и выводит части, возможны утечки.

Практические шаблоны именования

Мини-методология именования переменных, помогающая масштабировать конфигурацию:

  • Используйте префиксы по области: CI, DEPLOY, DB, API (например, API_TOKEN_SERVICE1).
  • Для окружений добавляйте явные суффиксы или используйте Environment scope вместо сложных имён.
  • Думайте о читаемости: длинные имена допустимы, но избегайте неоднозначных аббревиатур.

Пример:

  • PRODUCTION_DB_URL — URL базы для production
  • STAGING_API_TOKEN — токен для staging API
  • CI_IMAGE_TAG — тег образа, используемый CI

Возможные ошибки и когда система может не подойти

  • Маскирование не работает: вероятная причина — значение не соответствует допустимому формату или превышает 4 KiB.
  • Переменная не видна в job: проверьте область видимости (environment scope), protected-статус и приоритет определения.
  • Конфликт имён или зарезервированное имя оболочки: проверьте, не совпадает ли ключ с системной переменной.
  • Нелеченые секреты в логах: убедитесь, что build-скрипты не печатают значения и что сторонние утилиты не отправляют их в открытые места.

Когда GitLab variables не подходят:

  • Нужна динамическая ротация секретов для каждой задачи — рассмотрите интеграцию с внешним секрет-менеджером;
  • Требуется хранение большого количества бинарных секретов — используйте файловые хранилища и ссылки на них.

Чеклисты по ролям

DevOps-инженер

  • Проверить, что секреты помечены как protected и masked при необходимости.
  • Настроить Environment scope для переменных окружений.
  • Подключить секрет-менеджер для динамических креденшлов.
  • Подготовить инструкции отката (rollback) и план реагирования на компрометацию ключей.

Разработчик

  • Использовать переменные в .gitlab-ci.yml для параметризации сборок.
  • Не печатать секреты в логах, не добавлять их в артефакты.
  • Тестировать pipeline с заглушками/фейковыми значениями.

Администратор GitLab (self-hosted)

  • Контролировать инстанс-level переменные и документировать их назначение.
  • Ограничивать права на редактирование переменных локальными политиками.
  • Вести ревизию значений и удалять устаревшие переменные.

Критерии приёмки переменных в новом проекте

  • Все секреты вынесены в переменные, а не в код.
  • Для production-значений установлены protected и, где возможно, masked.
  • Используется Environment scope для отличия staging/production.
  • Никакие секреты не записываются в публичные логи и артефакты.
  • Pipeline успешно выполняет полный цикл сборки и деплоя с заданными переменными.

Тесты и приемочные сценарии

  1. Запустить pipeline с фейковыми значениями и убедиться, что функциональность не зависит от реальных секретов.
  2. Запустить ручной pipeline и задать переменную через UI; убедиться, что она перевесила все остальные значения.
  3. Для masked-переменной умышленно echo значения в шаге сборки и проверить, что в логах значение не отображается.
  4. Убедиться, что переменные с Environment scope применяются только при указании соответствующего environment в job.

Модель принятия решений (Mermaid)

flowchart TD
  A[Нужен ли секрет?] -->|Нет| B[Обычная переменная в .gitlab-ci.yml]
  A -->|Да| C{Нужна ли ротация или динамика?}
  C -->|Да| D[Внешний секрет-менеджер]
  C -->|Нет| E{Требуется доступ из множества проектов?}
  E -->|Да| F[Group/Instance переменная]
  E -->|Нет| G[Project переменная]
  F --> H[Пометить как protected если для prod]
  G --> H
  D --> I[Подключить через CI-адаптер]

Советы по миграции и совместимости

  • При переносе из другого CI проверьте, как ваша система обрабатывает маскирование и файл-тип переменных.
  • Если у вас уже есть внешние секрет-менеджеры, используйте короткие токены доступа как переменные и подтягивайте полноценные секреты во время рантайма.
  • Для self-hosted GitLab документируйте инстанс-level переменные и предупреждайте команды о возможных рисках разглашения.

Укрепление безопасности и приватность

  • Не храните персональные данные или GDPR-существенную информацию в переменных без оценки рисков и прав доступа.
  • Логи и артефакты должны автоматически проходить проверку на наличие секретов перед публикацией.
  • Для compliance используйте аудит изменений переменных и ограничивайте доступ к настройкам CI/CD.

Частые ошибки и отладка

  • Переменная пустая в job: проверьте орфографию Key, область видимости и приоритеты.
  • Маскирование не сработало: посмотрите формат значения и его длину.
  • File-тип переменной не читается приложением: убедитесь, что приложение читает путь из переменной, а не ожидает содержимое.

Дополнительные сценарии и альтернативы

  • Для чувствительных операций рассмотрите применение краткоживущих (ephemeral) токенов, получаемых на этапе выполнения job.
  • Вместо глобальных переменных используйте инъекции через Vault Agent или интеграции cloud-поставщиков, чтобы избегать долгоживущих секретов.

Терминологический мини-глоссарий

  • Protected — пометка, ограничивающая видимость переменной только защищёнными ветками/тегами.
  • Masked — признак, указывающий на попытку скрыть значение в логах.
  • Environment scope — ограничение видимости переменной конкретной средой deploy.
  • Type: File — переменная создаётся как временный файл; значение переменной — путь к файлу.

Сводка

Переменные GitLab CI позволяют гибко конфигурировать pipeline и безопасно передавать секреты при соблюдении простых правил. Выбирайте уровень хранения по принципу наименьших привилегий, используйте protected и masked для чувствительных данных, и интегрируйте внешний секрет-менеджер при необходимости динамической ротации. Тестируйте поведение переменных в реальных сценариях и документируйте решения на уровне команды и администрирования.


Ключевые действия на старте:

  1. Проанализируйте, какие значения должны стать переменными.
  2. Перенесите секреты в переменные проекта/группы, установите protected/masked при необходимости.
  3. Обновите .gitlab-ci.yml, чтобы использовать переменные вместо хардкода.
  4. Напишите тестовые job’ы для проверки применения переменных.

Конец руководства.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Отключить Xbox Game Bar в Windows 10 — 4 способа
Windows

Отключить Xbox Game Bar в Windows 10 — 4 способа

Очередь видео в YouTube: как пользоваться
Инструкции

Очередь видео в YouTube: как пользоваться

Резервное копирование сохранений Steam
Игры

Резервное копирование сохранений Steam

Как читать аналитику YouTube
Видео

Как читать аналитику YouTube

Новое Creator Studio YouTube: обзор и советы
YouTube

Новое Creator Studio YouTube: обзор и советы

Champion Island — обзор Google Doodle игры
Игры

Champion Island — обзор Google Doodle игры