68 lines
2.8 KiB
YAML
68 lines
2.8 KiB
YAML
# Drone CI/CD бэкенда (сервер подключён к Gitea; см. README, «CI/CD»).
|
||
#
|
||
# Push/PR — только проверки и сборка образа. Деплой — ТОЛЬКО ручным
|
||
# запуском пайплайна из UI Drone (событие custom, кнопка Run Pipeline):
|
||
# шаг deploy выполняется исключительно при нём.
|
||
kind: pipeline
|
||
type: docker
|
||
name: ci-cd
|
||
|
||
clone:
|
||
depth: 1
|
||
|
||
# Сервисная база для интеграционных тестов: схему накатывает сам шаг
|
||
# test (cmd/migrate), тесты выполняют сценарии в транзакции и откатывают
|
||
# их — данные в базе не остаются.
|
||
services:
|
||
- name: postgres
|
||
image: postgres:16-alpine
|
||
environment:
|
||
POSTGRES_USER: building
|
||
POSTGRES_PASSWORD: building
|
||
POSTGRES_DB: building_mgmt_test
|
||
|
||
steps:
|
||
- name: test
|
||
# Полный golang-образ, не alpine: -race требует CGO и C-компилятора.
|
||
image: golang:1.27
|
||
environment:
|
||
DATABASE_URL: postgres://building:building@postgres:5432/building_mgmt_test?sslmode=disable
|
||
commands:
|
||
- go vet ./...
|
||
# Postgres в сервисе поднимается параллельно со сборкой шага:
|
||
# повторяем накат, пока база не готова (30 попыток по 2 секунды).
|
||
- ok=0; for i in $(seq 1 30); do if go run ./cmd/migrate; then ok=1; break; fi; sleep 2; done; test "$ok" = 1
|
||
- go test -race -count=1 ./...
|
||
- go build ./...
|
||
|
||
- name: lint
|
||
image: ghcr.io/golangci/golangci-lint:v2.14.0
|
||
commands:
|
||
- golangci-lint run ./...
|
||
|
||
- name: build-api
|
||
# Образ и два тега: latest (его поднимает compose.prod.yaml) и SHA
|
||
# (для отката: собрать нужный коммит и перетегнуть latest вручную).
|
||
image: plugins/docker:27
|
||
settings:
|
||
repo: building-mgmt-api
|
||
tags:
|
||
- latest
|
||
- ${DRONE_COMMIT_SHA}
|
||
volumes:
|
||
- /var/run/docker.sock:/var/run/docker.sock
|
||
|
||
- name: deploy
|
||
image: docker:27-cli
|
||
volumes:
|
||
- /var/run/docker.sock:/var/run/docker.sock
|
||
commands:
|
||
# -p закрепляет имя проекта: у Drone каталог клонирования свой,
|
||
# без -p имя сети стека разъехалось бы между запусками, и web
|
||
# перестал бы находить api. env-файл — постоянный файл на сервере.
|
||
- docker compose version
|
||
- docker compose -p building-mgmt --env-file /opt/building-mgmt/.env -f compose.prod.yaml up -d --wait
|
||
when:
|
||
event:
|
||
- custom
|