mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-13 12:55:19 +00:00
181 lines
5.5 KiB
Bash
Executable file
181 lines
5.5 KiB
Bash
Executable file
#!/bin/bash
|
|
# simulate-workflow.sh - 模拟 GitHub Actions workflow 完整流程
|
|
# 使用方法: ./scripts/simulate-workflow.sh
|
|
|
|
set -e
|
|
|
|
# 颜色
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
echo_job() { echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"; echo -e "${BLUE}[JOB]${NC} $1"; }
|
|
echo_step() { echo -e "${GREEN}[STEP]${NC} $1"; }
|
|
echo_info() { echo -e " $1"; }
|
|
|
|
# ============ 模拟 GitHub Actions 环境变量 ============
|
|
export GITHUB_REPOSITORY="ai-friend-coming/open-webui-next"
|
|
export GITHUB_SHA=$(git rev-parse HEAD)
|
|
export GITHUB_REF=$(git symbolic-ref HEAD)
|
|
export GITHUB_REF_NAME=$(git branch --show-current)
|
|
export IMAGE_NAME="${GITHUB_REPOSITORY,,}" # 转小写
|
|
export FULL_IMAGE_NAME="ghcr.io/${IMAGE_NAME}"
|
|
|
|
echo_job "Build Slim Image (amd64)"
|
|
echo ""
|
|
|
|
# ============ Step 1: Set repository and image name ============
|
|
echo_step "Set repository and image name to lowercase"
|
|
echo_info "IMAGE_NAME=${IMAGE_NAME}"
|
|
echo_info "FULL_IMAGE_NAME=${FULL_IMAGE_NAME}"
|
|
echo ""
|
|
|
|
# ============ Step 2: Checkout repository ============
|
|
echo_step "Checkout repository"
|
|
echo_info "Repository: ${GITHUB_REPOSITORY}"
|
|
echo_info "Branch: ${GITHUB_REF_NAME}"
|
|
echo_info "Commit: ${GITHUB_SHA:0:7}"
|
|
echo ""
|
|
|
|
# ============ Step 3: Set up Docker Buildx ============
|
|
echo_step "Set up Docker Buildx"
|
|
if ! docker buildx inspect github-actions > /dev/null 2>&1; then
|
|
docker buildx create --name github-actions --use
|
|
echo_info "Created new builder: github-actions"
|
|
else
|
|
docker buildx use github-actions
|
|
echo_info "Using existing builder: github-actions"
|
|
fi
|
|
docker buildx inspect --bootstrap
|
|
echo ""
|
|
|
|
# ============ Step 4: Log in to GitHub Container Registry ============
|
|
echo_step "Log in to GitHub Container Registry"
|
|
echo_info "Registry: ghcr.io"
|
|
echo_info "Username: $(whoami)"
|
|
|
|
if [ -z "$CR_PAT" ]; then
|
|
echo -e "${YELLOW}[WARN]${NC} CR_PAT 环境变量未设置,跳过登录"
|
|
echo_info "如需推送,请设置: export CR_PAT=YOUR_PERSONAL_ACCESS_TOKEN"
|
|
SKIP_PUSH=true
|
|
else
|
|
echo $CR_PAT | docker login ghcr.io -u ai-friend-coming --password-stdin > /dev/null 2>&1
|
|
echo_info "✅ Login Succeeded"
|
|
SKIP_PUSH=false
|
|
fi
|
|
echo ""
|
|
|
|
# ============ Step 5: Extract metadata for Docker images ============
|
|
echo_step "Extract metadata for Docker images"
|
|
|
|
# 生成标签
|
|
if [ "$GITHUB_REF_NAME" = "main" ]; then
|
|
TAGS=(
|
|
"${FULL_IMAGE_NAME}:slim"
|
|
"${FULL_IMAGE_NAME}:latest-slim"
|
|
"${FULL_IMAGE_NAME}:${GITHUB_REF_NAME}-slim"
|
|
"${FULL_IMAGE_NAME}:git-${GITHUB_SHA:0:7}-slim"
|
|
)
|
|
else
|
|
TAGS=(
|
|
"${FULL_IMAGE_NAME}:${GITHUB_REF_NAME}-slim"
|
|
"${FULL_IMAGE_NAME}:git-${GITHUB_SHA:0:7}-slim"
|
|
)
|
|
fi
|
|
|
|
echo_info "Tags:"
|
|
for tag in "${TAGS[@]}"; do
|
|
echo_info " - ${tag}"
|
|
done
|
|
echo ""
|
|
|
|
# 构建标签参数
|
|
TAG_ARGS=""
|
|
for tag in "${TAGS[@]}"; do
|
|
TAG_ARGS="${TAG_ARGS} --tag ${tag}"
|
|
done
|
|
|
|
# ============ Step 6: Extract metadata for Docker cache ============
|
|
echo_step "Extract metadata for Docker cache"
|
|
CACHE_TAG="${FULL_IMAGE_NAME}:cache-slim-linux-amd64-${GITHUB_REF_NAME}"
|
|
echo_info "Cache: ${CACHE_TAG}"
|
|
echo ""
|
|
|
|
# ============ Step 7: Build and push Docker image ============
|
|
echo_step "Build and push Docker image (slim)"
|
|
echo_info "Platform: linux/amd64"
|
|
echo_info "Build args: BUILD_HASH=${GITHUB_SHA}, USE_SLIM=true"
|
|
echo ""
|
|
|
|
if [ "$SKIP_PUSH" = true ]; then
|
|
# 仅构建,不推送
|
|
docker buildx build \
|
|
--platform linux/amd64 \
|
|
--build-arg BUILD_HASH="${GITHUB_SHA}" \
|
|
--build-arg USE_SLIM=true \
|
|
${TAG_ARGS} \
|
|
--cache-from type=registry,ref=${CACHE_TAG} \
|
|
--load \
|
|
.
|
|
echo ""
|
|
echo -e "${YELLOW}[WARN]${NC} 跳过推送 (CR_PAT 未设置)"
|
|
else
|
|
# 构建并推送
|
|
read -p "确认推送到 GHCR? (y/n): " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
docker buildx build \
|
|
--platform linux/amd64 \
|
|
--build-arg BUILD_HASH="${GITHUB_SHA}" \
|
|
--build-arg USE_SLIM=true \
|
|
${TAG_ARGS} \
|
|
--cache-from type=registry,ref=${CACHE_TAG} \
|
|
--cache-to type=registry,ref=${CACHE_TAG},mode=max \
|
|
--push \
|
|
.
|
|
echo ""
|
|
echo_info "✅ Image pushed successfully"
|
|
else
|
|
docker buildx build \
|
|
--platform linux/amd64 \
|
|
--build-arg BUILD_HASH="${GITHUB_SHA}" \
|
|
--build-arg USE_SLIM=true \
|
|
${TAG_ARGS} \
|
|
--cache-from type=registry,ref=${CACHE_TAG} \
|
|
--load \
|
|
.
|
|
echo ""
|
|
echo -e "${YELLOW}[WARN]${NC} 用户取消推送"
|
|
fi
|
|
fi
|
|
echo ""
|
|
|
|
# ============ Step 8: Inspect image ============
|
|
echo_step "Inspect image"
|
|
if [ "$SKIP_PUSH" = false ] && [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
docker buildx imagetools inspect ${FULL_IMAGE_NAME}:slim
|
|
else
|
|
docker images | grep open-webui-next | head -5
|
|
fi
|
|
echo ""
|
|
|
|
# ============ Step 9: Output image tags ============
|
|
echo_step "Output image tags"
|
|
echo ""
|
|
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
echo -e "${GREEN}🐳 Docker 镜像构建成功${NC}"
|
|
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
|
echo ""
|
|
echo "📦 镜像标签:"
|
|
for tag in "${TAGS[@]}"; do
|
|
echo " ${tag}"
|
|
done
|
|
echo ""
|
|
echo "🚀 拉取命令:"
|
|
echo " docker pull ${FULL_IMAGE_NAME}:slim"
|
|
echo ""
|
|
echo "🌐 查看镜像:"
|
|
echo " https://github.com/${GITHUB_REPOSITORY}/pkgs/container/open-webui-next"
|
|
echo ""
|
|
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|