CI/CD (Continuous Integration / Continuous Delivery) — это методология автоматизации процессов интеграции кода, тестирования и доставки приложений. Рассмотрим как это применяется в Go-проектах.
Суть: Автоматическая сборка и тестирование кода при каждом коммите.
# Пример .gitlab-ci.yml для Go-проекта
stages:
- test
- build
unit_tests:
stage: test
image: golang:1.21
script:
- go test -v -race -coverprofile=coverage.out ./...
- go tool cover -func=coverage.out
build_linux:
stage: build
image: golang:1.21
script:
- GOOS=linux GOARCH=amd64 go build -o myapp ./cmd/main.go
artifacts:
paths:
- myapp
Компоненты CI для Go:
go test
)-coverprofile
)-race
)go vet
, staticcheck
)Суть: Автоматический деплой проверенного кода на тестовые/продакшен окружения.
deploy_staging:
stage: deploy
image: alpine
only:
- main
script:
- scp myapp user@staging:/opt/myapp
- ssh user@staging "systemctl restart myapp"
Этап валидации:
gofmt
)golangci-lint run
)Этап сборки:
FROM golang:1.21 as builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app ./cmd
FROM alpine:latest
COPY --from=builder /app/app /app
ENTRYPOINT ["/app"]
Этап тестирования:
Этап деплоя:
Инструмент | Назначение |
---|---|
GitHub Actions | CI/CD прямо в GitHub |
GitLab CI | Встроенное решение GitLab |
CircleCI | Облачный CI/CD |
Drone | Легковесный CI/CD на Go |
Goreleaser | Автоматический релиз бинарников |
Docker | Контейнеризация приложений |
Кэширование зависимостей:
- restore_cache:
keys: [go-mod-{{ checksum "go.sum" }}]
- run: go mod download
- save_cache:
paths: [go/pkg/mod]
key: go-mod-{{ checksum "go.sum" }}
Кросс-компиляция:
GOOS=darwin GOARCH=arm64 go build -o bin/app-darwin-arm64
GOOS=windows GOARCH=amd64 go build -o bin/app-windows.exe
Тестирование в разных версиях Go:
matrix:
go-version: [1.19, 1.20, 1.21]
-ldflags "-X main.version=$CI_COMMIT_TAG"
CI/CD для Go-проектов включает:
Правильно настроенный CI/CD pipeline для Go-проекта обеспечивает: ✔️ Быструю обратную связь по изменениям ✔️ Стабильность основной ветки ✔️ Предсказуемый процесс релиза ✔️ Минимальное время между коммитом и продакшеном