Ответ
Типовой CI/CD пайплайн для Go-приложения автоматизирует процесс сборки, тестирования и развертывания, обеспечивая качество и скорость доставки кода. Процесс обычно строится на базе систем вроде GitLab CI, GitHub Actions или Jenkins.
Основные этапы пайплайна:
Lint & Static Analysis (Проверка кода):
- Цель: Найти проблемы в коде без его выполнения.
- Инструменты:
golangci-lint
(агрегатор линтеров),go vet
(анализ подозрительных конструкций),gosec
(поиск уязвимостей).
Unit & Integration Tests (Тестирование):
- Цель: Убедиться, что отдельные компоненты и их взаимодействия работают корректно.
- Инструменты:
go test -v ./...
для запуска тестов. Часто используется флаг-race
для обнаружения состояний гонки и-cover
для сбора покрытия кода тестами.
Build (Сборка):
- Цель: Компиляция приложения в исполняемый бинарный файл.
- Действия: Выполняется команда
go build
. Часто происходит кросс-компиляция для разных ОС и архитектур (например,linux/amd64
,linux/arm64
) путем установки переменных окруженияGOOS
иGOARCH
.
Dockerize (Сборка Docker-образа):
- Цель: Упаковка бинарного файла и необходимых зависимостей в легковесный Docker-образ.
- Практика: Используются многоступенчатые сборки (
multi-stage builds
) для минимизации размера итогового образа. На первом этапе код компилируется, на втором — готовый бинарник копируется в минимальный базовый образ (например,scratch
илиalpine
).
Deploy to Staging (Развертывание на тестовое окружение):
- Цель: Развернуть приложение в окружении, идентичном продакшену, для финального тестирования (E2E, нагрузочное).
- Действия: Автоматическое развертывание собранного Docker-образа в Kubernetes, на ВМ или в облачный сервис.
Deploy to Production (Развертывание в продакшен):
- Цель: Доставка новой версии пользователям.
- Действия: Этот этап часто требует ручного подтверждения (
manual approval
). Используются стратегии безопасного развертывания, такие как Canary (постепенный перевод трафика на новую версию) или Blue-Green (переключение трафика между двумя идентичными окружениями).
Пример .gitlab-ci.yml
:
stages:
- test
- build
- deploy
lint-and-test:
stage: test
image: golang:1.21
script:
- go vet ./...
- go test -v -race ./...
- go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
- golangci-lint run
build-docker:
stage: build
image: docker:20.10
services:
- docker:dind
script:
- docker build -t my-app:$CI_COMMIT_SHA .
- docker push my-app:$CI_COMMIT_SHA
deploy-staging:
stage: deploy
script:
- echo "Deploying to staging..."
# Команды для деплоя, например, с помощью kubectl или helm
environment:
name: staging