Merge branch 'ci/v1.1.x-faster-builds' into 'main'
ci: BuildKit cache в docker publish (-10 мин) See merge request 2-6/2-6-4/terravault/ordinis!31
This commit is contained in:
+24
-16
@@ -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}" \
|
||||
|
||||
Reference in New Issue
Block a user