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