From ded5be6a05480173b8a14b9f60f81889726cfd58 Mon Sep 17 00:00:00 2001 From: zyc <1439655764@qq.com> Date: Thu, 29 Jan 2026 15:16:20 +0800 Subject: [PATCH] add build test --- .gitea/workflows/deploy.yaml | 73 ++++++++++++++++++++++++++++ Dockerfile | 29 ++++++++++++ k8s/backend-deployment-dev.yaml | 81 ++++++++++++++++++++++++++++++++ k8s/backend-deployment-prod.yaml | 81 ++++++++++++++++++++++++++++++++ k8s/ingress-dev.yaml | 18 +++++++ k8s/ingress.yaml | 18 +++++++ 6 files changed, 300 insertions(+) create mode 100644 .gitea/workflows/deploy.yaml create mode 100644 Dockerfile create mode 100644 k8s/backend-deployment-dev.yaml create mode 100644 k8s/backend-deployment-prod.yaml create mode 100644 k8s/ingress-dev.yaml create mode 100644 k8s/ingress.yaml diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml new file mode 100644 index 0000000..ec898d4 --- /dev/null +++ b/.gitea/workflows/deploy.yaml @@ -0,0 +1,73 @@ +name: Build and Deploy Backend + +on: + push: + branches: + - main + - master + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + config-inline: | + [registry."docker.io"] + mirrors = ["https://docker.m.daocloud.io", "https://docker.1panel.live", "https://hub.rat.dev"] + + - name: Login to Huawei Cloud SWR + uses: docker/login-action@v2 + with: + registry: ${{ secrets.SWR_SERVER }} + username: ${{ secrets.SWR_USERNAME }} + password: ${{ secrets.SWR_PASSWORD }} + + - name: Build and Push Backend + uses: docker/build-push-action@v4 + with: + context: . + push: true + provenance: false + tags: ${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/rtc-backend:latest + + - name: Setup Kubectl + run: | + curl -LO "https://files.m.daocloud.io/dl.k8s.io/release/v1.28.2/bin/linux/amd64/kubectl" + chmod +x kubectl + mv kubectl /usr/local/bin/ + + - name: Deploy to K3s + uses: Azure/k8s-set-context@v3 + with: + method: kubeconfig + kubeconfig: ${{ secrets.KUBE_CONFIG }} + + - name: Update K8s Manifests + run: | + # 1. 判断分支,决定使用哪个配置文件 + if [[ "${{ github.ref_name }}" == "main" || "${{ github.ref_name }}" == "master" ]]; then + echo "Environment: Production" + DEPLOY_FILE="k8s/backend-deployment-prod.yaml" + INGRESS_FILE="k8s/ingress.yaml" + DEPLOY_NAME="rtc-backend" + else + echo "Environment: Development" + DEPLOY_FILE="k8s/backend-deployment-dev.yaml" + INGRESS_FILE="k8s/ingress-dev.yaml" + DEPLOY_NAME="rtc-backend-dev" + fi + + # 2. 替换镜像地址 + sed -i "s|\${CI_REGISTRY_IMAGE}/backend:latest|${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/rtc-backend:latest|g" $DEPLOY_FILE + + # 3. 应用配置 + # kubectl apply -f k8s/redis-deployment.yaml (Cloud Redis used, skipping) + kubectl apply -f $DEPLOY_FILE + kubectl apply -f $INGRESS_FILE + + kubectl rollout restart deployment/$DEPLOY_NAME diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2a0efad --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# Use an official Python runtime as a parent image +FROM python:3.12-slim + +# Set environment variables +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +# Set work directory +WORKDIR /app + +# Install system dependencies +RUN apt-get update && apt-get install -y \ + gcc \ + default-libmysqlclient-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +# Install python dependencies +COPY requirements.txt /app/ +RUN pip install --upgrade pip && pip install -r requirements.txt && pip install gunicorn + +# Copy project +COPY . /app/ + +# Expose port +EXPOSE 8000 + +# Run entrypoint +CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi:application"] diff --git a/k8s/backend-deployment-dev.yaml b/k8s/backend-deployment-dev.yaml new file mode 100644 index 0000000..e6cb440 --- /dev/null +++ b/k8s/backend-deployment-dev.yaml @@ -0,0 +1,81 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rtc-backend-dev + labels: + app: rtc-backend-dev +spec: + replicas: 1 # 测试环境通常 1 个副本就够了 + selector: + matchLabels: + app: rtc-backend-dev + template: + metadata: + labels: + app: rtc-backend-dev + spec: + containers: + - name: rtc-backend + image: ${CI_REGISTRY_IMAGE}/backend:latest + imagePullPolicy: Always + ports: + - containerPort: 8000 + env: + # Database (Test Environment) + - name: DB_HOST + value: "test-mysql-host" # <--- 请填入测试环境数据库 IP + - name: DB_NAME + value: "rtc_test" # <--- 测试数据库名 + - name: DB_USER + value: "test_user" + - name: DB_PASSWORD + value: "test_password" + - name: DB_PORT + value: "3306" + + # Redis (Test Environment) + - name: REDIS_URL + value: "redis://:password@test-redis-host:6379/1" # <--- 测试环境 Redis + + # Aliyun OSS (Test) + - name: OSS_ACCESS_KEY_ID + value: "test_key" + - name: OSS_ACCESS_KEY_SECRET + value: "test_secret" + - name: OSS_BUCKET_NAME + value: "qy-rtc" + - name: OSS_ENDPOINT + value: "oss-cn-beijing.aliyuncs.com" + - name: OSS_CUSTOM_DOMAIN + value: "" + + # Aliyun Log (If used by app) + - name: ALIYUN_LOG_PROJECT + value: "toy" + - name: ALIYUN_LOG_STORE + value: "rtc" + - name: ALIYUN_LOG_ENDPOINT + value: "cn-guangzhou.log.aliyuncs.com" + - name: ALIYUN_LOG_ACCESS_KEY_ID + value: "LTAI5tBGAkR2rra2prTAX9yc" + - name: ALIYUN_LOG_ACCESS_KEY_SECRET + value: "U1z3d0p5saPRD5sCxVooJYSjxSAmKB" + resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "1024Mi" + cpu: "1000m" +--- +apiVersion: v1 +kind: Service +metadata: + name: rtc-backend-dev +spec: + selector: + app: rtc-backend-dev + ports: + - protocol: TCP + port: 8000 + targetPort: 8000 diff --git a/k8s/backend-deployment-prod.yaml b/k8s/backend-deployment-prod.yaml new file mode 100644 index 0000000..ea78328 --- /dev/null +++ b/k8s/backend-deployment-prod.yaml @@ -0,0 +1,81 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rtc-backend + labels: + app: rtc-backend +spec: + replicas: 1 + selector: + matchLabels: + app: rtc-backend + template: + metadata: + labels: + app: rtc-backend + spec: + containers: + - name: rtc-backend + image: ${CI_REGISTRY_IMAGE}/backend:latest + imagePullPolicy: Always + ports: + - containerPort: 8000 + env: + # Database + - name: DB_HOST + value: "rm-7xv1uaw910558p1788o.mysql.rds.aliyuncs.com" + - name: DB_NAME + value: "rtc" + - name: DB_USER + value: "rtc" + - name: DB_PASSWORD + value: "JogNQdtrd3WY8CBCAiYfYEGx" + - name: DB_PORT + value: "3306" + + # Redis + - name: REDIS_URL + value: "redis://:vAhRnAA6VMco@r-7xvat0vez5clwbzk5vpd.redis.rds.aliyuncs.com:6379/8" + + # Aliyun OSS + - name: OSS_ACCESS_KEY_ID + value: "LTAI5tBGAkR2rra2prTAX9yc" + - name: OSS_ACCESS_KEY_SECRET + value: "U1z3d0p5saPRD5sCxVooJYSjxSAmKB" + - name: OSS_BUCKET_NAME + value: "qy-rtc" + - name: OSS_ENDPOINT + value: "oss-cn-beijing.aliyuncs.com" + - name: OSS_CUSTOM_DOMAIN + value: "" + + # Aliyun Log (If used by app) + - name: ALIYUN_LOG_PROJECT + value: "toy" + - name: ALIYUN_LOG_STORE + value: "rtc" + - name: ALIYUN_LOG_ENDPOINT + value: "cn-guangzhou.log.aliyuncs.com" + - name: ALIYUN_LOG_ACCESS_KEY_ID + value: "LTAI5tBGAkR2rra2prTAX9yc" + - name: ALIYUN_LOG_ACCESS_KEY_SECRET + value: "U1z3d0p5saPRD5sCxVooJYSjxSAmKB" + resources: + requests: + memory: "256Mi" + cpu: "250m" + limits: + memory: "1024Mi" + cpu: "1000m" +--- +apiVersion: v1 +kind: Service +metadata: + name: rtc-backend +spec: + selector: + app: rtc-backend + ports: + - protocol: TCP + port: 8000 + targetPort: 8000 diff --git a/k8s/ingress-dev.yaml b/k8s/ingress-dev.yaml new file mode 100644 index 0000000..3f94ca2 --- /dev/null +++ b/k8s/ingress-dev.yaml @@ -0,0 +1,18 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: rtc-backend-ingress-dev + annotations: + kubernetes.io/ingress.class: "traefik" +spec: + rules: + - host: qiyuan-rtc-dev-api.airlabs.art + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: rtc-backend-dev + port: + number: 8000 diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml new file mode 100644 index 0000000..849d1a7 --- /dev/null +++ b/k8s/ingress.yaml @@ -0,0 +1,18 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: rtc-backend-ingress + annotations: + kubernetes.io/ingress.class: "traefik" +spec: + rules: + - host: qiyuan-rtc-api.airlabs.art + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: rtc-backend + port: + number: 8000