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 id: build run: | set -o pipefail docker buildx build \ --push \ --provenance=false \ --tag ${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/rtc-backend:latest \ . 2>&1 | tee /tmp/build.log - name: Build and Push HW WebSocket Service run: | set -o pipefail docker buildx build \ --push \ --provenance=false \ --tag ${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/hw-ws-service:latest \ ./hw_service_go 2>&1 | tee -a /tmp/build.log - name: Setup Kubectl run: | curl -LO "https://dl.k8s.io/release/v1.28.2/bin/linux/amd64/kubectl" || \ curl -LO "https://cdn.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 id: deploy 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 sed -i "s|\${CI_REGISTRY_IMAGE}/hw-ws-service:latest|${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/hw-ws-service:latest|g" hw_service_go/k8s/deployment.yaml # 3. 应用配置并捕获输出 set -o pipefail { kubectl apply -f $DEPLOY_FILE kubectl apply -f $INGRESS_FILE kubectl apply -f hw_service_go/k8s/deployment.yaml kubectl apply -f hw_service_go/k8s/service.yaml kubectl rollout restart deployment/$DEPLOY_NAME kubectl rollout restart deployment/hw-ws-service } 2>&1 | tee /tmp/deploy.log - name: Report failure to Log Center if: failure() run: | # 收集构建和部署日志(取最后 50 行) BUILD_LOG="" DEPLOY_LOG="" FAILED_STEP="unknown" if [ -f /tmp/build.log ]; then BUILD_LOG=$(tail -50 /tmp/build.log | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') FAILED_STEP="build" fi if [ -f /tmp/deploy.log ]; then DEPLOY_LOG=$(tail -50 /tmp/deploy.log | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') if [ -n "$DEPLOY_LOG" ]; then FAILED_STEP="deploy" fi fi # 如果构建日志为空(action 级别失败),标记步骤 if [ -z "$BUILD_LOG" ] && [ -z "$DEPLOY_LOG" ]; then BUILD_LOG="No captured output. Check Gitea Actions UI for details." FAILED_STEP="pre-build" fi ERROR_LOG="${BUILD_LOG}${DEPLOY_LOG}" curl -s -X POST "https://qiyuan-log-center-api.airlabs.art/api/v1/logs/report" \ -H "Content-Type: application/json" \ -d "{ \"project_id\": \"rtc_backend\", \"environment\": \"${{ github.ref_name }}\", \"level\": \"ERROR\", \"source\": \"cicd\", \"commit_hash\": \"${{ github.sha }}\", \"repo_url\": \"https://gitea.airlabs.art/zyc/rtc_backend.git\", \"error\": { \"type\": \"CICDFailure\", \"message\": \"[${FAILED_STEP}] Build and Deploy failed on branch ${{ github.ref_name }}\", \"stack_trace\": [\"${ERROR_LOG}\"] }, \"context\": { \"job_name\": \"build-and-deploy\", \"step_name\": \"${FAILED_STEP}\", \"workflow\": \"${{ github.workflow }}\", \"run_id\": \"${{ github.run_id }}\", \"branch\": \"${{ github.ref_name }}\", \"actor\": \"${{ github.actor }}\", \"commit\": \"${{ github.sha }}\" } }" || true