# 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