All checks were successful
Build and Deploy Backend / build-and-deploy (push) Successful in 3m11s
DaoCloud mirror returns 404 for kubectl v1.28.2, causing Setup Kubectl step to hang. Use official dl.k8s.io with cdn.dl.k8s.io as fallback. Also update pinned dependency versions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
131 lines
4.5 KiB
YAML
131 lines
4.5 KiB
YAML
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: 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
|
||
|
||
# 3. 应用配置并捕获输出
|
||
set -o pipefail
|
||
{
|
||
kubectl apply -f $DEPLOY_FILE
|
||
kubectl apply -f $INGRESS_FILE
|
||
kubectl rollout restart deployment/$DEPLOY_NAME
|
||
} 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
|