refactor: 改造 CI/CD 使用阿里云 ACR 镜像仓库
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
yuliang_guo
2026-02-03 17:38:01 +08:00
parent ed47286955
commit 2f38a0b77a

View File

@@ -1,8 +1,8 @@
kind: pipeline kind: pipeline
type: docker type: docker
name: deploy-test name: build-and-push-test
# 测试环境test 分支触发,部署到 kpl # 测试环境test 分支触发,构建并推送到 ACR
trigger: trigger:
branch: branch:
- test - test
@@ -10,64 +10,61 @@ trigger:
- push - push
steps: steps:
- name: sync-code # 构建并推送后端镜像
image: appleboy/drone-ssh - name: build-push-backend
settings: image: docker:dind
host: 120.79.247.16 volumes:
username: root - name: docker-sock
password: path: /var/run/docker.sock
from_secret: prod_ssh_password environment:
port: 22 DOCKER_REGISTRY:
command_timeout: 5m from_secret: docker_registry
script: DOCKER_USERNAME:
- echo "=== 测试环境 同步代码 ===" from_secret: docker_username
- cd /root/aiedu DOCKER_PASSWORD:
- git fetch cicd from_secret: docker_password
- git checkout test 2>/dev/null || git checkout -b test cicd/test commands:
- git reset --hard cicd/test - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin
- echo "代码同步完成" - 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 - name: build-push-frontend
settings: image: docker:dind
host: 120.79.247.16 volumes:
username: root - name: docker-sock
password: path: /var/run/docker.sock
from_secret: prod_ssh_password environment:
port: 22 DOCKER_REGISTRY:
command_timeout: 10m from_secret: docker_registry
script: DOCKER_USERNAME:
- echo "=== 测试环境 编译前端到 dist-test ===" from_secret: docker_username
- cd /root/aiedu/frontend DOCKER_PASSWORD:
- npm install --silent from_secret: docker_password
- npm run build commands:
- rm -rf /root/aiedu/dist-test/* - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin
- cp -r dist/* /root/aiedu/dist-test/ - cd frontend
- echo "前端编译完成 dist-test" - 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 volumes:
image: appleboy/drone-ssh - name: docker-sock
settings: host:
host: 120.79.247.16 path: /var/run/docker.sock
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 "=== 测试环境部署完成 ==="
--- ---
kind: pipeline kind: pipeline
type: docker type: docker
name: deploy-staging name: build-and-push-staging
# 预生产环境staging 分支触发,部署到 aiedu # 预生产环境staging 分支触发
trigger: trigger:
branch: branch:
- staging - staging
@@ -75,71 +72,53 @@ trigger:
- push - push
steps: steps:
- name: sync-code - name: build-push-backend
image: appleboy/drone-ssh image: docker:dind
settings: volumes:
host: 120.79.247.16 - name: docker-sock
username: root path: /var/run/docker.sock
password: environment:
from_secret: prod_ssh_password DOCKER_REGISTRY:
port: 22 from_secret: docker_registry
command_timeout: 5m DOCKER_USERNAME:
script: from_secret: docker_username
- echo "=== 预生产 同步代码 ===" DOCKER_PASSWORD:
- cd /root/aiedu from_secret: docker_password
- git fetch cicd commands:
- git checkout staging 2>/dev/null || git checkout -b staging cicd/staging - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin
- git reset --hard cicd/staging - cd backend
- echo "代码同步完成" - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-backend:staging -f Dockerfile .
- docker push $DOCKER_REGISTRY/ireborn/kaopeilian-backend:staging
- name: build-frontend-staging - name: build-push-frontend
image: appleboy/drone-ssh image: docker:dind
settings: volumes:
host: 120.79.247.16 - name: docker-sock
username: root path: /var/run/docker.sock
password: environment:
from_secret: prod_ssh_password DOCKER_REGISTRY:
port: 22 from_secret: docker_registry
command_timeout: 10m DOCKER_USERNAME:
script: from_secret: docker_username
- echo "=== 预生产 编译前端到 dist-staging ===" DOCKER_PASSWORD:
- cd /root/aiedu/frontend from_secret: docker_password
- npm install --silent commands:
- npm run build - echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin
- rm -rf /root/aiedu/dist-staging/* - cd frontend
- cp -r dist/* /root/aiedu/dist-staging/ - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:staging -f Dockerfile --build-arg VITE_API_BASE_URL=https://aiedu.ireborn.com.cn .
- echo "前端编译完成 dist-staging" - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-frontend:staging
- name: deploy-backend volumes:
image: appleboy/drone-ssh - name: docker-sock
settings: host:
host: 120.79.247.16 path: /var/run/docker.sock
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 "=== 预生产部署完成 ==="
--- ---
kind: pipeline kind: pipeline
type: docker type: docker
name: deploy-prod name: build-and-push-prod
# 生产环境main 分支触发,部署到所有租户 # 生产环境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" - 默认部署所有租户
#
trigger: trigger:
branch: branch:
- main - main
@@ -147,107 +126,47 @@ trigger:
- push - push
steps: steps:
- name: sync-code-to-server - name: build-push-backend
image: appleboy/drone-ssh image: docker:dind
settings: volumes:
host: 120.79.247.16 - name: docker-sock
username: root path: /var/run/docker.sock
password: environment:
from_secret: prod_ssh_password DOCKER_REGISTRY:
port: 22 from_secret: docker_registry
command_timeout: 10m DOCKER_USERNAME:
script: from_secret: docker_username
- echo "=== 生产 同步代码 ===" DOCKER_PASSWORD:
- cd /root/aiedu from_secret: docker_password
- 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
commands: commands:
- echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin
- cd backend - cd backend
- pip install flake8 -q - docker build -t $DOCKER_REGISTRY/ireborn/kaopeilian-backend:main -f Dockerfile .
- flake8 app --count --select=E9,F63,F7,F82 --show-source --statistics || true - docker tag $DOCKER_REGISTRY/ireborn/kaopeilian-backend:main $DOCKER_REGISTRY/ireborn/kaopeilian-backend:latest
- echo "Python lint completed" - docker push $DOCKER_REGISTRY/ireborn/kaopeilian-backend:main
- docker push $DOCKER_REGISTRY/ireborn/kaopeilian-backend:latest
- name: frontend-check - name: build-push-frontend
image: node:18-alpine 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: commands:
- echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$DOCKER_USERNAME" --password-stdin
- cd frontend - 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