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

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

Ответ

Предопределенные (predefined) переменные среды — это переменные, которые CI/CD система (GitLab CI, GitHub Actions, Jenkins) автоматически устанавливает перед запуском каждого задания (job). Они предоставляют контекст о текущем запуске: информацию о репозитории, коммите, пайплайне и среде выполнения.

Зачем они нужны:

  • Избегание хардкода: Не нужно вручную прописывать имена веток, теги коммитов или пути.
  • Универсальность скриптов: Один и тот же скрипт может работать в разных контекстах (ветках, тегах).
  • Принятие решений в пайплайне: Логика пайплайна может ветвиться в зависимости от переменных (например, if: $CI_COMMIT_BRANCH == 'main').

Примеры ключевых переменных в GitLab CI:

  • CI_COMMIT_SHA: Хэш коммита, для которого запущен пайплайн.
  • CI_COMMIT_REF_NAME: Имя ветки или тега.
  • CI_PROJECT_DIR: Полный путь к директории клонированного репозитория на раннере.
  • CI_JOB_NAME: Название текущего задания.
  • CI_RUNNER_TAGS: Теги раннера, выполняющего задание (полезно для выбора специфичного раннера).
  • CI_DEFAULT_BRANCH: Имя ветки по умолчанию (обычно main или master).

Практическое использование:

# .gitlab-ci.yml
build:
  script:
    # Используем SHA коммита как уникальный тег образа
    - docker build -t my-registry.com/my-app:$CI_COMMIT_SHA .
    - docker push my-registry.com/my-app:$CI_COMMIT_SHA

deploy:staging:
  script:
    - echo "Deploying commit $CI_COMMIT_SHA from branch $CI_COMMIT_REF_NAME"
    # Развертываем только если это не main ветка
    - if [ "$CI_COMMIT_REF_NAME" != "$CI_DEFAULT_BRANCH" ]; then helm upgrade --install my-app-staging ./chart --set image.tag=$CI_COMMIT_SHA; fi
  rules:
    - if: $CI_COMMIT_BRANCH

Полный список всегда следует уточнять в официальной документации конкретной CI-системы.