Был ли у вас опыт работы с Pre-Hook в CI/CD?

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

Ответ

Да, я применял pre-hook'и для реализации проверок "левых врат" (quality gates) в пайплайнах CI/CD, чтобы предотвратить запуск ресурсоемких процессов при наличии очевидных проблем.

Конкретные кейсы использования:

  1. Валидация конфигурационных файлов инфраструктуры (Terraform/Ansible) перед plan или apply:

    # GitLab CI: этап, выполняемый ДО основного terraform plan
    validate_infra:
      stage: validate
      script:
        - terraform init -backend=false
        - terraform validate  # Проверка синтаксиса .tf файлов
        - tflint .            # Проверка best practices
        - checkov --directory . # Статический анализ безопасности инфраструктуры как кода
      rules:
        - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  2. Проверка commit message на соответствие соглашению (Conventional Commits):

    # pre-commit hook в .git/hooks/commit-msg
    #!/bin/sh
    COMMIT_MSG_FILE=$1
    COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
    PATTERN="^(feat|fix|docs|style|refactor|test|chore|ci)((.+))?: .{1,}$"
    if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
      echo "Ошибка: Commit message не соответствует Conventional Commits."
      echo "Пример: feat(api): добавить новый эндпоинт"
      exit 1
    fi
  3. Проверка наличия секретов (ключей, паролей) в коммитируемом коде с помощью detect-secrets или gitleaks:

    # Этап в пайплайне, запускаемый на каждом MR
    secret_detection:
      stage: security
      image: gitleaks/gitleaks
      script:
        - gitleaks detect --source . -v --redact
      allow_failure: false # Жесткий fail при обнаружении секрета
  4. Проверка синтаксиса Dockerfile:

    # Скрипт в пайплайне перед сборкой образа
    docker run --rm -i hadolint/hadolint < Dockerfile

Использование pre-hook'ов позволяет сэкономить время и ресурсы CI/CD системы, отсекая заведомо некорректные изменения на ранней стадии, и повышает общее качество кода и инфраструктуры, внедряя стандарты автоматически.