file_system/.gitlab-ci.yml
root e12ce5c632 Enhance logging for better troubleshooting and debugging
🔧 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>
2025-12-19 10:26:34 +08:00

206 lines
7.0 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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