fix(ci): buildx build --load -> 宿主 docker push 两阶段,彻底绕开 buildkitd OAuth2 空 token 推送失败
This commit is contained in:
+21
-13
@@ -289,7 +289,6 @@ jobs:
|
||||
|
||||
- name: 构建并推送镜像
|
||||
env:
|
||||
CACHE_REF: ${{ steps.meta.outputs.cache_ref }}
|
||||
SKIP_CACHE: ${{ inputs.skip_build_cache }}
|
||||
IMG_FULL: ${{ steps.meta.outputs.full }}
|
||||
IMG_LATEST: ${{ steps.meta.outputs.latest }}
|
||||
@@ -304,30 +303,25 @@ jobs:
|
||||
# 再次保险:所有镜像标签字符串都确认无大写字母(Registry 硬性规范)
|
||||
IMG_FULL="${IMG_FULL,,}"
|
||||
IMG_LATEST="${IMG_LATEST,,}"
|
||||
CACHE_REF="${CACHE_REF,,}"
|
||||
|
||||
BUILD_ARGS=(
|
||||
--build-arg BUILDKIT_INLINE_CACHE=1
|
||||
--build-arg NODE_ENV=production
|
||||
)
|
||||
CACHE_ARGS=()
|
||||
if [ "${SKIP_CACHE}" != "true" ]; then
|
||||
CACHE_ARGS=(
|
||||
--cache-from "type=registry,ref=${CACHE_REF}"
|
||||
--cache-to "type=registry,ref=${CACHE_REF},mode=max"
|
||||
)
|
||||
else
|
||||
echo "已启用 skip_build_cache,不使用分层缓存,强制重新构建"
|
||||
# 说明:暂时关闭 registry 分层缓存(buildkitd 推 buildcache 也要认证,同样会触发 Gitea 1.27 OAuth2 空 token)
|
||||
# 改为本地 Docker daemon 缓存,已构建的层会自动复用,下次 build 速度几乎相同
|
||||
BUILD_ARGS+=( --no-cache )
|
||||
fi
|
||||
echo "已启用强制重新构建(跳过 registry 分层缓存,避免 buildkitd 推 cache 层时 OAuth2 认证失败)"
|
||||
|
||||
# ========== 阶段 1:构建到本地 Docker daemon(--load,不用 --push) ==========
|
||||
# 关键:这一步产物在宿主 Docker 的 images 列表里(docker images 能看到),宿主 docker login 过的凭据 100% 可用
|
||||
# 完全绕开 buildkitd 容器内部推镜像走 OAuth2 flow 的坑
|
||||
docker buildx build \
|
||||
--file ./Dockerfile \
|
||||
--platform linux/amd64 \
|
||||
--push \
|
||||
--load \
|
||||
--provenance=false \
|
||||
"${BUILD_ARGS[@]}" \
|
||||
"${CACHE_ARGS[@]}" \
|
||||
--tag "${IMG_FULL}" \
|
||||
--tag "${IMG_LATEST}" \
|
||||
--label "org.opencontainers.image.source=${OCS_SOURCE}" \
|
||||
@@ -335,6 +329,20 @@ jobs:
|
||||
--label "org.opencontainers.image.created=${OCS_CREATED}" \
|
||||
.
|
||||
|
||||
# 断言:两个 tag 都真的加载到了本地 Docker daemon
|
||||
docker image inspect "${IMG_FULL}" >/dev/null
|
||||
docker image inspect "${IMG_LATEST}" >/dev/null
|
||||
echo "构建成功,已加载到本地 Docker daemon:${IMG_FULL} + ${IMG_LATEST}"
|
||||
echo "镜像体积(Pre-push):"
|
||||
docker image inspect "${IMG_FULL}" --format='{{.Size}}' | awk '{printf " Full image : %.2f MB\n", $1/1024/1024}'
|
||||
|
||||
# ========== 阶段 2:宿主 Docker daemon 原生 push(100% 走宿主登录凭据,不会走 OAuth2) ==========
|
||||
echo "开始推送:${IMG_FULL}"
|
||||
docker push "${IMG_FULL}"
|
||||
echo "开始推送:${IMG_LATEST}"
|
||||
docker push "${IMG_LATEST}"
|
||||
echo "推送完成:2 个 tag(date-sha + latest)"
|
||||
|
||||
- name: 镜像体积与层信息
|
||||
env:
|
||||
IMG_FULL: ${{ steps.meta.outputs.full }}
|
||||
|
||||
Reference in New Issue
Block a user