Как вы использовали Git в DevOps-практиках?

Ответ

В DevOps Git — это не просто VCS, а основа всего workflow инфраструктуры как кода (IaC) и CI/CD. Вот как я его применяю:

1. GitOps для инфраструктуры и конфигурации: Все манифесты Kubernetes (Kustomize или Helm values.yaml), Terraform-модули, Ansible playbooks и конфиги приложений хранятся в Git-репозиториях. Изменение в main-ветке автоматически триггерит пайплайны в ArgoCD или Flux для деплоя в кластер.

2. Стратегии ветвления и рабочий процесс:

  • Trunk-based development с короткоживущими feature-ветками: Основная работа ведется в main. Для каждой задачи создается ветка от main, после code review и успешного прохода CI она мержится обратно. Это обеспечивает быструю интеграцию.
    git checkout -b feat/add-prometheus-alerts
    # Вношу изменения в манифесты PrometheusRule
    git add .
    git commit -m "feat: add critical pod restart alerts"
    git push origin feat/add-prometheus-alerts
    # Создаю Pull Request -> запускается CI (проверка yaml, terraform validate) -> после аппрува мердж в main.
  • Изменяемые окружения через Git: Вместо веток dev/staging/prod использую разные каталоги в одном репозитории или разные файлы значений (например, values-prod.yaml) и настраиваю инструменты GitOps (ArgoCD) на деплой из определенного пути или тега.

3. Автоматизация через хуки и CI:

  • Pre-commit хуки: Настраиваю pre-commit framework для автоматической проверки перед коммитом:
    # .pre-commit-config.yaml
    repos:
      - repo: https://github.com/pre-commit/pre-commit-hooks
        rev: v4.4.0
        hooks:
          - id: check-yaml
          - id: end-of-file-fixer
      - repo: https://github.com/antonbabenko/pre-commit-terraform
        rev: v1.81.0
        hooks:
          - id: terraform_fmt
          - id: terraform_validate
  • Семантический коммит и автоматический чинглог: Стараюсь следовать Conventional Commits (feat:, fix:, chore:), что позволяет автоматически генерировать Release Notes и определять семантическое версионирование в CI.

4. Инцидент-менеджмент и постмортемы: Для критических инцидентов создаю ветку incident/<short-description> прямо из коммита, на котором произошел сбой. В этой ветке фиксирую все actions по восстановлению и анализ. После фикса мержу ее с подробным коммитом-постмортемом, который ссылается на тикет в трекере.

Ответ 18+ 🔞

Слушай, а ведь Git в DevOps — это не просто какая-то система контроля версий, это, блядь, фундамент всей нашей работы, основа основ для инфраструктуры как кода и всех этих CI/CD пайплайнов. Вот как я с ним работаю, чтобы не было потом пиздеца:

1. GitOps для инфраструктуры и конфигурации: Всё, что шевелится — манифесты для Kubernetes (хоть Kustomize, хоть Helm-овские values.yaml), модули Terraform, Ansible-плейбуки и конфиги приложений — всё это лежит в Git-репозиториях. Изменение в main-ветке — и тут же, ёпта, срабатывает триггер в ArgoCD или Flux, которые начинают всё это раскатывать в кластер. Автоматизация, хуле.

2. Стратегии ветвления и рабочий процесс:

  • Trunk-based development с короткоживущими ветками: Основная движуха — в main. Берёшь задачу, отводишь от main свою ветку, делаешь дело, потом пулл-реквест, ревью, CI прогоняет — и только тогда мержишь обратно. Так интеграция идёт быстро, без этих долгих пиздецов с мержами.
    git checkout -b feat/add-prometheus-alerts
    # Тыкаюсь в манифесты PrometheusRule
    git add .
    git commit -m "feat: add critical pod restart alerts"
    git push origin feat/add-prometheus-alerts
    # Создаю Pull Request -> запускается CI (проверка yaml, terraform validate) -> после аппрува мердж в main.
  • Окружения через Git: Вместо того, чтобы плодить ветки dev/staging/prod и потом в них нихуя не разобраться, я делаю по-другому. Либо разные папки в одном репе, либо разные файлы конфигов (типа values-prod.yaml). А потом просто настраиваю ArgoCD, чтобы он смотрел в нужное место. Просто, как три копейки.

3. Автоматизация через хуки и CI:

  • Pre-commit хуки: Настраиваю pre-commit — это такая штука, которая проверяет код ещё до коммита. Чтоб не закоммитить какую-нибудь дичь, из-за которой потом весь пайплайн накроется медным тазом.
    # .pre-commit-config.yaml
    repos:
      - repo: https://github.com/pre-commit/pre-commit-hooks
        rev: v4.4.0
        hooks:
          - id: check-yaml
          - id: end-of-file-fixer
      - repo: https://github.com/antonbabenko/pre-commit-terraform
        rev: v1.81.0
        hooks:
          - id: terraform_fmt
          - id: terraform_validate
  • Семантические коммиты и ченджлоги: Стараюсь писать коммиты по правилам: feat:, fix:, chore:. Это, во-первых, сразу понятно, что сделал. А во-вторых, потом из этого автоматом можно релизные заметки сгенерить и версию проапдейтить. Удобно же, ёпта.

4. Инцидент-менеджмент и постмортемы: А вот это, блядь, важный момент. Когда случается пиздец, не надо метаться. Сразу создаёшь ветку incident/<short-description> прямо от того коммита, на котором всё посыпалось. В этой ветке фиксируешь все действия по починке и анализ проблемы. Когда всё устаканилось — мержишь её обратно с большим, подробным коммитом-постмортемом, где ссылаешься на тикет. Чтобы потом, если что, можно было понять, что за хуйня произошла и как её починили. Доверия к процессу — овердохуища.