Files
DenozordecandCursor 5bdb1f1f93
quality / changes (push) Successful in 7s
quality / commitlint (push) Skipped
quality / docker-check (push) Skipped
quality / openapi (push) Successful in 43s
quality / web (push) Successful in 1m20s
quality / go (push) Failing after 1m9s
quality / bird2 (push) Skipped
quality / postgres-integration (push) Failing after 2m29s
quality / legacy-compatibility (1.0.0) (push) Successful in 1m14s
quality / legacy-compatibility (2.56.2) (push) Successful in 1m34s
CD / quality (push) Failing after 8m40s
CD / publish (push) Skipped
ci(deploy): narrow image build and document pool settings
Примеры Compose задают пул соединений. Контекст сборки бинарника сужен, зеркало базовых образов обновляется явно, алерты Prometheus дополнены.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-02 17:24:25 +07:00
..

Docker-образы EvoBGP

CI (Gitea Actions)

Сборка образов — docker buildx bake (docker-bake.hcl), не отдельные docker build.

Publish: push в main после quality gates — workflow CD job publish: semantic-release + зеркало base-образов + bake с VERSION из релиза.

Bake читает переменные из окружения (REGISTRY, IMAGE_TAG, CACHE_REF_*, BASE_*). Скрипт write-bake-override.sh — опциональный helper для локальной отладки.

BuildKit кэширует /go/pkg/mod, ~/.cache/go-build и pnpm store через RUN --mount=type=cache. На CI mounts живут, пока named builder evobgp не удаляют (cleanup: false).

Слои и runtime

Образ Runtime base Заметка
scheduler, ingest, render, deploy gcr.io/distroless/static-debian12:nonroot static Go (CGO_ENABLED=0), без shell; deploy только сверяет drift
api, all, node debian:bookworm-slim + bird + birdc bird -p (parse-check) и birdc; демон не запускается
agent тот же Ubuntu+bird2, что bird2 общие слои с evobgp-bird2
bird2 Ubuntu Noble + пакет bird2
web, web-all nginx:1.27-alpine worker_processes 1

Сборка Go: golang:1.24-alpine. Для Go Dockerfile действует отдельный Dockerfile.dockerignore: в контексте остаются только Go-модуль, исходники, миграции, встроенные shell-скрипты и сборочный скрипт BIRD. Web-исходники не входят в Go-контекст. Кэш Go build также зависит от GIT_SHA и BUILD_TIME, поэтому эффект для web-only коммитов требует замера. Web context режется корневым .dockerignore.

Кэш registry

  • git.shx.one/<owner>/evobgp-buildcache:go-buildcache — запись только из go-build-all
  • git.shx.one/<owner>/evobgp-buildcache:web-buildcache — запись только из web-build
  • git.shx.one/<owner>/evobgp-buildcache:birdc-buildcache — запись только из go-birdc
  • git.shx.one/<owner>/evobgp-buildcache:base-* — зеркало FROM с Docker Hub (docker.io/library/…; distroless — gcr.io). Только linux/amd64; существующий тег не копируется повторно, а в bake передаётся repo@sha256:…. MIRROR_REFRESH=1 принудительно обновляет зеркало и завершает скрипт с ошибкой, если copy или digest lookup не удались. Без refresh неуспешный copy или digest lookup оставляет исходный upstream FROM для этой базы.

pull = false в bake: не перекачивать FROM, если слой уже в builder. Не запускайте docker system prune -a на runner.

Параллельный cache-to в один ref ломает manifest (content descriptor … not found).

Если CI падает на «not found» после смены схемы кэша — один раз удалите теги evobgp-buildcache:* в registry и пересоберите.

Локальная сборка

Из корня репозитория:

cd deploy/docker
export REGISTRY=git.shx.one/<owner>
export IMAGE_TAG=latest
export SHORT_SHA=$(git rev-parse --short HEAD)
export VERSION=dev
export BUILD_TIME=
docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl go-images
docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl web-images

Проверка манифеста без сборки:

docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl --print default

В docker-bake.hcl: context = "../.." резолвится от cwd (каталог deploy/docker/). dockerfile — путь от этого context (корень репо). Из корня репо не вызывать bake с -f deploy/docker/docker-bake.hcl: получится lstat ../../deploy. Можно задать BUILDX_BAKE_FILE_RELATIVE_PATHS=1.

Один образ (legacy, target build-all):

docker build -f deploy/docker/gobinary/Dockerfile \
  --target build-all \
  -t evobgp-build-all:local .

Runtime-образы в bake ожидают stage build-all (через bake contexts).