fix(ci): buildx build --load -> 宿主 docker push 两阶段,彻底绕开 buildkitd OAuth2 空 token 推送失败
构建并部署 BYW VoiceHub / Preflight 语法与构建检查 (push) Successful in 2m35s
构建并部署 BYW VoiceHub / 构建并推送容器镜像 (push) Successful in 9m43s
构建并部署 BYW VoiceHub / 部署到生产服务器 (push) Failing after 4s

This commit is contained in:
2026-09-06 13:55:40 +08:00
parent 2097608f51
commit 496edf9f71
+22 -14
View File
@@ -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,不使用分层缓存,强制重新构建"
BUILD_ARGS+=( --no-cache )
fi
# 说明:暂时关闭 registry 分层缓存(buildkitd 推 buildcache 也要认证,同样会触发 Gitea 1.27 OAuth2 空 token)
# 改为本地 Docker daemon 缓存,已构建的层会自动复用,下次 build 速度几乎相同
BUILD_ARGS+=( --no-cache )
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 }}