diff --git a/.drone.yml b/.drone.yml index 91731bb..228abed 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,8 +1,8 @@ kind: pipeline type: docker -name: deploy-test +name: build-and-push-test -# 测试环境:test 分支触发,部署到 kpl +# 测试环境:test 分支触发,构建并推送到 ACR trigger: branch: - test @@ -10,64 +10,61 @@ trigger: - push steps: - - name: sync-code - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 5m - script: - - echo "=== 测试环境 同步代码 ===" - - cd /root/aiedu - - git fetch cicd - - git checkout test 2>/dev/null || git checkout -b test cicd/test - - git reset --hard cicd/test - - echo "代码同步完成" + # 构建并推送后端镜像 + - name: build-push-backend + image: docker:dind + volumes: + - name: docker-sock + path: /var/run/docker.sock + environment: + DOCKER_REGISTRY: + from_secret: docker_registry + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password + commands: + - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin + - cd backend + - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-backend:test -f Dockerfile . + - docker tag $DOCKER_REGISTRY/ireborn/kaopeilian-backend:test $DOCKER_REGISTRY/ireborn/kaopeilian-backend:${DRONE_COMMIT_SHA:0:8} + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-backend:test + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-backend:${DRONE_COMMIT_SHA:0:8} + - echo "后端镜像推送完成" - - name: build-frontend-test - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 10m - script: - - echo "=== 测试环境 编译前端到 dist-test ===" - - cd /root/aiedu/frontend - - npm install --silent - - npm run build - - rm -rf /root/aiedu/dist-test/* - - cp -r dist/* /root/aiedu/dist-test/ - - echo "前端编译完成 dist-test" + # 构建并推送前端镜像 + - name: build-push-frontend + image: docker:dind + volumes: + - name: docker-sock + path: /var/run/docker.sock + environment: + DOCKER_REGISTRY: + from_secret: docker_registry + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password + commands: + - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin + - cd frontend + - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:test -f Dockerfile --build-arg VITE_API_BASE_URL=https://kpl.ireborn.com.cn . + - docker tag $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:test $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:${DRONE_COMMIT_SHA:0:8} + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:test + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:${DRONE_COMMIT_SHA:0:8} + - echo "前端镜像推送完成" - - name: deploy-backend - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 5m - script: - - echo "=== 测试环境 部署后端 ===" - - cp -r /root/aiedu/backend/app/* /root/aiedu/backend-test/app/ - - docker restart kpl-backend-dev - - sleep 5 - - docker ps | grep kpl- - - echo "=== 测试环境部署完成 ===" +volumes: + - name: docker-sock + host: + path: /var/run/docker.sock --- kind: pipeline type: docker -name: deploy-staging +name: build-and-push-staging -# 预生产环境:staging 分支触发,部署到 aiedu +# 预生产环境:staging 分支触发 trigger: branch: - staging @@ -75,71 +72,53 @@ trigger: - push steps: - - name: sync-code - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 5m - script: - - echo "=== 预生产 同步代码 ===" - - cd /root/aiedu - - git fetch cicd - - git checkout staging 2>/dev/null || git checkout -b staging cicd/staging - - git reset --hard cicd/staging - - echo "代码同步完成" + - name: build-push-backend + image: docker:dind + volumes: + - name: docker-sock + path: /var/run/docker.sock + environment: + DOCKER_REGISTRY: + from_secret: docker_registry + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password + commands: + - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin + - cd backend + - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-backend:staging -f Dockerfile . + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-backend:staging - - name: build-frontend-staging - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 10m - script: - - echo "=== 预生产 编译前端到 dist-staging ===" - - cd /root/aiedu/frontend - - npm install --silent - - npm run build - - rm -rf /root/aiedu/dist-staging/* - - cp -r dist/* /root/aiedu/dist-staging/ - - echo "前端编译完成 dist-staging" + - name: build-push-frontend + image: docker:dind + volumes: + - name: docker-sock + path: /var/run/docker.sock + environment: + DOCKER_REGISTRY: + from_secret: docker_registry + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password + commands: + - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin + - cd frontend + - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:staging -f Dockerfile --build-arg VITE_API_BASE_URL=https://aiedu.ireborn.com.cn . + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:staging - - name: deploy-backend - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 5m - script: - - echo "=== 预生产 部署后端 ===" - - cp -r /root/aiedu/backend/app/* /root/aiedu/backend-staging/app/ - - docker restart kaopeilian-backend - - sleep 5 - - docker ps | grep kaopeilian- - - echo "=== 预生产部署完成 ===" +volumes: + - name: docker-sock + host: + path: /var/run/docker.sock --- kind: pipeline type: docker -name: deploy-prod +name: build-and-push-prod -# 生产环境:main 分支触发,部署到所有租户 -# -# 使用方法: -# git commit -m "feat: xxx [all]" - 部署所有租户 -# git commit -m "feat: xxx [hua]" - 仅部署 hua -# git commit -m "feat: xxx [cxw,yy,hl]" - 部署指定多个租户 -# git commit -m "feat: xxx" - 默认部署所有租户 -# +# 生产环境:main 分支触发 trigger: branch: - main @@ -147,107 +126,47 @@ trigger: - push steps: - - name: sync-code-to-server - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 10m - script: - - echo "=== 生产 同步代码 ===" - - cd /root/aiedu - - git fetch cicd - - git reset --hard cicd/main - - echo "代码同步完成" - - - name: build-frontend-prod - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 10m - script: - - echo "=== 生产 编译前端到 dist-prod ===" - - cd /root/aiedu/frontend - - npm install --silent - - npm run build - - rm -rf /root/aiedu/dist-prod/* - - cp -r dist/* /root/aiedu/dist-prod/ - - echo "前端编译完成 dist-prod 所有生产租户已更新" - - - name: deploy-backend - image: appleboy/drone-ssh - settings: - host: 120.79.247.16 - username: root - password: - from_secret: prod_ssh_password - port: 22 - command_timeout: 15m - script: - - echo "=== 生产 部署后端 ===" - - | - # 同步后端代码到生产环境目录 - cp -r /root/aiedu/backend/app/* /root/aiedu/backend-prod/app/ - echo "后端代码已同步到生产目录" - - # 获取 commit message - COMMIT_MSG="${DRONE_COMMIT_MESSAGE}" - echo "Commit: $COMMIT_MSG" - - # 所有可用租户 - ALL_TENANTS="hua yy hl xy fw ex cxw" - - # 解析要部署的租户 - if echo "$COMMIT_MSG" | grep -q '\[all\]'; then - TENANTS="$ALL_TENANTS" - echo "部署所有租户: $TENANTS" - elif echo "$COMMIT_MSG" | grep -oP '\[\K[a-z,]+(?=\])' > /tmp/tenants.txt 2>/dev/null; then - TENANTS=$(cat /tmp/tenants.txt | tr ',' ' ') - echo "部署指定租户: $TENANTS" - else - TENANTS="$ALL_TENANTS" - echo "默认部署所有租户: $TENANTS" - fi - - # 重启指定租户的后端容器 - for t in $TENANTS; do - echo "重启 ${t}-backend ..." - docker restart ${t}-backend || echo "警告: ${t}-backend 不存在或重启失败" - done - - sleep 10 - docker ps | grep backend - echo "=== 生产 部署完成 ===" - echo "已更新租户: $TENANTS" - ---- -kind: pipeline -type: docker -name: code-check - -trigger: - event: - - push - - pull_request - -steps: - - name: python-lint - image: python:3.9-slim + - name: build-push-backend + image: docker:dind + volumes: + - name: docker-sock + path: /var/run/docker.sock + environment: + DOCKER_REGISTRY: + from_secret: docker_registry + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password commands: + - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin - cd backend - - pip install flake8 -q - - flake8 app --count --select=E9,F63,F7,F82 --show-source --statistics || true - - echo "Python lint completed" + - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-backend:main -f Dockerfile . + - docker tag $DOCKER_REGISTRY/ireborn/kaopeilian-backend:main $DOCKER_REGISTRY/ireborn/kaopeilian-backend:latest + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-backend:main + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-backend:latest - - name: frontend-check - image: node:18-alpine + - name: build-push-frontend + image: docker:dind + volumes: + - name: docker-sock + path: /var/run/docker.sock + environment: + DOCKER_REGISTRY: + from_secret: docker_registry + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password commands: + - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin - cd frontend - - echo "Frontend check completed" + - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:main -f Dockerfile --build-arg VITE_API_BASE_URL=https://hua.ireborn.com.cn . + - docker tag $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:main $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:latest + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:main + - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:latest + +volumes: + - name: docker-sock + host: + path: /var/run/docker.sock