diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0870795..b173cb7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,217 +3,36 @@ stages: - deploy variables: - DOCKER_IMAGE_NAME: file-system-server + DOCKER_IMAGE_NAME: docker/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 build -t $DOCKER_IMAGE_NAME:$DOCKER_TAG . - 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" + image: 192.168.1.154:31010/docker/compose:latest + before_script: + - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY 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 "⏳ 等待容器启动..." - - echo "⏱️ 等待 1/15 秒..." && sleep 1 - - echo "⏱️ 等待 2/15 秒..." && sleep 1 - - echo "⏱️ 等待 3/15 秒..." && sleep 1 - - echo "⏱️ 等待 4/15 秒..." && sleep 1 - - echo "⏱️ 等待 5/15 秒..." && sleep 1 - - echo "⏱️ 等待 6/15 秒..." && sleep 1 - - echo "⏱️ 等待 7/15 秒..." && sleep 1 - - echo "⏱️ 等待 8/15 秒..." && sleep 1 - - echo "⏱️ 等待 9/15 秒..." && sleep 1 - - echo "⏱️ 等待 10/15 秒..." && sleep 1 - - echo "⏱️ 等待 11/15 秒..." && sleep 1 - - echo "⏱️ 等待 12/15 秒..." && sleep 1 - - echo "⏱️ 等待 13/15 秒..." && sleep 1 - - echo "⏱️ 等待 14/15 秒..." && sleep 1 - - echo "⏱️ 等待 15/15 秒..." && sleep 1 - - 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-compose pull + - docker-compose down --remove-orphans || true + - docker-compose up -d - 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}}" + - docker-compose ps + tags: + - shell only: - - main + - main \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4076fec --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,29 @@ +version: '3.8' + +services: + file-system-server: + image: 192.168.1.154:31010/docker/file-system-server:latest + container_name: file-system-server + ports: + - "8080:8080" + restart: unless-stopped + environment: + - GIN_MODE=release + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/swagger/index.html"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + volumes: + - ./logs:/app/logs + networks: + - app-network + +networks: + app-network: + driver: bridge + +volumes: + logs: + driver: local \ No newline at end of file