From 7a9d805de9d559e53e1af985287a9f3a6925c91b Mon Sep 17 00:00:00 2001 From: zyc <1439655764@qq.com> Date: Tue, 7 Apr 2026 15:54:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=90=88=E5=B9=B6CI=E4=B8=BA?= =?UTF-8?q?=E5=8D=95=E6=96=87=E4=BB=B6deploy.yaml=EF=BC=8C=E4=B8=8Ejimeng-?= =?UTF-8?q?clone=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 合并 deploy-web.yaml + deploy-backend.yaml → deploy.yaml - 一次构建同时打包 backend 和 web 镜像 - 一次部署同时更新所有 k8s 资源 Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitea/workflows/deploy-web.yaml | 177 ------------------ .../{deploy-backend.yaml => deploy.yaml} | 33 +++- 2 files changed, 28 insertions(+), 182 deletions(-) delete mode 100644 .gitea/workflows/deploy-web.yaml rename .gitea/workflows/{deploy-backend.yaml => deploy.yaml} (83%) diff --git a/.gitea/workflows/deploy-web.yaml b/.gitea/workflows/deploy-web.yaml deleted file mode 100644 index ad10ee0..0000000 --- a/.gitea/workflows/deploy-web.yaml +++ /dev/null @@ -1,177 +0,0 @@ -name: Build and Deploy Web - -on: - push: - branches: - - master - - dev - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - run: | - git clone --depth=1 --branch=${{ github.ref_name }} https://gitea.airlabs.art/${{ github.repository }}.git . - - - name: Set environment by branch - run: | - SHORT_SHA=$(echo "${{ github.sha }}" | cut -c1-7) - BUILD_DATE=$(date +%Y%m%d) - - if [[ "${{ github.ref_name }}" == "master" ]]; then - echo "IMAGE_TAG=prod-${BUILD_DATE}-${SHORT_SHA}" >> $GITHUB_ENV - echo "CR_SERVER_ACTIVE=gitea-prod-cn-shanghai.cr.volces.com" >> $GITHUB_ENV - echo "CR_USERNAME_ACTIVE=seaislee@76339115" >> $GITHUB_ENV - echo "CR_PASSWORD_ACTIVE=${{ secrets.CR_PROD_PASSWORD }}" >> $GITHUB_ENV - echo "CR_ORG=prod" >> $GITHUB_ENV - echo "DEPLOY_ENV=production" >> $GITHUB_ENV - elif [[ "${{ github.ref_name }}" == "dev" ]]; then - echo "IMAGE_TAG=dev-${BUILD_DATE}-${SHORT_SHA}" >> $GITHUB_ENV - echo "CR_SERVER_ACTIVE=${{ secrets.CR_SERVER }}" >> $GITHUB_ENV - echo "CR_USERNAME_ACTIVE=${{ secrets.CR_USERNAME }}" >> $GITHUB_ENV - echo "CR_PASSWORD_ACTIVE=${{ secrets.CR_PASSWORD }}" >> $GITHUB_ENV - echo "CR_ORG=dev" >> $GITHUB_ENV - echo "DEPLOY_ENV=development" >> $GITHUB_ENV - fi - - - name: Login to Container Registry - run: | - echo "${{ env.CR_PASSWORD_ACTIVE }}" | docker login --username "${{ env.CR_USERNAME_ACTIVE }}" --password-stdin ${{ env.CR_SERVER_ACTIVE }} - - - name: Build and Push Web - id: build_web - run: | - set -o pipefail - for attempt in 1 2 3; do - echo "Build web attempt $attempt/3..." - DOCKER_BUILDKIT=0 docker build \ - --tag ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/airlabs-manage-web:${{ env.IMAGE_TAG }} \ - --tag ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/airlabs-manage-web:latest \ - ./frontend 2>&1 | tee /tmp/build.log && break - echo "Attempt $attempt failed, retrying in 10s..." && sleep 10 - done - for attempt in 1 2 3; do - docker push ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/airlabs-manage-web:${{ env.IMAGE_TAG }} && \ - docker push ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/airlabs-manage-web:latest && break - echo "Push attempt $attempt failed, retrying in 10s..." && sleep 10 - done - - - name: Setup Kubectl - run: | - if ! command -v kubectl &>/dev/null; then - for attempt in 1 2 3; do - curl -LO "https://files.m.daocloud.io/dl.k8s.io/release/v1.28.0/bin/linux/amd64/kubectl" && break - echo "Download attempt $attempt failed, retrying in 5s..." && sleep 5 - done - chmod +x kubectl && mv kubectl /usr/bin/kubectl - fi - kubectl version --client - - - name: Set kubeconfig - run: | - mkdir -p $HOME/.kube - if [[ "${{ github.ref_name }}" == "master" ]]; then - printf '%s\n' '${{ secrets.VOLCANO_PROD_KUBE_CONFIG }}' > $HOME/.kube/config - elif [[ "${{ github.ref_name }}" == "dev" ]]; then - printf '%s\n' '${{ secrets.VOLCANO_TEST_KUBE_CONFIG }}' > $HOME/.kube/config - fi - chmod 600 $HOME/.kube/config - echo "kubeconfig lines: $(wc -l < $HOME/.kube/config)" - grep server $HOME/.kube/config || echo "WARNING: no server found in kubeconfig" - - - name: Deploy to K3s - id: deploy - run: | - echo "Environment: ${{ env.DEPLOY_ENV }}" - CR_IMAGE="${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}" - - # Replace image placeholders - sed -i "s|\${CI_REGISTRY_IMAGE}/web:latest|${CR_IMAGE}/airlabs-manage-web:${{ env.IMAGE_TAG }}|g" k8s/web-deployment-prod.yaml - - for attempt in 1 2 3; do - echo "Deploy attempt $attempt/3..." - { - # Create/update image pull secret - kubectl create secret docker-registry cr-pull-secret \ - --docker-server="${{ env.CR_SERVER_ACTIVE }}" \ - --docker-username="${{ env.CR_USERNAME_ACTIVE }}" \ - --docker-password="${{ env.CR_PASSWORD_ACTIVE }}" \ - --dry-run=client -o yaml | kubectl apply -f - - - kubectl apply -f k8s/cert-manager-issuer.yaml - kubectl apply -f k8s/web-deployment-prod.yaml - kubectl apply -f k8s/web-ingress.yaml - - kubectl rollout restart deployment/airlabs-manage-web - } 2>&1 | tee /tmp/deploy.log && break - echo "Attempt $attempt failed, retrying in 10s..." - sleep 10 - done - - - name: Report failure to Log Center - if: failure() - run: | - BUILD_LOG="" - DEPLOY_LOG="" - FAILED_STEP="unknown" - - if [[ "${{ steps.build_web.outcome }}" == "failure" ]]; then - FAILED_STEP="build" - if [ -f /tmp/build.log ]; then - BUILD_LOG=$(tail -50 /tmp/build.log | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') - fi - elif [[ "${{ steps.deploy.outcome }}" == "failure" ]]; then - FAILED_STEP="deploy" - if [ -f /tmp/deploy.log ]; then - DEPLOY_LOG=$(tail -50 /tmp/deploy.log | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') - fi - fi - - ERROR_LOG="${BUILD_LOG}${DEPLOY_LOG}" - if [ -z "$ERROR_LOG" ]; then - ERROR_LOG="No captured output. Check Gitea Actions UI for details." - fi - - if [[ "$FAILED_STEP" == "deploy" ]]; then - SOURCE="deployment" - ERROR_TYPE="DeployError" - else - SOURCE="cicd" - ERROR_TYPE="DockerBuildError" - fi - - curl -s -X POST "https://qiyuan-log-center-api.airlabs.art/api/v1/logs/report" \ - -H "Content-Type: application/json" \ - -d "{ - \"project_id\": \"airlabs_manage_web\", - \"environment\": \"${{ env.DEPLOY_ENV }}\", - \"level\": \"ERROR\", - \"source\": \"${SOURCE}\", - \"commit_hash\": \"${{ github.sha }}\", - \"repo_url\": \"https://gitea.airlabs.art/${{ github.repository }}.git\", - \"error\": { - \"type\": \"${ERROR_TYPE}\", - \"message\": \"[${FAILED_STEP}] Build and Deploy Web 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_number }}\", - \"branch\": \"${{ github.ref_name }}\", - \"actor\": \"${{ github.actor }}\", - \"commit\": \"${{ github.sha }}\", - \"run_url\": \"https://gitea.airlabs.art/${{ github.repository }}/actions/runs/${{ github.run_number }}\" - } - }" || true - - - name: Docker Cleanup - if: always() - run: | - docker container prune -f - docker image prune -f - docker builder prune -a -f - echo "Disk usage after cleanup:" - df -h / | tail -1 diff --git a/.gitea/workflows/deploy-backend.yaml b/.gitea/workflows/deploy.yaml similarity index 83% rename from .gitea/workflows/deploy-backend.yaml rename to .gitea/workflows/deploy.yaml index c084c09..7238a3b 100644 --- a/.gitea/workflows/deploy-backend.yaml +++ b/.gitea/workflows/deploy.yaml @@ -1,4 +1,4 @@ -name: Build and Deploy Backend +name: Build and Deploy on: push: @@ -35,7 +35,7 @@ jobs: echo "DEPLOY_ENV=development" >> $GITHUB_ENV fi - - name: Login to Container Registry + - name: Login to Volcano Engine CR run: | echo "${{ env.CR_PASSWORD_ACTIVE }}" | docker login --username "${{ env.CR_USERNAME_ACTIVE }}" --password-stdin ${{ env.CR_SERVER_ACTIVE }} @@ -57,6 +57,24 @@ jobs: echo "Push attempt $attempt failed, retrying in 10s..." && sleep 10 done + - name: Build and Push Web + id: build_web + run: | + set -o pipefail + for attempt in 1 2 3; do + echo "Build web attempt $attempt/3..." + DOCKER_BUILDKIT=0 docker build \ + --tag ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/airlabs-manage-web:${{ env.IMAGE_TAG }} \ + --tag ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/airlabs-manage-web:latest \ + ./frontend 2>&1 | tee -a /tmp/build.log && break + echo "Attempt $attempt failed, retrying in 10s..." && sleep 10 + done + for attempt in 1 2 3; do + docker push ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/airlabs-manage-web:${{ env.IMAGE_TAG }} && \ + docker push ${{ env.CR_SERVER_ACTIVE }}/${{ env.CR_ORG }}/airlabs-manage-web:latest && break + echo "Push attempt $attempt failed, retrying in 10s..." && sleep 10 + done + - name: Setup Kubectl run: | if ! command -v kubectl &>/dev/null; then @@ -88,6 +106,7 @@ jobs: # Replace image placeholders sed -i "s|\${CI_REGISTRY_IMAGE}/backend:latest|${CR_IMAGE}/airlabs-manage-backend:${{ env.IMAGE_TAG }}|g" k8s/backend-deployment-prod.yaml + sed -i "s|\${CI_REGISTRY_IMAGE}/web:latest|${CR_IMAGE}/airlabs-manage-web:${{ env.IMAGE_TAG }}|g" k8s/web-deployment-prod.yaml for attempt in 1 2 3; do echo "Deploy attempt $attempt/3..." @@ -99,11 +118,15 @@ jobs: --docker-password="${{ env.CR_PASSWORD_ACTIVE }}" \ --dry-run=client -o yaml | kubectl apply -f - + # Apply manifests kubectl apply -f k8s/cert-manager-issuer.yaml kubectl apply -f k8s/backend-deployment-prod.yaml kubectl apply -f k8s/backend-ingress.yaml + kubectl apply -f k8s/web-deployment-prod.yaml + kubectl apply -f k8s/web-ingress.yaml kubectl rollout restart deployment/airlabs-manage-backend + kubectl rollout restart deployment/airlabs-manage-web } 2>&1 | tee /tmp/deploy.log && break echo "Attempt $attempt failed, retrying in 10s..." sleep 10 @@ -116,7 +139,7 @@ jobs: DEPLOY_LOG="" FAILED_STEP="unknown" - if [[ "${{ steps.build_backend.outcome }}" == "failure" ]]; then + if [[ "${{ steps.build_backend.outcome }}" == "failure" || "${{ steps.build_web.outcome }}" == "failure" ]]; then FAILED_STEP="build" if [ -f /tmp/build.log ]; then BUILD_LOG=$(tail -50 /tmp/build.log | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g') @@ -144,7 +167,7 @@ jobs: curl -s -X POST "https://qiyuan-log-center-api.airlabs.art/api/v1/logs/report" \ -H "Content-Type: application/json" \ -d "{ - \"project_id\": \"airlabs_manage_backend\", + \"project_id\": \"airlabs_manage\", \"environment\": \"${{ env.DEPLOY_ENV }}\", \"level\": \"ERROR\", \"source\": \"${SOURCE}\", @@ -152,7 +175,7 @@ jobs: \"repo_url\": \"https://gitea.airlabs.art/${{ github.repository }}.git\", \"error\": { \"type\": \"${ERROR_TYPE}\", - \"message\": \"[${FAILED_STEP}] Build and Deploy Backend failed on branch ${{ github.ref_name }}\", + \"message\": \"[${FAILED_STEP}] Build and Deploy failed on branch ${{ github.ref_name }}\", \"stack_trace\": [\"${ERROR_LOG}\"] }, \"context\": {