feat(ci): 基础镜像切换到私有ACR,更稳定
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / PR Build Web Image (push) Has been skipped
CI/CD Pipeline / PR Build API Image (push) Has been skipped
CI/CD Pipeline / PR Build Worker Image (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Successful in 41s
CI/CD Pipeline / Frontend Unit Tests (push) Failing after 1m15s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 1m49s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 1m56s
CI/CD Pipeline / Build Production Web Image (push) Successful in 2m7s
CI/CD Pipeline / Build Production API Image (push) Successful in 2m10s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 2m20s
CI/CD Pipeline / Build Staging API Image (push) Successful in 2m21s
CI/CD Pipeline / Build Production Worker Image (push) Successful in 2m51s
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 2m53s
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Failing after 51s
CI/CD Pipeline / Staging E2E Tests (push) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (push) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (push) Has been skipped
CI/CD Pipeline / Canary Release to Production (push) Has been skipped
CI/CD Pipeline / Validate - Code Quality (push) Successful in 4m56s
CI/CD Pipeline / Unit Tests (push) Successful in 5m0s
CI/CD Pipeline / Integration Tests (push) Successful in 1m57s
CI/CD Pipeline / CI Gate (push) Has been skipped
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / PR Build Web Image (push) Has been skipped
CI/CD Pipeline / PR Build API Image (push) Has been skipped
CI/CD Pipeline / PR Build Worker Image (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Successful in 41s
CI/CD Pipeline / Frontend Unit Tests (push) Failing after 1m15s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 1m49s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 1m56s
CI/CD Pipeline / Build Production Web Image (push) Successful in 2m7s
CI/CD Pipeline / Build Production API Image (push) Successful in 2m10s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 2m20s
CI/CD Pipeline / Build Staging API Image (push) Successful in 2m21s
CI/CD Pipeline / Build Production Worker Image (push) Successful in 2m51s
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 2m53s
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Failing after 51s
CI/CD Pipeline / Staging E2E Tests (push) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (push) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (push) Has been skipped
CI/CD Pipeline / Canary Release to Production (push) Has been skipped
CI/CD Pipeline / Validate - Code Quality (push) Successful in 4m56s
CI/CD Pipeline / Unit Tests (push) Successful in 5m0s
CI/CD Pipeline / Integration Tests (push) Successful in 1m57s
CI/CD Pipeline / CI Gate (push) Has been skipped
- Bug6(P1): 所有Dockerfile基础镜像从daocloud切到私有ACR (xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/) - 新增scripts/ci/sync_base_images.sh - 基础镜像同步脚本 - 覆盖: python:3.12-slim-bookworm / python:3.12-slim / node:20 / nginx:alpine
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
# 基础镜像:Python 3.12
|
# 基础镜像:Python 3.12
|
||||||
FROM docker.m.daocloud.io/library/python:3.12-slim-bookworm
|
FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/python:3.12-slim-bookworm
|
||||||
|
|
||||||
# 使用阿里云镜像加速
|
# 使用阿里云镜像加速
|
||||||
RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
|
RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM python:3.12-slim
|
FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/python:3.12-slim
|
||||||
|
|
||||||
ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \
|
||||||
PIP_NO_CACHE_DIR=0 \
|
PIP_NO_CACHE_DIR=0 \
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM docker.m.daocloud.io/library/nginx:alpine AS runner
|
FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/nginx:alpine AS runner
|
||||||
ARG NGINX_CONF=infra/docker/nginx.conf
|
ARG NGINX_CONF=infra/docker/nginx.conf
|
||||||
WORKDIR /usr/share/nginx/html
|
WORKDIR /usr/share/nginx/html
|
||||||
COPY apps/web/dist ./
|
COPY apps/web/dist ./
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Build stage
|
# Build stage
|
||||||
FROM docker.m.daocloud.io/library/node:20 AS builder
|
FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/node:20 AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
ARG VITE_API_URL=https://saas-api.xiaoxiajianji.com
|
ARG VITE_API_URL=https://saas-api.xiaoxiajianji.com
|
||||||
ENV VITE_API_URL=$VITE_API_URL
|
ENV VITE_API_URL=$VITE_API_URL
|
||||||
@@ -11,7 +11,7 @@ COPY apps/web/ ./
|
|||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
# Production stage with nginx
|
# Production stage with nginx
|
||||||
FROM docker.m.daocloud.io/library/nginx:alpine AS runner
|
FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/nginx:alpine AS runner
|
||||||
ARG NGINX_CONF=infra/docker/nginx.conf
|
ARG NGINX_CONF=infra/docker/nginx.conf
|
||||||
WORKDIR /usr/share/nginx/html
|
WORKDIR /usr/share/nginx/html
|
||||||
COPY --from=builder /app/apps/web/dist ./
|
COPY --from=builder /app/apps/web/dist ./
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
# 基础镜像:Python 3.12 + ffmpeg
|
# 基础镜像:Python 3.12 + ffmpeg
|
||||||
FROM docker.m.daocloud.io/library/python:3.12-slim-bookworm
|
FROM xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji/base/python:3.12-slim-bookworm
|
||||||
|
|
||||||
# 使用阿里云镜像加速
|
# 使用阿里云镜像加速
|
||||||
RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
|
RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
|
||||||
|
|||||||
Executable
+103
@@ -0,0 +1,103 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ============================================
|
||||||
|
# 基础镜像同步脚本 - 从公共镜像源同步到私有ACR
|
||||||
|
# 用法:
|
||||||
|
# ACR_USERNAME=xxx ACR_PASSWORD=yyy bash scripts/ci/sync_base_images.sh
|
||||||
|
# ============================================
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ACR_REGISTRY="${ACR_REGISTRY:-xiaoxia-registry.cn-hangzhou.cr.aliyuncs.com/xiaoxiakeji}"
|
||||||
|
ACR_USERNAME="${ACR_USERNAME:-}"
|
||||||
|
ACR_PASSWORD="${ACR_PASSWORD:-}"
|
||||||
|
SOURCE_PREFIX="${SOURCE_PREFIX:-docker.m.daocloud.io/library}"
|
||||||
|
|
||||||
|
# 需要同步的镜像列表 (源镜像名:tag => ACR目标名:tag)
|
||||||
|
IMAGES=(
|
||||||
|
"python:3.12-slim-bookworm"
|
||||||
|
"python:3.12-slim"
|
||||||
|
"node:20"
|
||||||
|
"nginx:alpine"
|
||||||
|
)
|
||||||
|
|
||||||
|
echo "============================================"
|
||||||
|
echo " 基础镜像同步到 ACR"
|
||||||
|
echo " ACR: $ACR_REGISTRY"
|
||||||
|
echo " 源: $SOURCE_PREFIX"
|
||||||
|
echo "============================================"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 登录 ACR
|
||||||
|
if [ -n "$ACR_PASSWORD" ] && [ -n "$ACR_USERNAME" ]; then
|
||||||
|
echo "登录 ACR..."
|
||||||
|
ACR_HOST=$(echo "$ACR_REGISTRY" | cut -d/ -f1)
|
||||||
|
printf '%s' "$ACR_PASSWORD" | docker login "$ACR_HOST" -u "$ACR_USERNAME" --password-stdin
|
||||||
|
echo "ACR 登录成功"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
success=0
|
||||||
|
failed=0
|
||||||
|
|
||||||
|
for image in "${IMAGES[@]}"; do
|
||||||
|
source_image="${SOURCE_PREFIX}/${image}"
|
||||||
|
target_image="${ACR_REGISTRY}/base/${image}"
|
||||||
|
|
||||||
|
echo "--- 同步: $image ---"
|
||||||
|
echo " 源: $source_image"
|
||||||
|
echo " 目标: $target_image"
|
||||||
|
|
||||||
|
# Pull 源镜像(带重试)
|
||||||
|
pulled=0
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
echo " Pull 尝试 $attempt/3..."
|
||||||
|
if docker pull "$source_image"; then
|
||||||
|
pulled=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo " Pull 失败,5s 后重试..."
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$pulled" -eq 0 ]; then
|
||||||
|
echo " ❌ Pull 失败: $image"
|
||||||
|
failed=$((failed + 1))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Tag
|
||||||
|
docker tag "$source_image" "$target_image"
|
||||||
|
echo " Tag 完成"
|
||||||
|
|
||||||
|
# Push 到 ACR
|
||||||
|
pushed=0
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
echo " Push 尝试 $attempt/3..."
|
||||||
|
if docker push "$target_image"; then
|
||||||
|
pushed=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo " Push 失败,5s 后重试..."
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$pushed" -eq 1 ]; then
|
||||||
|
echo " ✅ 同步成功: $image"
|
||||||
|
success=$((success + 1))
|
||||||
|
else
|
||||||
|
echo " ❌ Push 失败: $image"
|
||||||
|
failed=$((failed + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "============================================"
|
||||||
|
echo " 同步完成"
|
||||||
|
echo " 成功: $success"
|
||||||
|
echo " 失败: $failed"
|
||||||
|
echo "============================================"
|
||||||
|
|
||||||
|
if [ "$failed" -gt 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user