Ответ
Да, я настраивал и поддерживал CI-пайплайны в GitLab CI/CD и GitHub Actions. Цель — автоматизировать сборку, тестирование и создание артефактов при каждом коммите.
Типичный пайплайн для микросервиса на Go:
# .gitlab-ci.yml
stages:
- validate
- test
- build
- security-scan
variables:
GO_VERSION: "1.21"
DOCKER_IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
# 1. Валидация кода
lint:
stage: validate
image: golang:$GO_VERSION
script:
- go fmt ./...
- go vet ./...
- staticcheck ./...
# 2. Запуск юнит- и интеграционных тестов
test:
stage: test
image: golang:$GO_VERSION
services:
- postgres:15-alpine
variables:
POSTGRES_DB: test_db
script:
- go test -v -race ./... -coverprofile=coverage.out
artifacts:
reports:
cobertura: coverage.out
# 3. Сборка Docker-образа
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
only:
- merge_requests
- main
# 4. Сканирование образа на уязвимости
trivy-scan:
stage: security-scan
image: aquasec/trivy:latest
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $DOCKER_IMAGE
Ключевые практики, которые я применял:
- Кэширование зависимостей (Go modules, npm packages) для ускорения сборок.
- Параллельное выполнение независимых jobs (lint, unit tests).
- Артефакты и отчеты: сохранение бинарников, отчетов о покрытии кода тестами (Cobertura), результатов линтинга.
- Интеграция с внешними инструментами: отправка уведомлений о падении сборки в Slack, создание инцидентов в Grafana.