Расскажи про предопределенные переменные в CI/CD pipeline
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Предопределенные переменные в CI/CD Pipeline
Предопределенные (predefined) или встроенные (built-in) переменные — это системные переменные окружения, которые CI/CD платформы автоматически устанавливают и делают доступными внутри пайплайнов. Они предоставляют критически важную метаинформацию о текущем выполнении: данные о репозитории, ветке, запуске, исполнителе (runner/agent) и самой платформе. Эти переменные позволяют создавать гибкие, контекстно-зависимые и безопасные пайплайны.
Ключевые категории предопределенных переменных
1. Информация о репозитории и коммите
Это наиболее часто используемая группа. Переменные содержат данные об источнике кода.
CI_COMMIT_REF_NAME/GITHUB_REF_NAME: Имя ветки, тега или HEAD коммита, который инициировал запуск.CI_COMMIT_SHA/GITHUB_SHA: Хэш полного коммита. Фундаментален для уникальной идентификации сборки и артефактов.CI_PROJECT_PATH/GITHUB_REPOSITORY: Полный путь к проекту (например,my-org/my-service).
# Пример использования в shell-скрипте для сборки Docker-образа
#!/bin/bash
# Используем SHA коммита в качестве уникального тега образа
IMAGE_TAG="${CI_COMMIT_SHA:0:8}"
docker build -t my-registry/app:$IMAGE_TAG .
docker push my-registry/app:$IMAGE_TAG
# Используем имя ветки для условной логики
if [[ "$CI_COMMIT_REF_NAME" == "main" ]]; then
echo "Запуск деплоя в production..."
helm upgrade my-app ./chart --namespace production --set image.tag=$IMAGE_TAG
fi
2. Информация о пайплайне и задании (Job)
Переменные, описывающие текущий контекст выполнения CI/CD.
CI_PIPELINE_ID/GITHUB_RUN_ID: Уникальный числовой идентификатор пайплайна.CI_JOB_NAME: Название текущей задачи (job) в конфигурации.CI_JOB_STAGE: Название стадии (stage), к которой принадлежит задача.
3. Информация об исполнителе (Runner/Agent)
CI_RUNNER_ID: Идентификатор раннера, выполняющего задачу.CI_RUNNER_TAGS: Теги, связанные с раннером. Используются для выбора специализированных агентов (например,['docker', 'large', 'gpu']).
4. Переменные для работы с артефактами и кэшем
CI_PROJECT_DIR: Абсолютный путь к директории, куда был клонирован репозиторий на раннере. Отправная точка для большинства скриптов.CI_CACHE_DIR: Путь к директории, предназначенной для кэширования.
Практическое применение и лучшие практики
-
Динамические имена артефактов: Создание уникальных и информативных имен для архивов, Docker-образов, пакетов.
# Пример Dockerfile, использующий переменные для метаданных образа LABEL org.label-schema.vcs-ref=$CI_COMMIT_SHA \ org.label-schema.vcs-url=$CI_PROJECT_URL \ org.label-schema.build-date=$CI_PIPELINE_CREATED_AT -
Условное выполнение шагов: Ветвление логики пайплайна в зависимости от ветки, тега или источника запуска.
# Пример .gitlab-ci.yml deploy: script: - echo "Деплой начат" rules: - if: '$CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == "push"' variables: DEPLOY_ENV: "production" - if: '$CI_COMMIT_BRANCH =~ /^release\/.*/' variables: DEPLOY_ENV: "staging" -
Безопасность и секреты: Предопределенные переменные никогда не следует использовать для хранения конфиденциальных данных (паролей, токенов, ключей). Для этого существуют защищенные переменные (secrets), которые задаются в настройках проекта/организации и не попадают в логи. Например, в GitLab это
Protected Variables, в GitHub Actions —Repository SecretsиEnvironment Secrets. -
Отладка и логирование:
# Полезный отладочный шаг в начале сложного пайплайна echo "Запуск пайплайна ID: $CI_PIPELINE_ID для коммита $CI_COMMIT_SHA на раннере $CI_RUNNER_DESCRIPTION" env | grep -E '^CI_|^GITHUB' | sort # Вывод всех CI-переменных
Сравнение основных платформ
| Назначение | GitLab CI | GitHub Actions | Jenkins |
|---|---|---|---|
| Хэш коммита | CI_COMMIT_SHA | github.sha (в $GITHUB_SHA) | GIT_COMMIT |
| Ветка | CI_COMMIT_REF_NAME | github.ref_name (в $GITHUB_REF_NAME) | BRANCH_NAME или GIT_BRANCH |
| ID запуска | CI_PIPELINE_ID | github.run_id | BUILD_NUMBER или BUILD_ID |
| Путь к проекту | CI_PROJECT_PATH | github.repository | JOB_BASE_NAME |
Важное замечание: Синтаксис доступа различается. В GitLab CI и Jenkins Pipeline (с sh) переменные доступны как переменные окружения Shell ($VAR). В GitHub Actions они находятся в специальном контексте github и часто требуют явной передачи в шаг, либо доступны через env. В Jenkinsfile (Declarative Pipeline) к некоторым переменным можно обращаться напрямую как params.VAR_NAME.
# Пример GitHub Actions workflow
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Вывод информации о запуске
run: |
echo "Репа: ${{ github.repository }}"
echo "Коммит: ${{ github.sha }}"
echo "Запуск ID: ${{ github.run_id }}"
Заключение
Предопределенные переменные — это "нервная система" CI/CD пайплайна, обеспечивающая связь между платформой, кодом и процессом доставки. Их грамотное использование позволяет:
- Избежать хардкода.
- Создавать универсальные, переиспользуемые конфигурации.
- Внедрять эффективные стратегии тегирования и промоутинга артефактов (например,
app:${COMMIT_SHA},app:latestтолько дляmain). - Реализовывать сложную условную логику (деплой в разные окружения, запуск разных тест-сьютов).
- Улучшать наблюдаемость, привязывая каждую сборку и артефакт к конкретному коммиту.
Понимание и мастерское владение этими переменными — обязательный навык для DevOps-инженера, направленный на построение отказоустойчивых, прозрачных и эффективных процессов непрерывной интеграции и доставки. Всегда сверяйтесь с официальной документацией вашей CI/CD платформы, так как набор и имена переменных могут расширяться и изменяться.