diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index 724306c..ca9e8c1 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -3,8 +3,8 @@ name: Build and Deploy Log Center on: push: branches: - - main - master + - dev jobs: build-and-deploy: @@ -13,6 +13,20 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Set environment by branch + run: | + if [[ "${{ github.ref_name }}" == "master" ]]; then + echo "CR_ORG=prod" >> $GITHUB_ENV + echo "DEPLOY_ENV=production" >> $GITHUB_ENV + echo "DOMAIN_API=qiyuan-log-center-api.airlabs.art" >> $GITHUB_ENV + echo "DOMAIN_WEB=qiyuan-log-center-web.airlabs.art" >> $GITHUB_ENV + elif [[ "${{ github.ref_name }}" == "dev" ]]; then + echo "CR_ORG=dev" >> $GITHUB_ENV + echo "DEPLOY_ENV=development" >> $GITHUB_ENV + echo "DOMAIN_API=qiyuan-log-center-api.test.airlabs.art" >> $GITHUB_ENV + echo "DOMAIN_WEB=qiyuan-log-center-web.test.airlabs.art" >> $GITHUB_ENV + fi + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 with: @@ -20,12 +34,12 @@ jobs: [registry."docker.io"] mirrors = ["https://docker.m.daocloud.io", "https://docker.1panel.live", "https://hub.rat.dev"] - - name: Login to Huawei Cloud SWR + - name: Login to Volcano Engine CR uses: docker/login-action@v2 with: - registry: ${{ secrets.SWR_SERVER }} - username: ${{ secrets.SWR_USERNAME }} - password: ${{ secrets.SWR_PASSWORD }} + registry: ${{ secrets.CR_SERVER }} + username: ${{ secrets.CR_USERNAME }} + password: ${{ secrets.CR_PASSWORD }} # Build API Image - name: Build and Push API @@ -35,7 +49,7 @@ jobs: docker buildx build \ --push \ --provenance=false \ - --tag ${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/log-center-api:latest \ + --tag ${{ secrets.CR_SERVER }}/${{ env.CR_ORG }}/log-center-api:latest \ -f ./Dockerfile \ . 2>&1 | tee /tmp/build-api.log @@ -47,8 +61,8 @@ jobs: docker buildx build \ --push \ --provenance=false \ - --build-arg VITE_API_BASE_URL=https://qiyuan-log-center-api.airlabs.art \ - --tag ${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/log-center-web:latest \ + --build-arg VITE_API_BASE_URL=https://${{ env.DOMAIN_API }} \ + --tag ${{ secrets.CR_SERVER }}/${{ env.CR_ORG }}/log-center-web:latest \ -f ./web/Dockerfile \ ./web 2>&1 | tee /tmp/build-web.log @@ -60,7 +74,7 @@ jobs: docker buildx build \ --push \ --provenance=false \ - --tag ${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/k8s-pod-monitor:latest \ + --tag ${{ secrets.CR_SERVER }}/${{ env.CR_ORG }}/k8s-pod-monitor:latest \ -f ./k8s-monitor/Dockerfile \ ./k8s-monitor 2>&1 | tee /tmp/build-monitor.log @@ -70,21 +84,34 @@ jobs: 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: Set kubeconfig + run: | + mkdir -p $HOME/.kube + if [[ "${{ github.ref_name }}" == "master" ]]; then + echo "${{ secrets.VOLCANO_PROD_KUBE_CONFIG }}" > $HOME/.kube/config + elif [[ "${{ github.ref_name }}" == "dev" ]]; then + echo "${{ secrets.VOLCANO_TEST_KUBE_CONFIG }}" > $HOME/.kube/config + fi + chmod 600 $HOME/.kube/config - - name: Update K8s Manifests + - name: Deploy to K3s id: deploy run: | - echo "Environment: Production" + echo "Environment: ${{ env.DEPLOY_ENV }}" + echo "API Domain: ${{ env.DOMAIN_API }}" + echo "Web Domain: ${{ env.DOMAIN_WEB }}" # Replace image placeholders - sed -i "s|\${CI_REGISTRY_IMAGE}/log-center-api:latest|${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/log-center-api:latest|g" k8s/api-deployment-prod.yaml - sed -i "s|\${CI_REGISTRY_IMAGE}/log-center-web:latest|${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/log-center-web:latest|g" k8s/web-deployment-prod.yaml - sed -i "s|\${CI_REGISTRY_IMAGE}/k8s-pod-monitor:latest|${{ secrets.SWR_SERVER }}/${{ secrets.SWR_ORG }}/k8s-pod-monitor:latest|g" k8s/monitor-cronjob.yaml + sed -i "s|\${CI_REGISTRY_IMAGE}/log-center-api:latest|${{ secrets.CR_SERVER }}/${{ env.CR_ORG }}/log-center-api:latest|g" k8s/api-deployment-prod.yaml + sed -i "s|\${CI_REGISTRY_IMAGE}/log-center-web:latest|${{ secrets.CR_SERVER }}/${{ env.CR_ORG }}/log-center-web:latest|g" k8s/web-deployment-prod.yaml + sed -i "s|\${CI_REGISTRY_IMAGE}/k8s-pod-monitor:latest|${{ secrets.CR_SERVER }}/${{ env.CR_ORG }}/k8s-pod-monitor:latest|g" k8s/monitor-cronjob.yaml + + # Replace domain placeholders in ingress + sed -i "s|qiyuan-log-center-api.airlabs.art|${{ env.DOMAIN_API }}|g" k8s/ingress.yaml + sed -i "s|qiyuan-log-center-web.airlabs.art|${{ env.DOMAIN_WEB }}|g" k8s/ingress.yaml + + # Replace LOG_CENTER_URL in monitor + sed -i "s|https://qiyuan-log-center-api.airlabs.art|https://${{ env.DOMAIN_API }}|g" k8s/monitor-cronjob.yaml # Apply configurations and capture output set -o pipefail @@ -153,11 +180,11 @@ jobs: ERROR_TYPE="DockerBuildError" fi - curl -s -X POST "https://qiyuan-log-center-api.airlabs.art/api/v1/logs/report" \ + curl -s -X POST "https://${{ env.DOMAIN_API }}/api/v1/logs/report" \ -H "Content-Type: application/json" \ -d "{ \"project_id\": \"${PROJECT_ID}\", - \"environment\": \"${{ github.ref_name }}\", + \"environment\": \"${{ env.DEPLOY_ENV }}\", \"level\": \"ERROR\", \"source\": \"${SOURCE}\", \"commit_hash\": \"${{ github.sha }}\", diff --git a/app/database.py b/app/database.py index 79b26c9..e59525d 100644 --- a/app/database.py +++ b/app/database.py @@ -11,10 +11,10 @@ load_dotenv() DB_USER = os.getenv("DB_USER") DB_PASSWORD = os.getenv("DB_PASSWORD") DB_HOST = os.getenv("DB_HOST") -DB_PORT = os.getenv("DB_PORT", "5432") +DB_PORT = os.getenv("DB_PORT", "3306") DB_NAME = os.getenv("DB_NAME") -DATABASE_URL = f"postgresql+asyncpg://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" +DATABASE_URL = f"mysql+aiomysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}?charset=utf8mb4" _engine = None @@ -57,9 +57,9 @@ async def init_db(): "ALTER TABLE repairtask ADD COLUMN IF NOT EXISTS failure_reason TEXT", # Log source support "ALTER TABLE errorlog ADD COLUMN IF NOT EXISTS source VARCHAR(20) DEFAULT 'runtime'", - "ALTER TABLE errorlog ALTER COLUMN file_path DROP NOT NULL", - "ALTER TABLE errorlog ALTER COLUMN line_number DROP NOT NULL", - "CREATE INDEX IF NOT EXISTS ix_errorlog_source ON errorlog (source)", + "ALTER TABLE errorlog MODIFY COLUMN file_path VARCHAR(255) NULL", + "ALTER TABLE errorlog MODIFY COLUMN line_number INTEGER NULL", + "CREATE INDEX ix_errorlog_source ON errorlog (source)", # ErrorLog failure_reason "ALTER TABLE errorlog ADD COLUMN IF NOT EXISTS failure_reason TEXT", # Bug severity (1-10 AI评估等级) diff --git a/app/main.py b/app/main.py index 54275e2..10fe224 100644 --- a/app/main.py +++ b/app/main.py @@ -328,9 +328,9 @@ async def get_repair_reports( if project_id: query = query.where(RepairTask.project_id == project_id) if error_log_id: - # PostgreSQL JSONB contains: error_log_ids @> '[28]' + # MySQL JSON contains query = query.where( - text(f"error_log_ids @> '{json.dumps([error_log_id])}'::jsonb") + text(f"JSON_CONTAINS(error_log_ids, '{json.dumps([error_log_id])}')") ) offset = (page - 1) * page_size diff --git a/requirements.txt b/requirements.txt index 6e5eaaa..8ed21df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ fastapi uvicorn[standard] sqlmodel -psycopg2-binary -asyncpg +aiomysql +pymysql python-dotenv httpx