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

Расскажи про предопределенные переменные в CI/CD pipeline

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

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

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

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

Предопределенные переменные в 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: Путь к директории, предназначенной для кэширования.

Практическое применение и лучшие практики

  1. Динамические имена артефактов: Создание уникальных и информативных имен для архивов, 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
    
  2. Условное выполнение шагов: Ветвление логики пайплайна в зависимости от ветки, тега или источника запуска.

    # Пример .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"
    
  3. Безопасность и секреты: Предопределенные переменные никогда не следует использовать для хранения конфиденциальных данных (паролей, токенов, ключей). Для этого существуют защищенные переменные (secrets), которые задаются в настройках проекта/организации и не попадают в логи. Например, в GitLab это Protected Variables, в GitHub Actions — Repository Secrets и Environment Secrets.

  4. Отладка и логирование:

    # Полезный отладочный шаг в начале сложного пайплайна
    echo "Запуск пайплайна ID: $CI_PIPELINE_ID для коммита $CI_COMMIT_SHA на раннере $CI_RUNNER_DESCRIPTION"
    env | grep -E '^CI_|^GITHUB' | sort # Вывод всех CI-переменных
    

Сравнение основных платформ

НазначениеGitLab CIGitHub ActionsJenkins
Хэш коммитаCI_COMMIT_SHAgithub.sha$GITHUB_SHA)GIT_COMMIT
ВеткаCI_COMMIT_REF_NAMEgithub.ref_name$GITHUB_REF_NAME)BRANCH_NAME или GIT_BRANCH
ID запускаCI_PIPELINE_IDgithub.run_idBUILD_NUMBER или BUILD_ID
Путь к проектуCI_PROJECT_PATHgithub.repositoryJOB_BASE_NAME

Важное замечание: Синтаксис доступа различается. В GitLab CI и Jenkins Pipelinesh) переменные доступны как переменные окружения 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 платформы, так как набор и имена переменных могут расширяться и изменяться.