Опишите процесс выкатки Go-приложения в production (CI/CD).

Ответ

Процесс выкатки Go-приложения в production обычно автоматизируется с помощью CI/CD пайплайнов (например, в GitLab CI, GitHub Actions, Jenkins). Это обеспечивает консистентность, надежность и скорость развертывания.

Основные этапы пайплайна:

  1. Push в Git: Разработчик отправляет изменения в систему контроля версий (например, в main или develop ветку).

  2. CI (Continuous Integration) — Сборка и Тестирование:

    • Линтинг и статический анализ: Проверка качества кода и поиск потенциальных ошибок. golangci-lint run.
    • Unit-тесты: Запуск всех тестов для проверки корректности логики. go test -race ./... (флаг -race помогает выявить состояния гонки).
    • Сборка бинарного файла: Компиляция приложения. Для production важно собирать статически слинкованный бинарник без лишней отладочной информации.
      CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o myapp .
    • Сборка Docker-образа: Упаковка бинарника в минималистичный Docker-образ. Часто используются multi-stage builds, чтобы итоговый образ был маленьким и безопасным.

      # Этап сборки
      FROM golang:1.21-alpine AS builder
      WORKDIR /app
      COPY go.mod go.sum ./
      RUN go mod download
      COPY . .
      RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /myapp .
      
      # Финальный этап
      FROM scratch
      COPY --from=builder /myapp /myapp
      # Опционально: копируем конфиги или сертификаты
      # COPY --from=builder /app/configs /configs
      ENTRYPOINT ["/myapp"]
  3. CD (Continuous Deployment/Delivery) — Развертывание:

    • Публикация артефакта: Docker-образ загружается в репозиторий (Docker Hub, GitLab Registry, ECR).
    • Деплой: Обновление приложения на серверах. Способ зависит от инфраструктуры:
      • Kubernetes: Обновление версии образа в Deployment манифесте (часто через Helm или ArgoCD).
      • Виртуальные машины: Копирование нового бинарника и перезапуск сервиса (например, через Ansible).
      • Serverless: Загрузка новой версии функции (AWS Lambda, Google Cloud Functions).
  4. Post-Deployment — Мониторинг:

    • Проверка работоспособности (Health Checks): Автоматические запросы к приложению для подтверждения, что оно запустилось и работает корректно.
    • Мониторинг метрик: Наблюдение за ключевыми показателями (CPU, память, время ответа, количество ошибок) через Prometheus/Grafana.
    • Логирование: Сбор и анализ логов через ELK Stack, Loki или другие системы.
    • Rollback: Наличие автоматизированного или ручного механизма отката на предыдущую стабильную версию в случае проблем.