🔧 CI/CD Pipeline Improvements: - Added comprehensive logging with emojis for better readability - Detailed environment information display - Step-by-step progress tracking with timestamps - Enhanced Docker build progress with --progress=plain - Container deployment validation and health checks - Network connectivity testing and port monitoring - Storage usage reporting and cleanup operations 🏗️ Dockerfile Enhancements: - Added verbose logging for every build stage - Go environment verification and dependency tracking - Detailed compilation progress with file sizes - Runtime environment preparation checks - Built-in health check configuration - Enhanced startup logging with service URLs - Error-friendly fallback messages 📊 Debugging Features: - Build log preservation (build.log file) - Container state inspection and JSON formatting - Port listening status verification - Service availability testing with retries - Comprehensive error reporting with context - Container ID tracking for reference 🎯 Key Benefits: - Easy problem identification during CI/CD - Clear visibility into build and deployment process - Service health monitoring and validation - Streamlined troubleshooting workflow - Professional logging presentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
206 lines
7.0 KiB
YAML
206 lines
7.0 KiB
YAML
stages:
|
||
- build
|
||
- deploy
|
||
|
||
variables:
|
||
DOCKER_IMAGE_NAME: file-system-server
|
||
DOCKER_TAG: latest
|
||
CI_REGISTRY: "192.168.1.154:31010"
|
||
CI_REGISTRY_USER: "docker"
|
||
CI_REGISTRY_PASSWORD: "dockerxn001624."
|
||
|
||
# 构建镜像
|
||
build_image:
|
||
stage: build
|
||
image: 192.168.1.154:31010/docker/alpine:latest
|
||
script:
|
||
- echo "🔧 ===== 开始构建阶段 ====="
|
||
- echo "📋 构建环境信息:"
|
||
- echo " - 工作目录: $(pwd)"
|
||
- echo " - 镜像名称: $DOCKER_IMAGE_NAME:$DOCKER_TAG"
|
||
- echo " - 私有仓库: $CI_REGISTRY"
|
||
- echo " - Git提交: $CI_COMMIT_SHORT_SHA"
|
||
- echo " - 构建时间: $(date)"
|
||
|
||
- echo ""
|
||
- echo "📦 安装Docker CLI..."
|
||
- apk add --no-cache docker-cli
|
||
|
||
- echo ""
|
||
- echo "🔐 登录私有仓库..."
|
||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
||
- echo "✅ Docker登录成功"
|
||
|
||
- echo ""
|
||
- echo "🔍 检查Dockerfile和项目文件..."
|
||
- ls -la
|
||
- echo ""
|
||
- echo "📄 Dockerfile内容预览:"
|
||
- head -20 Dockerfile
|
||
|
||
- echo ""
|
||
- echo "🏗️ 开始构建Docker镜像..."
|
||
- echo " 构建命令: docker build -t $DOCKER_IMAGE_NAME:$DOCKER_TAG ."
|
||
- docker build --progress=plain --no-cache -t $DOCKER_IMAGE_NAME:$DOCKER_TAG . 2>&1 | tee build.log
|
||
|
||
- echo ""
|
||
- echo "📊 构建结果检查..."
|
||
- docker images | grep $DOCKER_IMAGE_NAME
|
||
|
||
- echo ""
|
||
- echo "🏷️ 标记镜像为私有仓库地址..."
|
||
- docker tag $DOCKER_IMAGE_NAME:$DOCKER_TAG $CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG
|
||
- echo "✅ 镜像标记完成: $CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG"
|
||
|
||
- echo ""
|
||
- echo "📤 推送镜像到私有仓库..."
|
||
- docker push $CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG
|
||
- echo "✅ 镜像推送成功"
|
||
|
||
- echo ""
|
||
- echo "🎯 ===== 构建阶段完成 ====="
|
||
- echo "📋 构建产物信息:"
|
||
- docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" | grep -E "(REPOSITORY|$DOCKER_IMAGE_NAME|$CI_REGISTRY)"
|
||
only:
|
||
- main
|
||
|
||
# 部署服务
|
||
deploy_service:
|
||
stage: deploy
|
||
image: 192.168.1.154:31010/docker/alpine:latest
|
||
services:
|
||
- docker:24.0.6-dind # Docker-in-Docker服务
|
||
variables:
|
||
DOCKER_HOST: tcp://docker:2376
|
||
DOCKER_TLS_CERTDIR: "/certs"
|
||
script:
|
||
- echo "🚀 ===== 开始部署阶段 ====="
|
||
- echo "📋 部署环境信息:"
|
||
- echo " - 工作目录: $(pwd)"
|
||
- echo " - 镜像地址: $CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG"
|
||
- echo " - Docker主机: $DOCKER_HOST"
|
||
- echo " - 部署时间: $(date)"
|
||
|
||
- echo ""
|
||
- echo "📦 安装部署工具..."
|
||
- apk add --no-cache docker-cli wget curl
|
||
- echo "✅ 工具安装完成"
|
||
|
||
- echo ""
|
||
- echo "🔐 登录私有仓库..."
|
||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
||
- echo "✅ Docker登录成功"
|
||
|
||
- echo ""
|
||
- echo "🔍 检查Docker环境..."
|
||
- docker version
|
||
- echo ""
|
||
- echo "📋 当前Docker镜像列表:"
|
||
- docker images | head -10
|
||
|
||
- echo ""
|
||
- echo "📥 拉取最新构建的镜像..."
|
||
- echo " 拉取命令: docker pull $CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG"
|
||
- docker pull $CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG
|
||
- echo "✅ 镜像拉取完成"
|
||
|
||
- echo ""
|
||
- echo "🧹 清理旧部署..."
|
||
- echo "🛑 停止现有容器..."
|
||
- docker stop file-system-server 2>/dev/null || echo " ℹ️ 没有运行中的容器"
|
||
- echo "🗑️ 删除现有容器..."
|
||
- docker rm file-system-server 2>/dev/null || echo " ℹ️ 没有现有容器"
|
||
- echo "🗑️ 清理旧镜像..."
|
||
- docker rmi $CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG 2>/dev/null || echo " ℹ️ 没有旧镜像"
|
||
|
||
- echo ""
|
||
- echo "📁 创建部署目录..."
|
||
- mkdir -p /builds/root/file_service/logs
|
||
- echo "✅ 目录创建完成"
|
||
|
||
- echo ""
|
||
- echo "🏃 运行新容器..."
|
||
- echo " 容器名称: file-system-server"
|
||
- echo " 端口映射: 8080:8080"
|
||
- echo " 镜像地址: $CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG"
|
||
|
||
- |
|
||
CONTAINER_ID=$(docker run -d \
|
||
--name file-system-server \
|
||
--restart unless-stopped \
|
||
-p 8080:8080 \
|
||
-e SERVER_PORT=8080 \
|
||
-e RUSTFS_ENDPOINT=http://192.168.1.154:9000 \
|
||
-e RUSTFS_ACCESS_KEY=minioadmin \
|
||
-e RUSTFS_SECRET_KEY=minioadmin123 \
|
||
-e RUSTFS_USE_SSL=false \
|
||
-e RUSTFS_REGION=us-east-1 \
|
||
-v /builds/root/file_service/logs:/app/logs \
|
||
--health-cmd="wget --no-verbose --tries=1 --spider http://localhost:8080/swagger/index.html || exit 1" \
|
||
--health-interval=30s \
|
||
--health-timeout=10s \
|
||
--health-retries=3 \
|
||
--health-start-period=40s \
|
||
--log-driver json-file \
|
||
--log-opt max-size=10m \
|
||
--log-opt max-file=3 \
|
||
$CI_REGISTRY/$DOCKER_IMAGE_NAME:$DOCKER_TAG)
|
||
echo "✅ 容器启动成功,ID: $CONTAINER_ID"
|
||
|
||
- echo ""
|
||
- echo "⏳ 等待容器启动..."
|
||
- for i in {1..15}; do echo -n "⏱️ 等待 $i/15 秒... "; sleep 1; done
|
||
- echo ""
|
||
|
||
- echo ""
|
||
- echo "📊 容器状态检查..."
|
||
- docker ps --filter "name=file-system-server" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}\t{{.Image}}"
|
||
|
||
- echo ""
|
||
- echo "🏥 容器健康状态..."
|
||
- HEALTH_STATUS=$(docker inspect --format='{{.State.Health.Status}}' file-system-server 2>/dev/null || echo "checking")
|
||
- echo " 健康状态: $HEALTH_STATUS"
|
||
|
||
- echo ""
|
||
- echo "📋 容器详细信息..."
|
||
- docker inspect file-system-server --format='{{json .State}}' | jq '.' 2>/dev/null || docker inspect file-system-server --format='{{.State}}'
|
||
|
||
- echo ""
|
||
- echo "📝 容器启动日志 (最近30行):"
|
||
- docker logs --tail=30 file-system-server
|
||
|
||
- echo ""
|
||
- echo "🔍 服务连通性测试..."
|
||
- echo " 测试URL: http://localhost:8080/swagger/index.html"
|
||
- if wget --no-verbose --tries=3 --timeout=10 --spider http://localhost:8080/swagger/index.html; then
|
||
echo "✅ 服务连通性测试成功"
|
||
else
|
||
echo "❌ 服务连通性测试失败"
|
||
echo "📋 端口监听状态:"
|
||
- netstat -tlnp | grep :8080 || echo " 端口8080未监听"
|
||
fi
|
||
|
||
- echo ""
|
||
- echo "🧹 清理未使用的镜像..."
|
||
- docker image prune -f
|
||
|
||
- echo ""
|
||
- echo "📋 部署最终报告..."
|
||
- echo "🎯 ===== 部署阶段完成 ====="
|
||
- echo ""
|
||
- echo "📊 服务信息:"
|
||
- echo " 🌐 服务地址: http://localhost:8080"
|
||
- echo " 📖 API文档: http://localhost:8080/swagger/index.html"
|
||
- echo " 📱 Web界面: http://localhost:8080/web"
|
||
- echo " 📋 容器名称: file-system-server"
|
||
- echo " 🏥 健康状态: $HEALTH_STATUS"
|
||
- echo ""
|
||
- echo "📋 容器运行状态:"
|
||
- docker ps --filter "name=file-system-server" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||
|
||
- echo ""
|
||
- echo "💾 存储使用情况:"
|
||
- docker system df --format "table {{.Type}}\t{{.TotalCount}}\t{{.Size}}\t{{.Reclaimed}}"
|
||
only:
|
||
- main
|