diff --git a/.gitea/workflows/ci-cd.yaml b/.gitea/workflows/ci-cd.yaml new file mode 100644 index 0000000..eac3e43 --- /dev/null +++ b/.gitea/workflows/ci-cd.yaml @@ -0,0 +1,233 @@ +name: CI-CD-AKS-Agent + +on: + push: + branches: ["main"] + workflow_dispatch: + +jobs: + build_and_deploy: + runs-on: self-hosted + + env: + ACR_LOGIN_SERVER: ${{ secrets.ACR_LOGIN_SERVER }} + ACR_USERNAME: ${{ secrets.ACR_USERNAME }} + ACR_PASSWORD: ${{ secrets.ACR_PASSWORD }} + AZ_CLIENT_ID: ${{ secrets.AZ_CLIENT_ID }} + AZ_CLIENT_SECRET: ${{ secrets.AZ_CLIENT_SECRET }} + AZ_TENANT_ID: ${{ secrets.AZ_TENANT_ID }} + AZ_SUBSCRIPTION_ID: ${{ secrets.AZ_SUBSCRIPTION_ID }} + AZ_RG: ${{ secrets.AZ_RG }} + AZ_AKS: ${{ secrets.AZ_AKS }} + AZURE_DNS_ZONE: ${{ secrets.AZURE_DNS_ZONE }} + AZURE_DNS_RG: ${{ secrets.AZURE_DNS_RG }} + + steps: + - uses: actions/checkout@v4 + + - name: Install Azure CLI + run: | + if ! command -v az &> /dev/null; then + curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash + fi + + - name: Install kubectl + run: | + if ! command -v kubectl &> /dev/null; then + ARCH=$(uname -m) + case $ARCH in + x86_64) ARCH="amd64" ;; + aarch64|arm64) ARCH="arm64" ;; + esac + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/${ARCH}/kubectl" + sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl + rm kubectl + fi + + - name: Build Docker image (ARM64) + run: | + docker build -t $ACR_LOGIN_SERVER/ai-agents/123jinaitool-887a89:${{ github.sha }} . + docker tag $ACR_LOGIN_SERVER/ai-agents/123jinaitool-887a89:${{ github.sha }} $ACR_LOGIN_SERVER/ai-agents/123jinaitool-887a89:latest + + - name: Debug Secrets + run: | + echo "ACR_LOGIN_SERVER=$ACR_LOGIN_SERVER" + echo "ACR_USERNAME=$ACR_USERNAME" + echo "ACR_PASSWORD length=$(echo -n "$ACR_PASSWORD" | wc -c)" + if [ -z "$ACR_PASSWORD" ]; then echo "ERROR: ACR_PASSWORD is empty!"; fi + + - name: Login to ACR + run: | + echo "$ACR_PASSWORD" | docker login "$ACR_LOGIN_SERVER" -u "$ACR_USERNAME" --password-stdin + + - name: Push Docker image + run: | + docker push $ACR_LOGIN_SERVER/ai-agents/123jinaitool-887a89:${{ github.sha }} + docker push $ACR_LOGIN_SERVER/ai-agents/123jinaitool-887a89:latest + + echo "✅ 镜像已推送: $ACR_LOGIN_SERVER/ai-agents/123jinaitool-887a89:latest" + + - name: Login Azure + run: | + az login --service-principal \ + -u "$AZ_CLIENT_ID" \ + -p "$AZ_CLIENT_SECRET" \ + --tenant "$AZ_TENANT_ID" + az account set --subscription "$AZ_SUBSCRIPTION_ID" + + - name: Get AKS Credentials + run: | + az aks get-credentials \ + --resource-group "$AZ_RG" \ + --name "$AZ_AKS" \ + --overwrite-existing + + - name: Setup ACR Pull Secret + run: | + # 创建 Agent 专用命名空间 + kubectl create namespace agent-123jinaitool-887a89 --dry-run=client -o yaml | kubectl apply -f - + + # 创建或更新 ACR 拉取 Secret + kubectl create secret docker-registry acr-secret \ + --docker-server=$ACR_LOGIN_SERVER \ + --docker-username=$ACR_USERNAME \ + --docker-password=$ACR_PASSWORD \ + -n agent-123jinaitool-887a89 --dry-run=client -o yaml | kubectl apply -f - + + - name: Deploy to AKS + run: | + # 删除旧的 deployment(如果存在) + kubectl delete deployment 123jinaitool-887a89 -n agent-123jinaitool-887a89 --ignore-not-found=true + + # 创建 deployment YAML + cat </dev/null) + if [ -n "$EXTERNAL_IP" ]; then + echo "✅ Agent LoadBalancer IP: $EXTERNAL_IP" + echo "EXTERNAL_IP=$EXTERNAL_IP" >> $GITHUB_ENV + break + fi + sleep 10 + done + + - name: Create DNS Record + if: env.EXTERNAL_IP != '' + run: | + echo "创建 DNS 记录: 123jinaitool-887a89.$AZURE_DNS_ZONE -> $EXTERNAL_IP" + + # 获取 Azure 访问令牌 + ACCESS_TOKEN=$(az account get-access-token --query accessToken -o tsv) + + # 创建 DNS A 记录 (DNS Zone 在单独的资源组中) + DNS_RG="${AZURE_DNS_RG:-taiji-Ai-v0}" + DNS_URL="https://management.azure.com/subscriptions/$AZ_SUBSCRIPTION_ID/resourceGroups/$DNS_RG/providers/Microsoft.Network/dnsZones/$AZURE_DNS_ZONE/A/123jinaitool-887a89?api-version=2018-05-01" + + curl -X PUT "$DNS_URL" \ + -H "Authorization: Bearer $ACCESS_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "properties": { + "TTL": 300, + "ARecords": [{"ipv4Address": "'"$EXTERNAL_IP"'"}] + } + }' + + echo "" + echo "✅ DNS 记录创建成功!" + echo "🌐 Agent 访问地址: http://123jinaitool-887a89.$AZURE_DNS_ZONE" + echo "🌐 Agent IP 地址: http://$EXTERNAL_IP" +