ci(deploy): narrow image build and document pool settings
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

Примеры Compose задают пул соединений. Контекст сборки бинарника сужен, зеркало базовых образов обновляется явно, алерты Prometheus дополнены.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
DenozordecandCursor committed 2026-11-02 17:24:25 +07:00
1 parent 240d83fc61
commit 5bdb1f1f93
13 files changed
+132 -55

No files matched your search

+4 -4
View File
@@ -14,20 +14,20 @@ BuildKit кэширует `/go/pkg/mod`, `~/.cache/go-build` и pnpm store че
| Образ | Runtime base | Заметка |
|-------|----------------|---------|
| scheduler, ingest, render | `gcr.io/distroless/static-debian12:nonroot` | static Go (`CGO_ENABLED=0`), без shell |
| api, all, deploy, node | `debian:bookworm-slim` + `bird` + `birdc` | `bird -p` (parse-check) и `birdc`; демон не запускается |
| 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`. Context режется корневым [.dockerignore](../../.dockerignore).
Сборка Go: `golang:1.24-alpine`. Для Go Dockerfile действует отдельный [Dockerfile.dockerignore](gobinary/Dockerfile.dockerignore): в контексте остаются только Go-модуль, исходники, миграции, встроенные shell-скрипты и сборочный скрипт BIRD. Web-исходники не входят в Go-контекст. Кэш Go build также зависит от `GIT_SHA` и `BUILD_TIME`, поэтому эффект для web-only коммитов требует замера. Web context режется корневым [.dockerignore](../../.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`; skip если тег уже в Gitea. Неуспешный copy не валит CD — bake берёт Docker Hub FROM для этой базы.
- `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.
+1 -1
View File
@@ -236,7 +236,7 @@ target "evobgp-render" {
}
target "evobgp-deploy" {
inherits = ["_go-runtime-birdc"]
inherits = ["_go-runtime"]
args = { BIN = "evobgp-deploy" }
tags = image-tags("evobgp-deploy")
}
+2 -2
View File
@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1.7
# Универсальная сборка бинарей cmd/* (ARG BIN) или всех сразу (target build-all).
# Воркеры (runtime): distroless static. api/all/deploy/node (runtime-birdc): debian-slim + bird + birdc.
# Воркеры, включая deploy (runtime): distroless static. api/all/node (runtime-birdc): debian-slim + bird + birdc.
# CI: docker buildx bake -f deploy/docker/docker-bake.hcl
ARG BASE_GOLANG=docker.io/library/golang:1.24-alpine
ARG BASE_DEBIAN=docker.io/library/debian:bookworm-slim
@@ -64,7 +64,7 @@ COPY --from=build-all /out/${BIN} /usr/local/bin/evobgp
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/evobgp"]
# api / all / deploy / node — bird -p (parse-check) + birdc configure.
# api / all / node — bird -p (parse-check) + birdc configure.
# Демон BIRD в этом контейнере не запускается; процесс bird — в образе evobgp-bird2.
FROM ${BASE_DEBIAN} AS runtime-birdc
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
@@ -0,0 +1,17 @@
# Go builds use only the Go module and assets embedded into the binaries.
# This file takes precedence over the repository .dockerignore for this Dockerfile.
*
!go.mod
!go.sum
!cmd/
!cmd/**
!internal/
!internal/**
!migrations/
!migrations/**
!deploy/
!deploy/docker/
!deploy/docker/bird/
!deploy/docker/bird/bird-from-source.sh
**/*_test.go
**/*.md
+39 -16
View File
@@ -4,7 +4,8 @@
# REGISTRY=git.shx.one/<owner> (без суффикса /evobgp-buildcache)
#
# Источник library-образов — Docker Hub (docker.io), не public.ecr.aws (429 Too Many Requests).
# Если тег уже есть в Gitea — skip (без повторного pull).
# Если тег уже есть в Gitea — skip. MIRROR_REFRESH=1 принудительно обновляет зеркала.
# В bake передаётся immutable digest зеркала, а не его изменяемый tag.
# Копируем только linux/amd64 — bake platforms совпадает, multi-arch индекс не нужен.
# Шаг CD не должен падать: неуспешный copy оставляет bake на Docker Hub FROM для этой базы.
set -eu
@@ -13,6 +14,12 @@ CACHE_REPO="${REGISTRY}/evobgp-buildcache"
ENV_FILE="${MIRROR_ENV_FILE:-}"
PLATFORM="${MIRROR_PLATFORM:-linux/amd64}"
RETRIES="${MIRROR_RETRIES:-4}"
REFRESH="${MIRROR_REFRESH:-0}"
case "$REFRESH" in
0|1) ;;
*) echo "MIRROR_REFRESH must be 0 or 1" >&2; exit 2 ;;
esac
tmp="$(mktemp)"
cleanup() { rm -f "$tmp"; }
@@ -22,6 +29,14 @@ dest_exists() {
docker buildx imagetools inspect "$1" >/dev/null 2>&1
}
dest_digest() {
digest="$(docker buildx imagetools inspect --format '{{.Manifest.Digest}}' "$1")" || return 1
case "$digest" in
sha256:????????????????????????????????????????????????????????????????) printf '%s\n' "$digest" ;;
*) echo "invalid mirror digest for $1: $digest" >&2; return 1 ;;
esac
}
copy_retry() {
src="$1"
dest="$2"
@@ -31,9 +46,11 @@ copy_retry() {
if docker buildx imagetools create --platform "$PLATFORM" --tag "$dest" "$src"; then
return 0
fi
delay=$((n * 25))
echo "mirror retry ${n}/${RETRIES}, sleep ${delay}s: ${dest}"
sleep "$delay"
if [ "$n" -lt "$RETRIES" ]; then
delay=$((n * 25))
echo "mirror retry ${n}/${RETRIES}, sleep ${delay}s: ${dest}"
sleep "$delay"
fi
done
return 1
}
@@ -43,30 +60,36 @@ mirror() {
tag="$2"
var="$3"
dest="${CACHE_REPO}:${tag}"
if dest_exists "$dest"; then
if [ "$REFRESH" = 0 ] && dest_exists "$dest"; then
echo "skip (already in registry): ${dest}"
printf '%s=%s\n' "$var" "$dest" >>"$tmp"
else
echo "mirror ${src} -> ${dest} (${PLATFORM})"
if ! copy_retry "$src" "$dest"; then
if [ "$REFRESH" = 1 ]; then
echo "error: refresh failed for ${dest}" >&2
return 1
fi
echo "warn: ${dest} not mirrored — bake uses upstream FROM for ${var}"
return 0
fi
fi
if digest="$(dest_digest "$dest")"; then
printf '%s=%s@%s\n' "$var" "$CACHE_REPO" "$digest" >>"$tmp"
return 0
fi
echo "mirror ${src} -> ${dest} (${PLATFORM})"
if copy_retry "$src" "$dest"; then
printf '%s=%s\n' "$var" "$dest" >>"$tmp"
return 0
if [ "$REFRESH" = 1 ]; then
echo "error: cannot resolve refreshed digest for ${dest}" >&2
return 1
fi
echo "warn: ${dest} not mirrored — bake uses Docker Hub FROM for ${var}"
echo "warn: cannot resolve digest for ${dest} — bake uses upstream FROM for ${var}"
return 0
}
mirror "docker.io/library/golang:1.24-alpine" "base-golang-1.24-alpine" BASE_GOLANG
sleep 8
mirror "docker.io/library/debian:bookworm-slim" "base-debian-bookworm-slim" BASE_DEBIAN
sleep 8
mirror "docker.io/library/node:22-alpine" "base-node-22-alpine" BASE_NODE
sleep 8
mirror "docker.io/library/nginx:1.27-alpine" "base-nginx-1.27-alpine" BASE_NGINX
sleep 8
mirror "docker.io/library/ubuntu:noble" "base-ubuntu-noble" BASE_UBUNTU
sleep 8
mirror "gcr.io/distroless/static-debian12:nonroot" "base-distroless-static-debian12-nonroot" BASE_DISTROLESS
echo "----- mirrored BASE_* -----"