Ответ
Типичный CI/CD пайплайн для Go-проекта автоматизирует сборку, тестирование и развертывание приложения. Его главная цель — обеспечить быструю и надежную доставку изменений. Вот основные этапы:
1. Проверки и тесты (Lint & Test)
- Цель: Убедиться в качестве и корректности кода до сборки.
- Действия:
go mod tidy
: Приведение в порядок зависимостей.golangci-lint run
: Статический анализ кода для поиска ошибок, багов, стилистических проблем.go test -v -race ./...
: Запуск unit- и интеграционных тестов с включенным детектором гонок состояний (-race
).
2. Сборка (Build)
- Цель: Компиляция приложения в исполняемый бинарный файл.
- Действия:
go build -o my-app ./cmd/app
: Сборка бинарника для целевой ОС и архитектуры. Часто используется кросс-компиляция для Linux (GOOS=linux GOARCH=amd64 go build ...
).
3. Сборка Docker-образа
-
Цель: Упаковка приложения и его зависимостей в изолированный контейнер для удобства развертывания.
-
Действия:
- Создание
Dockerfile
, часто с использованием многоэтапной сборки (multi-stage build) для минимизации размера итогового образа. docker build -t my-registry/my-app:v1.0.1 .
: Сборка образа.docker push my-registry/my-app:v1.0.1
: Публикация образа в репозиторий (Docker Hub, GitLab Registry, etc.).
- Создание
-
Пример
Dockerfile
:# --- Этап сборки --- FROM golang:1.19-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . # Собираем статически скомпонованный бинарник RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o my-app ./cmd/app # --- Финальный этап --- FROM alpine:latest WORKDIR /root/ # Копируем только бинарник из этапа сборки COPY --from=builder /app/my-app . # Копируем конфиги, если нужно # COPY --from=builder /app/configs ./configs CMD ["./my-app"]
4. Сканирование безопасности (Security Scan)
- Цель: Обнаружение уязвимостей в коде, зависимостях и Docker-образе.
- Действия:
gosec ./...
: Сканирование исходного кода на наличие уязвимостей.trivy image my-registry/my-app:v1.0.1
: Сканирование Docker-образа на уязвимости в системных пакетах.
5. Развертывание (Deploy)
- Цель: Доставка новой версии приложения в целевое окружение (dev, staging, production).
- Действия:
- Обновление манифестов Kubernetes (
kubectl apply -f ...
) или docker-compose файлов. - Использование инструментов вроде Helm или ArgoCD для управления релизами в Kubernetes.
- Применение стратегий развертывания (Rolling Update, Blue-Green, Canary) для минимизации простоя.
- Обновление манифестов Kubernetes (
Инструменты: Популярные системы для реализации таких пайплайнов — GitHub Actions, GitLab CI/CD, Jenkins, CircleCI.