From 5a4f04a79b5fdf485143c617348da0f7f022be3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B8=D0=BC=D0=B8=D0=BD?= Date: Sun, 10 May 2026 21:56:35 +0000 Subject: [PATCH] =?UTF-8?q?ci:=20BuildKit=20cache=20=D0=B2=20docker=20publ?= =?UTF-8?q?ish=20(-10=20=D0=BC=D0=B8=D0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 291c36c..1cd5dfd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -194,30 +194,38 @@ build-docs: .publish_script: &publish_script | for i in $(seq 1 30); do docker info >/dev/null 2>&1 && break; sleep 1; done - # Cleanup от предыдущего job'а в этой serialized group: удаляем dangling - # images + build cache. DinD container shared across serialized jobs если - # runner reuses container — без prune'а cache накапливается до disk-full. - # `|| true`: на cold start (первый job в группе) prune может скипнуть с - # warning, не должен ронять job. - docker system prune -af --volumes >/dev/null 2>&1 || true + # Lighter cleanup: dangling layers only, build cache сохраняем чтобы BuildKit + # переиспользовал между serialized jobs. Раньше был `prune -af --volumes` + # после Nexus blob loss recovery (см. ниже) — сжирал inline cache, каждая + # сборка с нуля. Сейчас Nexus стабилен → cache сохраняем. + docker image prune -f >/dev/null 2>&1 || true echo "$REGISTRY_PASSWORD" | docker login "$REGISTRY" -u "$REGISTRY_USER" --password-stdin IMG="$REGISTRY/$IMAGE_REPO/$SVC" - # --pull + --no-cache временно для recovery после Nexus blob loss - # (post disk-full incident): - # - --pull: Nexus docker-proxy лениво re-fetch'ит base image с Docker Hub. - # - --no-cache: BuildKit НЕ читает inline cache из previously-pushed :latest - # (которое references missing blob 74e368...). Без этого BuildKit skip'ает - # push любого blob'а который "exists" в старом manifest'е → "blob unknown - # to registry" на manifest push. - # Когда Nexus blob storage стабилизируется, --no-cache можно убрать — - # добавляет ~2 минуты per service на полную пересборку. + # Cache strategy: + # - --cache-from $IMG:latest — BuildKit читает inline cache из previously + # pushed manifest'а. На повторных сборках cached слои переиспользуются, + # полная сборка падает с ~70-90s до 15-25s. + # - --build-arg BUILDKIT_INLINE_CACHE=1 — записывает cache metadata в + # pushed image manifest для следующего pipeline'а. + # - --pull — Nexus docker-proxy лениво re-fetch'ит base image с Docker Hub. + # + # Раньше был --no-cache как temporary recovery после Nexus blob loss + # incident (pipeline 6066). Nexus blob storage стабилизирован, --no-cache + # убран → -2 мин/service × 5 services = -10 мин на pipeline. + # Если Nexus снова потеряет blob refs — симптом: "blob unknown to registry" + # на manifest push. Recovery: вернуть --no-cache temporarily, сделать + # `nexus-cli script run cleanup-orphan-blobs` (или ручной touch через UI), + # потом убрать --no-cache обратно. + # # Git info passed как build args чтобы Spring Boot build-info goal получил # реальные значения (внутри Docker context .git/ исключён через .dockerignore, # git-commit-id-maven-plugin не может прочесть). Backend Dockerfile'ы # используют эти ARG'и в `mvn -Dgit.commit.id.abbrev=... -Dgit.branch=...`. # Frontend / docs / migrations Dockerfile'ы их игнорируют (no-op в context'е). - docker build --pull --no-cache -f "$DOCKERFILE" \ + docker pull "$IMG:latest" >/dev/null 2>&1 || true + docker build --pull -f "$DOCKERFILE" \ -t "$IMG:$IMAGE_TAG" -t "$IMG:latest" -t "$IMG:$CI_COMMIT_REF_SLUG" \ + --cache-from "$IMG:latest" \ --build-arg BUILDKIT_INLINE_CACHE=1 \ --build-arg GIT_COMMIT="${CI_COMMIT_SHORT_SHA:-unknown}" \ --build-arg GIT_BRANCH="${CI_COMMIT_REF_NAME:-unknown}" \