Перейти к содержанию

Pre-commit хуки для IaC

CI/CD · IaC
Изучено

Проблема

В репозиторий с Terraform/Ansible/YAML регулярно прилетают PR с неформатированным кодом, дрейфом версий, секретами в .tf-файлах (aws_access_key = "AKIA...") и YAML с кривой вложенностью. Линтеры существуют, но прогонять их руками никто не хочет, а CI ловит проблемы уже после pushа.

Решение

Собрать под одним зонтом pre-commit.com три проверенных хука: tflint (Terraform), yamllint (YAML) и detect-secrets (секреты). Конфиг один, версии зафиксированы, локально и в CI — одно и то же.

Пример

.pre-commit-config.yaml:

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v5.0.0
    hooks:
      - id: end-of-file-fixer
      - id: trailing-whitespace
      - id: check-yaml

  - repo: https://github.com/antonbabenko/pre-commit-terraform
    rev: v1.96.2
    hooks:
      - id: terraform_fmt
      - id: terraform_tflint
        args: [--args=--config=.tflint.hcl]

  - repo: https://github.com/adrienverge/yamllint
    rev: v1.35.1
    hooks:
      - id: yamllint
        args: [-c=.yamllint]

  - repo: https://github.com/Yelp/detect-secrets
    rev: v1.5.0
    hooks:
      - id: detect-secrets
        args: ['--baseline', '.secrets.baseline']

Установка:

pip install pre-commit
pre-commit install
detect-secrets scan > .secrets.baseline
pre-commit run --all-files   # бэкфилл по существующему коду

В CI — один шаг:

- uses: pre-commit/action@v3.0.1

Когда применять

  • Любой репозиторий с IaC/Ansible/Kubernetes-манифестами.
  • Когда команда из 3+ человек — расхождения в форматировании становятся дороже, чем настройка хуков.

Источник

Как применить у себя

  1. Добавить .pre-commit-config.yaml с тремя хуками.
  2. Один раз — detect-secrets scan > .secrets.baseline и закоммитить baseline.
  3. pre-commit install на всех dev-машинах + шаг в CI.
  4. Первый раз прогнать по всему репо, закоммитить формат-правки отдельным коммитом.
  5. После того как кто-то из команды попытался запушить ключ и был остановлен — статус Изучено.