以代理為優先的工作流程 - 從提示到正式環境

1. 總覽

歡迎來到「第二天」。建構應用程式並按下「發布」按鈕的過程很神奇,但實際流量會帶來實際的失敗。您不必再花費大量時間處理 YAML 或搜尋記錄,而是可以建構大量專業代理,代為管理作業基礎架構。本程式碼實驗室會說明 Google Cloud 的整合式堆疊 (Eventarc、Cloud Run、Firestore、Cloud Build、BigQuery) 如何讓代理程式輕鬆安全地擷取密鑰、串流記錄檔,以及立即修正問題。

總覽

在本程式碼實驗室中,您將從頭開始建構 DinoQuest (以 Gemini 為基礎的恐龍冒險遊戲),並將其連結至全代理式 CI/CD 管道。完成本課程後,您將:

  • Cloud Run 上執行的 DinoQuest 網頁應用程式 (服務名稱:dinoquest)
  • 記錄檔分析管道:將 Cloud Run 記錄檔串流至 BigQuery,並產生互動式遊戲洞察資訊主控台
  • 修復代理 (remediation-agent):ADK 修復代理,可監控 Cloud Run 錯誤並自動修正,以 Eventarc 觸發的專屬 Cloud Run 服務形式部署
  • CI 代理程式 (ci-agent):讀取 PR 差異比較、智慧地設定測試範圍、透過 Cloud Build 建構 Docker 映像檔,並將提交狀態發布回 GitHub
  • CD 代理程式:評估部署風險、分配流量、監控指標,並自動升級或回溯

課程內容

  • 如何將全端 Vite + FastAPI 應用程式以單一容器的形式部署至 Cloud Run
  • 如何為 React 應用程式設定 Firebase 驗證和 Firestore
  • 如何建構及部署 ADK 代理,透過 Eventarc 對 Pub/Sub 事件做出反應
  • 如何將 Cloud Run 記錄檔傳送至 BigQuery,並查詢遊戲分析資料
  • 如何為 CI 和初期測試部署編寫代理功能技能

軟硬體需求

  • 已啟用計費功能的 Google Cloud 雲端專案
  • Firebase 專案 (可與 GCP 專案相同)
  • GitHub 帳戶和 DinoQuest 存放區的分支版本
  • 透過 Gemini (Google 的代理程式執行器) 存取 Antigravity
  • gcloud 已安裝 CLI 並完成驗證 - 請參閱下方的安裝說明
  • node ≥ 18 且npm
  • python3 ≥ 3.11
  • gitgh (GitHub CLI)

安裝 gcloud CLI

macOS

brew install --cask google-cloud-sdk

或者從 cloud.google.com/sdk/docs/install 下載安裝程式。

Windows

winget install Google.CloudSDK

或者,從 cloud.google.com/sdk/docs/install 下載 Windows 安裝程式 (.exe) 並執行。

安裝完成後,請初始化並驗證:

gcloud init
gcloud auth login
gcloud auth application-default login

2. 設定 Firebase

每個代理程式都需要資料才能進行推理。DinoQuest 使用 Firestore 和 Firebase Auth 提供可供正式環境使用的資料層,我們的代理程式稍後會使用自然語言探索及更新這個資料層。

由於這個應用程式是透過 AI Studio 生成,因此與 Firebase 深度整合。使用 Firebase 有許多優點,其中最重要的是預先保護的架構和開箱即用的受管理資料存取權,可確保遊戲狀態從第一天起就受到保護。

A. 建立 Firebase 專案

  1. 前往 console.firebase.google.com
  2. 按一下「新增專案」 (隱藏在「建立新專案」選項中) → 選取現有的 GCP 專案 (或建立新專案)
  3. 如果系統提示停用 Google Analytics,請停用 → 建立專案 (或直接使用預設設定)

B. 啟用 Google 驗證

  1. 在 Firebase 控制台中,依序前往「安全性」→「驗證」(開始使用) →「登入方法」
  2. 依序點按「Google」→ 切換「啟用」→ 儲存支援電子郵件地址 →「儲存」

C. 將 localhost 新增為授權網域

  1. 在「驗證」頁面中,按一下「設定」分頁標籤
  2. 在「授權網域」下方,確認 localhost 是否已列出 (預設應會列出)

D. 建立 Firestore 資料庫

  1. 依序前往「Database & Storage」→「Firestore Database」→「Create database」
  2. 選擇「Standard 版」→「下一步」
  3. 選取區域 us-central1 (或與 Cloud Run 區域相符)
  4. 選擇「以正式版模式啟動」→「建立」

建立完成後,請記下您的 資料庫 ID,除非您已命名,否則 ID 會顯示為 (default)

E. 設定 Firebase 安全性規則

在「Firestore Database」→「Rules」中,將預設規則替換為:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // ===============================================================
    // Helper Functions
    // ===============================================================
    function isAuthenticated() {
      return request.auth != null;
    }
    
    function isOwner(userId) {
      return isAuthenticated() && request.auth.uid == userId;
    }

    function isValidUser(data) {
      return data.keys().hasAll(['uid', 'email']) &&
             data.uid is string && data.uid.size() > 0 &&
             (data.email == null || (data.email is string && data.email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")));
    }

    function isValidDinosaur(data) {
      return data.keys().hasAll(['userId', 'name', 'type']) &&
             data.userId == request.auth.uid &&
             data.name is string && data.name.size() > 0 && data.name.size() < 50 &&
             data.type in ['Speedy', 'Tank', 'Balanced', 'Agile'];
    }

    function isValidGame(data) {
      return data.keys().hasAll(['userId', 'score']) &&
             data.userId == request.auth.uid &&
             data.score is number && data.score >= 0;
    }


    match /users/{userId} {
      allow read: if isOwner(userId);
      allow create: if isOwner(userId) && isValidUser(request.resource.data);
      allow update: if isOwner(userId) && isValidUser(request.resource.data);

      match /dinosaurs/{dinoId} {
        allow read: if isOwner(userId);
        allow create: if isOwner(userId) && isValidDinosaur(request.resource.data);
        allow update: if isOwner(userId) && isValidDinosaur(request.resource.data);
      }

      match /games/{gameId} {
        allow read: if isOwner(userId);
        allow create: if isOwner(userId) && isValidGame(request.resource.data);
      }

      match /seenAnnouncements/{announcementId} {
        allow read, create: if isOwner(userId);
      }
    }

    match /announcements/{announcementId} {
      allow read: if isAuthenticated();
    }

    // Default deny
    match /{document=**} {
      allow read, write: if false;
    }

    match /scores/{scoreId} {
      allow read: if true;
      allow create: if isAuthenticated();
      allow update: if false;
    }
  }
}

按一下「發布」。

F. 新增網頁應用程式並取得設定

  1. 依序前往「專案設定」 (齒輪圖示) →「一般」分頁
  2. 捲動至「您的應用程式」→ 點選「新增應用程式」→ 選擇「網站」圖示 ()
  3. 將其命名為 dinoquest註冊應用程式
  4. 複製顯示的 firebaseConfig 物件,稍後會用到

3. 執行遊戲

代理程式角色:環境。我們需要先為代理程式提供管理的世界,才能讓代理程式開始工作。在這個步驟中,我們會部署 DinoQuest 的「第一天」版本。這會建立直播服務、記錄和狀態,供我們的叢集稍後探索及管理。

總覽

請選擇下列其中一個選項。兩者都會產生 GEMINI_API_KEY,您可以在後續步驟中以相同方式使用,不需進行其他變更。

A. 設定 Gemini API 金鑰

Vertex AI 可讓您使用專案的預設服務帳戶,直接建立與 GCP 專案繫結的 Gemini API 金鑰,並透過該專案計費,不必另外建立 AI Studio 帳戶。

  1. 匯出 GCP 專案 ID:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    
  2. 啟用必要 API,並將必要權限授予 Compute Engine 預設服務帳戶:
    gcloud auth application-default set-quota-project $PROJECT_ID
    gcloud config set project $PROJECT_ID
    
    # Enable Vertex AI, Compute Engine, and Generative Language APIs
    gcloud services enable aiplatform.googleapis.com \
                           compute.googleapis.com \
                           generativelanguage.googleapis.com
    
    # Grant Vertex AI User role to the default compute service account
    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
      --role="roles/aiplatform.user" \
      --condition=None
    
  3. 在 Cloud 控制台中開啟 Vertex AI API 金鑰頁面
  4. 按一下「建立憑證」→ 選取「API 金鑰」
  5. 在建立對話方塊中:
    • 將金鑰命名為 Dino_Key
    • 勾選「透過服務帳戶驗證 API 呼叫」方塊
    • 在「服務帳戶」下方,選取預設的 Compute 服務帳戶 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)。
    • 返回「選取 API 限制」,勾選「GEMINI API」
    • 按一下「Create」(建立)
  6. 複製產生的金鑰。

做法 B:AI Studio (本機開發最快)

  1. 開啟 aistudio.google.com
  2. 按一下左側邊欄中的「取得 API 金鑰」
  3. 按一下「建立 API 金鑰」→ 選擇 GCP 專案 → 複製金鑰

後續步驟會將任一鍵設為 GEMINI_API_KEY,後端會以相同方式處理這兩個鍵。

複製存放區

課程存放區位於 https://github.com/gca-americas/dinoquest。請先建立分支,並新增至您的 GitHub 帳戶。我們會請專員處理您的存放區。

完成分叉後,請複製分叉 DinoQuest 存放區的 main 分支,然後輸入專案目錄:

git clone https://github.com/YOUR_GITHUB_USERNAME/dinoquest.git
cd dinoquest

B. 設定環境變數

在本程式碼研究室中,每次開啟新的 Bash 終端機時,請務必設定這些重要環境變數。將預留位置值替換為實際專案詳細資料:

首先,匯出 GitHub 存放區網址:

export GITHUB_REPO_URL=https://github.com/YOUR_GITHUB_USERNAME/dinoquest

然後匯出其餘環境變數:

export PROJECT_ID=your-project-id
export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
export CLOUD_RUN_REGION=us-central1
export GOOGLE_GENAI_USE_VERTEXAI=True
export HARNESS_EVENTS_TOPIC=projects/$PROJECT_ID/topics/harness-events
export CLOUD_BUILD_REPO=<YOUR_GITHUB_USERNAME>-dinoquest

確認結構正確無誤:

dinoquest/
├── backend/          # FastAPI backend (serves frontend + Gemini API calls)
├── frontend/         # React/Vite frontend
├── skills/           # Agentic CI/CD skill files
├── Dockerfile        # Multi-stage build (React → Python)
├── start.sh          # Local dev launcher
└── README.md

B. 建立後端環境檔案

首先,請匯出 Gemini API 金鑰:

export GEMINI_API_KEY=YOUR_GEMINI_API_KEY_FROM_STEP_2

然後建立 .env 檔案:

cat > backend/.env <<EOF
GEMINI_API_KEY=$GEMINI_API_KEY
GOOGLE_GENAI_USE_VERTEXAI=False
GOOGLE_CLOUD_PROJECT=$PROJECT_ID
EOF

C. 啟用 Firebase App Check / 服務帳戶 (適用於 Cloud Run)

在 Cloud Run 上執行時,後端會使用應用程式預設憑證與 Firebase 通訊,不需要服務帳戶金鑰檔案。firebase_admin.initialize_app()通話會在 backend/main.py 自動接聽。

在本機開發時,請驗證一次:

gcloud auth application-default login

D. 建立 Firebase 應用程式設定檔

frontend/ 目錄中,使用上一個步驟的設定建立 firebase-applet-config.json

{
  "apiKey": "YOUR_API_KEY",
  "authDomain": "YOUR_PROJECT_ID.firebaseapp.com",
  "projectId": "YOUR_PROJECT_ID",
  "storageBucket": "YOUR_PROJECT_ID.appspot.com",
  "messagingSenderId": "YOUR_SENDER_ID",
  "appId": "YOUR_APP_ID",
  "firestoreDatabaseId": "(default)"
}

注意: firestoreDatabaseId 應與您在上一步驟中建立的資料庫 ID 相符。如果您使用預設值,請保留 "(default)"

將變更修訂回存放區:

git add frontend/firebase-applet-config.json
git commit -m "chore: add firebase config"
git push origin main

C. 在本機執行 DinoQuest

1. 啟用必要的 API

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com \
  secretmanager.googleapis.com \
  firestore.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com \
  eventarc.googleapis.com \
  aiplatform.googleapis.com \
  bigquery.googleapis.com \
  aiplatform.googleapis.com

2. 開始 DinoQuest

start.sh 指令碼會建構 React 前端,並將終端機交給 FastAPI 後端,後者會提供已編譯的靜態檔案:

cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt -q

cd ..
# Force-remove the Vertex AI flag from the current terminal session to avoid conflicts
unset GOOGLE_GENAI_USE_VERTEXAI
./start.sh

在瀏覽器中開啟 http://localhost:8000。您應該會看到 DinoQuest 標題畫面。使用 Google 帳戶登入,產生第一隻恐龍,並確認恐龍已儲存至 Firestore。

疑難排解:如果看到空白頁面或 Firebase 驗證錯誤,請再次確認 frontend/firebase-applet-config.json 的值是否正確,以及 localhost 是否在授權網域清單中。

E. 將 DinoQuest 部署至 Cloud Run

1. 設定專案

export PROJECT_ID=$(gcloud config get-value project)

3. 建立 Artifact Registry 存放區

gcloud artifacts repositories create dinoquest \
  --repository-format=docker \
  --location=$CLOUD_RUN_REGION \
  --description="DinoQuest container images"

4. 將 Gemini API 金鑰儲存在 Secret Manager

echo -n $GEMINI_API_KEY | \
  gcloud secrets create gemini-api-key --data-file=-

# Grant the default compute service account access to the secret
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gemini-api-key \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

5. 使用 Cloud Build 建構容器映像檔

gcloud builds submit \
  --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest .

這會執行多級式 Dockerfile:先建構 React 應用程式,然後將輸出內容封裝到 FastAPI 映像檔中。大約需要 3 到 5 分鐘。

6. 部署至 Cloud Run

首先,請匯出管理員電子郵件地址:

export ADMIN_EMAIL=<YOUR_TEST_ACCOUNT_EMAIL>

然後部署服務:

gcloud run deploy dinoquest \
  --image=$CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest \
  --region=$CLOUD_RUN_REGION \
  --platform=managed \
  --allow-unauthenticated \
  --memory=128Mi \
  --set-secrets="GEMINI_API_KEY=gemini-api-key:latest" \
  --set-env-vars="ADMIN_EMAILS=$ADMIN_EMAIL" \
  --set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=False" \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID"

指令完成後,Cloud Run 會列印「服務網址」複製這個網址,您需要這個網址才能在 Firebase 中授權網域。

7. 在 Firebase 中授權 Cloud Run 網域

如要允許使用者從已部署的應用程式登入,請將 Cloud Run 網址新增至 Firebase 的授權網域:

  1. 返回 Firebase 控制台 → 依序點選「驗證」→「設定」→「已授權網域」
  2. 按一下「新增網域」
  3. 貼上 Cloud Run 服務網址 (例如 dinoquest-xxxxx.us-central1.run.app) - 移除 https:// 前置字元
  4. 按一下「儲存」

8. 填充排行榜資料

如要為遊戲注入一些初始「生命力」,並確保代理程式有資料可用,您可以為排行榜提供一些起始分數。

  1. 確認您位於 dinoquest 根目錄:
    cd ~/dinoquest
    
  2. 建立並啟動虛擬環境:
    python3 -m venv venv
    source venv/bin/activate
    
  3. 安裝必要的 Firestore 依附元件:
    pip install google-cloud-firestore
    
  4. 執行播種指令碼:
    python3 prep/seed_scores.py
    
  5. 停用虛擬環境:
    deactivate
    

現在您可以在瀏覽器中開啟服務網址,DinoQuest 已經完全上線!

4. 設定 Dino Theater

服務專員角色:視覺化工具。如何監控自主代理程式團隊?Dino Theater 可即時顯示代理程式群組的運作情形。您不必盯著終端機記錄,而是可以在即時視覺化資訊主頁中,觀看代理程式的推理過程、彼此呼叫,以及在雲端執行工作。

總覽

A. 將 Dino Theater 部署至 Cloud Run

首先,請返回主目錄並複製 Dino Theater 程式碼:

cd ~
git clone https://github.com/gca-americas/dinoquest-theater.git
cd dinoquest-theater
  1. 建構及推送容器:
    gcloud builds submit --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest .
    
  2. 設定服務帳戶和權限:
    # Create the service account
    gcloud iam service-accounts create dino-theater
    
    # Create the Pub/Sub topic (if you haven't yet)
    gcloud pubsub topics create harness-events
    
    # Create the subscription
    gcloud pubsub subscriptions create harness-events-theater \
      --topic=harness-events
    
    # Grant subscriber role
    gcloud pubsub subscriptions add-iam-policy-binding harness-events-theater \
      --member="serviceAccount:dino-theater@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role="roles/pubsub.subscriber"
    
  3. 部署應用程式:
    gcloud run deploy dino-theater \
      --image $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest \
      --region=$CLOUD_RUN_REGION \
      --service-account=dino-theater@${PROJECT_ID}.iam.gserviceaccount.com \
      --set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID" \
      --allow-unauthenticated \
      --min-instances=1
    
    注意:建議使用 --min-instances=1,在事件之間保持 SSE 連線有效。
  4. 確認運作正常:在瀏覽器中開啟已部署的服務網址 (例如 https://dino-theater-xxx-uc.a.run.app/demo)。

5. IDE 中的代理式 DevOps

代理程式角色:原生反重力。為縮短 IDE 與雲端之間的差距,我們將 Antigravity 連線至 Google Cloud 的受管理 MCP 伺服器。這樣一來,原生代理程式就能「看見」專案,進而剖析記錄、檢查指標及推斷基礎架構,您不必再費心處理 API 金鑰或切換到控制台。

執行任何技能前,請先設定 Antigravity 的 Google Cloud 存取權,並載入 DinoQuest 技能劇本。

A. 安裝 Google 代管的 MCP 服務

Google 的代管 MCP 服務提供單一託管端點,可存取所有 Google Cloud API。

使用應用程式預設憑證進行驗證:

gcloud auth application-default login

B. 設定 mcp_config.json

在 Antigravity 設定目錄 (通常為 ~/.gemini/antigravity/mcp_config.json) 中,或透過控制台建立或更新 mcp_config.json。這可讓 Antigravity 存取技能所需的 Google Cloud 和 GitHub 工具:

{
  "mcpServers": {
    "google-developer-knowledge": {
      "serverUrl": "https://developerknowledge.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-bigquery": {
      "serverUrl": "https://bigquery.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-cloud-logging": {
      "serverUrl": "https://logging.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-cloud-monitoring": {
      "serverUrl": "https://monitoring.googleapis.com/mcp",
      "authProviderType": "google_credentials",
      "disabledTools": [
        "get_dashboard",
        "list_dashboards"
      ]
    },
    "google-cloud-run": {
      "serverUrl": "https://run.googleapis.com/mcp",
      "authProviderType": "google_credentials",
      "disabledTools": [
        "deploy_service_from_image",
        "deploy_service_from_archive",
        "deploy_service_from_file_contents"
      ]
    },
    "google-cloud-sql": {
      "serverUrl": "https://sqladmin.googleapis.com/mcp",
      "authProviderType": "google_credentials",
      "disabled": true
    },
    "google-cloud-trace": {
      "serverUrl": "https://cloudtrace.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-error-reporting": {
      "serverUrl": "https://clouderrorreporting.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-firestore": {
      "serverUrl": "https://firestore.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-resource-manager": {
      "serverUrl": "https://cloudresourcemanager.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "gemini-cloud-assist": {
      "serverUrl": "https://geminicloudassist.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    }
  }
}

C. 將技能載入 Antigravity (選用)

Antigravity 會在特定標準目錄中探索技能。將複製的存放區中的 DinoQuest 技能複製到全域 Antigravity 技能資料夾:

# Create the standard skills directory if it doesn't exist
mkdir -p ~/.gemini/antigravity/skills

# Copy all DinoQuest skills into the global skills folder
cp -r skills/* ~/.gemini/antigravity/skills/

D. 重新啟動 Antigravity(選用)

如要套用 mcp_config.json 變更並載入新複製的技能,請重新啟動 Antigravity 應用程式

重新啟動後:

  1. 確認「設定」中的 googlegithub MCP 伺服器顯示綠色的「已連線」狀態。
  2. 確認 DinoQuest 技能顯示在技能清單中。

注意:每項技能的 SKILL.md 頂端都有 ## Configuration 表格。複製後,請更新 ~/.gemini/antigravity/skills//SKILL.md 中的值,使其與專案相符。

E. 在本機 IDE 中修正雲端服務

  1. 觸發錯誤:在瀏覽器中開啟您部署的 DinoQuest 網址 (上一個步驟)。
  2. 前往排行榜:按一下「排行榜」按鈕。目前的排行榜實作方式刻意降低效率,會嘗試將大量資料載入記憶體,觸發記憶體不足 (OOM) 錯誤。
  3. 在 Antigravity Agent Manager (Agent HUB) 中,要求協助復原錯誤,並盡可能修正根本原因。
  • 提示 1:找出 dinoquest 的問題。
  • 提示 2:請查看 Dinoquest 遊戲的程式碼,並修正導致記憶體不足錯誤的原因。

6. 將記錄串流至 BigQuery 並產生分析資料

代理程式角色:資料代理程式。將原始記錄轉換為可執行的產品策略,不應耗費數小時的手動資料管道作業。我們使用 Data Agent Kit 和 BigQuery MCP 建立「零 ETL」管道,將記錄直接串流至 BigQuery,讓代理程式在兩分鐘內產生進階數據分析資訊主頁。

log-router-bq-report 技能會設定 Cloud Logging 接收器,持續將 DinoQuest 的 Cloud Run 記錄檔串流至 BigQuery,然後查詢資料以產生流量報表和遊戲分析洞察資料。

總覽

A. 設定技能變數

開啟 DinoQuest 存放區中的 skills/log-router-bq-report/SKILL.md,然後更新頂端的「Configuration」部分:

| Variable      | Your Value         |
|---------------|--------------------|
| SERVICE_NAME  | dinoquest          |
| BQ_DATASET    | dinoquest_logs     |
| LOG_SINK_NAME | dinoquest-bq-sink  |

B. 在 Antigravity 中執行技能

DinoQuest repo 做為背景資訊開啟 Antigravity,然後告訴 Gemini:

Run the log-router-bq-report skill

這項技能將:

  1. 自動解決 GCP 專案問題
  2. 檢查 BigQuery 接收器是否已存在,如果沒有,系統會建立資料集和接收器。
  3. 授予 IAM 權限:這會將資料集的「BigQuery 資料編輯者」角色授予接收器的 writerIdentity

注意:與 Eventarc 接收器一樣,您可能會在此程序中看到 gcloud 發出的警告:「請記得在資料集上授予 serviceAccount:service-... BigQuery 資料編輯者角色。」這項作業會由技能自動處理。

C. 使用 Antigravity 生成報表

只要要求 Antigravity「設定 BigQuery 記錄檔接收器並產生數據分析報表」,服務專員會:

  1. 設定基礎架構:建立 BigQuery 資料集和 Cloud Logging 接收器。
  2. 管理權限:自動將必要的 IAM 角色授予接收器的寫入者身分。
  3. 生成深入分析:分析記錄並製作進階互動式 HTML 資訊主頁,其中包含遊戲遙測資料和勝率分析。

7. 自我修復修復代理程式

代理程式角色:SRE 代理程式。如果生產服務在凌晨 2 點發生故障,您不應該需要起床。這個代理程式會擔任第一線服務人員,透過 Eventarc 觸發 Cloud Run 錯誤記錄後,系統會自動分析當機情形、提出修正建議,並啟動修復管道,完全不需要登入控制台。

DinoAgent 是 ADK 代理程式,可透過 Eventarc 監聽 Cloud Run 錯誤記錄、診斷根本原因,並自動修正問題,方法包括增加記憶體、回溯流量,或在 GitHub 上提交程式碼修正 PR。

總覽

A. 複製 Remediation Agent 存放區

cd ~
git clone https://github.com/gca-americas/dinoquest-reme-agent.git
cd dinoquest-reme-agent

專案結構:

dinoquest-reme-agent/
├── main.py              # Service entrypoint — receives Eventarc HTTP POST, runs agent
├── runner.py            # ADK Runner + session service
├── agent.py             # LlmAgent definition, loads skill from file
├── tools.py             # Cloud Run v2 API tools (list/get/rollback/update)
├── skills/
   └── remediation/
       ├── SKILL.md     # Agent playbook — edit this to change behavior
       └── scripts/     # Shell scripts for the code-fix track
           ├── clone_repo.sh
           ├── read_file.sh
           ├── apply_fix.sh
           ├── commit_branch.sh
           ├── open_pr.sh
           └── rollback_fix.sh
├── requirements.txt
└── Dockerfile

B. 設定 GitHub 存取權 (程式碼修正軌)

程式碼修正軌會複製 DinoQuest 存放區、讀取來源檔案、套用修補程式,並開啟 PR。這需要具有 repo 範圍的 GitHub 個人存取權杖。

  1. 前往 github.com/settings/tokensGenerate new token (classic)
  2. 為權杖命名,選取repo範圍 →「產生權杖」→ 複製權杖

將其儲存在 Secret Manager 中:

首先,匯出 GitHub 權杖:

export GH_TOKEN=ghp_YOUR_TOKEN_HERE

接著建立密鑰:

echo -n $GH_TOKEN | \
  gcloud secrets create github-token --data-file=-

C. 設定 Slack 通知 (選用)

補救措施完成後,DinoAgent 會在 Slack 頻道發布摘要。

  1. 前往 api.slack.com/apps → 依序點選「Create New App」(建立新應用程式) →「From scratch」(從頭開始)
  2. 將其命名為 DinoAgent,選取工作區 → 點選「建立應用程式」
  3. 依序點選「功能」→「連入的 Webhook」→ 開啟切換按鈕
  4. 依序按一下「Add New Webhook to Workspace」(將 Webhook 新增至工作區) → 選擇頻道 →「Allow」(允許)
  5. 複製 Webhook 網址 (https://hooks.slack.com/services/...)

將其儲存在 Secret Manager 中:

export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
  gcloud secrets create slack-webhook --data-file=-

D. 建立 DinoAgent 服務帳戶

gcloud iam service-accounts create remediation-agent \
  --display-name="Cloud Run Remediation Agent"

export SA="remediation-agent@${PROJECT_ID}.iam.gserviceaccount.com"

for ROLE in \
  roles/run.admin \
  roles/iam.serviceAccountUser \
  roles/eventarc.eventReceiver \
  roles/aiplatform.user \
  roles/artifactregistry.reader \
  roles/secretmanager.secretAccessor \
  roles/pubsub.publisher \
  roles/logging.viewer; do
  gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA}" --role="$ROLE" \
    --condition=None
done

授予存取密鑰的權限:

for SECRET in github-token slack-webhook; do
  gcloud secrets add-iam-policy-binding $SECRET \
    --member="serviceAccount:${SA}" \
    --role="roles/secretmanager.secretAccessor"
done

E. 在 Cloud Run 建構及部署 DinoAgent

# Get Project Number for the CIAgent URL
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export CIAGENT_URL=https://ci-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export SA="remediation-agent@${PROJECT_ID}.iam.gserviceaccount.com"
export GITHUB_REPO_URL=https://github.com/YOUR_REPO
HARNESS_EVENTS_TOPIC=projects/$PROJECT_ID/topics/harness-events


AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/remediation-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .


gcloud run deploy remediation-agent \
  --image=$AGENT_IMAGE \
  --region=$CLOUD_RUN_REGION \
  --service-account=$SA \
  --memory=2Gi \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID},GOOGLE_GENAI_USE_VERTEXAI=True" \
  --set-env-vars="GITHUB_REPO_URL=${GITHUB_REPO_URL}" \
  --set-secrets="SLACK_WEBHOOK_URL=slack-webhook:latest" \
  --set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
  --set-env-vars="CIAGENT_URL=${CIAGENT_URL}" \
  --set-secrets="GITHUB_TOKEN=github-token:latest" \
  --no-allow-unauthenticated \
  --min-instances=1 \
  --no-cpu-throttling \
  --timeout=300

F. 連結 Eventarc 觸發條件

建立 Pub/Sub 主題,接收 Cloud Run 錯誤記錄:

gcloud pubsub topics create cloud-run-errors

建立 Cloud Logging 接收器,篩選 dinoquest 服務的錯誤記錄,並將其轉送至主題:

export SERVICE_NAME=dinoquest
FILTER="resource.type=\"cloud_run_revision\" resource.labels.service_name=\"$SERVICE_NAME\" severity=ERROR NOT logName=~\"cloudaudit\" NOT httpRequest.requestUrl=~\"/_ah/health\""

gcloud logging sinks create cloud-run-errors-sink \
  pubsub.googleapis.com/projects/${PROJECT_ID}/topics/cloud-run-errors \
  --log-filter="$FILTER"

注意:執行上述指令時,gcloud 會顯示「Info」訊息,內容為「Please remember to grant serviceAccount:service-... the Pub/Sub Publisher role on the topic.」(請記得在主題上授予服務帳戶:service-... Pub/Sub 發布者角色)。下一個步驟會處理這項作業。

請授予接收器的寫入者身分 (警告中提及的服務帳戶) 發布權限:

SINK_SA=$(gcloud logging sinks describe cloud-run-errors-sink \
  --format='value(writerIdentity)')

gcloud pubsub topics add-iam-policy-binding cloud-run-errors \
  --member="${SINK_SA}" --role="roles/pubsub.publisher"

確認是否已啟用:

gcloud eventarc triggers describe remediation-trigger --location=$CLOUD_RUN_REGION

授予 Eventarc 權限,以叫用補救代理程式:

gcloud run services add-iam-policy-binding remediation-agent \
  --region=$CLOUD_RUN_REGION \
  --member="serviceAccount:${SA}" \
  --role="roles/run.invoker"

建立 Eventarc 觸發條件:

gcloud eventarc triggers create remediation-trigger \
  --location=$CLOUD_RUN_REGION \
  --destination-run-service=remediation-agent \
  --destination-run-region=$CLOUD_RUN_REGION \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --transport-topic=projects/${PROJECT_ID}/topics/cloud-run-errors \
  --service-account=${SA}

現在系統會自動修正問題。除了擴充基礎架構,DinoAgent 還會對應用程式程式碼執行深入的根本原因分析、套用語意修補程式,並使用代理間 (A2A) 通訊,將修正內容交給 CI 代理進行驗證和部署。如要瞭解實作詳細資料,請參閱 reme-agent 程式碼集

8. 設定 CI 代理程式

代理程式角色:CI 管道。不必再為複雜的 YAML 檔案和手動建構指令碼而煩惱。這個代理程式會管理 PR 的運作管道。這個指令會讀取程式碼變更、瞭解內容、設定必要測試的範圍,並透過 Cloud Build 建構 Docker 映像檔,確保每個修訂版本在送達主要分支版本前,都已「獲得代理程式核准」。

ci-agent 是以 Cloud Run 服務形式部署的自主 CI 管道代理程式。這個工具會將 Docker 建構作業提交至 Cloud Build、輪詢完成狀態、驗證 Artifact Registry 中的映像檔,並向 GitHub 回報。

總覽

為什麼要為 CI 管道使用代理程式?與傳統靜態指令碼不同,代理式 CI 管道提供:

  1. 認知範圍分類:根據程式碼變更的語意影響,智慧判斷所需的測試深度,在型別檢查、單元測試或完整整合套件之間切換。
  2. 自主 PR 管理:代理程式可自動建立 PR、發布詳細的變更摘要,甚至管理機密掃描和安全稽核,無須人為介入。
  3. 即時診斷失敗原因:建構失敗時,代理程式不只會顯示記錄,還會分析堆疊追蹤記錄、找出可能原因,並直接在 PR 中發布易於解讀的診斷結果。

A. 複製 CIAgent 存放區

cd ~
git clone https://github.com/gca-americas/dinoquest-ci-agent.git
cd dinoquest-ci-agent

B. 建立 CIAgent 服務帳戶

gcloud iam service-accounts create ci-agent \
  --display-name="CIAgent CI Pipeline"

export SA="ci-agent@${PROJECT_ID}.iam.gserviceaccount.com"

# Grant necessary roles to the service account
for ROLE in \
  roles/cloudbuild.builds.editor \
  roles/cloudbuild.builds.builder \
  roles/artifactregistry.reader \
  roles/artifactregistry.writer \
  roles/aiplatform.user \
  roles/secretmanager.secretAccessor \
  roles/pubsub.publisher \
  roles/developerconnect.admin; do
  gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA}" --role="$ROLE" \
    --condition=None
done



# ci-agent needs to act as itself when running build steps
gcloud iam service-accounts add-iam-policy-binding $SA \
  --member="serviceAccount:${SA}" \
  --role="roles/iam.serviceAccountUser"

C. 將 GitHub 存放區連結至 Cloud Build

CIAgent 會透過 repoSource 提交建構作業,因此 GitHub 存放區必須連線至 Cloud Build Developer Connect。

  1. 前往 GCP 主控台 → Cloud Build → 存放區
  2. 按一下「連結存放區」
  3. 選取「GitHub (Cloud Build GitHub 應用程式)」
  4. 授權並選取 YOUR_GITHUB_USERNAME/dinoquest 存放區
  5. 系統提示建立觸發條件時,請按一下「連線」和「略過」
  6. 記下連線名稱 (預設通常是 GitHub 使用者名稱或類似名稱)。

D. 授予 CIAgent 密鑰存取權

我們會重複使用先前為 DinoAgent 建立的密鑰:

gcloud secrets add-iam-policy-binding github-token \
  --member="serviceAccount:${SA}" \
  --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding slack-webhook-ci \
  --member="serviceAccount:${SA}" \
  --role="roles/secretmanager.secretAccessor"

E. 建構 CIAgent 並部署至 Cloud Run

# Set up required variables for orchestration
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export CDAGENT_URL=https://cd-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export CI_AGENT_URL=ci-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export GITHUB_OWNER="YOUR_GITHUB_USERNAME"
export CLOUD_BUILD_CONNECTION="YOUR_CONNECTION_NAME"  # Update this if your connection name is different
export CLOUD_BUILD_REPO="YOUR_GITHUB_USERNAME-dinoquest" # Update this if your connection name is different

export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
  gcloud secrets create slack-webhook-ci --data-file=-

export SA="ci-agent@${PROJECT_ID}.iam.gserviceaccount.com"
AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/ci-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .

gcloud run deploy ci-agent \
  --image=$AGENT_IMAGE \
  --region=$CLOUD_RUN_REGION \
  --service-account=$SA \
  --memory=1Gi \
  --timeout=600 \
  --allow-unauthenticated \
  --min-instances=1 \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID},GOOGLE_GENAI_USE_VERTEXAI=True" \
  --set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
  --set-env-vars="HOST=${CI_AGENT_URL},PROTOCOL=https" \
  --set-secrets="SLACK_WEBHOOK_URL=slack-webhook-ci:latest" \
  --set-env-vars="GITHUB_OWNER=${GITHUB_OWNER},GITHUB_REPO=dinoquest" \
  --set-env-vars="CLOUD_BUILD_CONNECTION=${CLOUD_BUILD_CONNECTION},CLOUD_BUILD_REPO=${CLOUD_BUILD_REPO},CLOUD_BUILD_REGION=${CLOUD_RUN_REGION}" \
  --set-env-vars="CDAGENT_URL=${CDAGENT_URL}" \
  --set-secrets="GITHUB_TOKEN=github-token:latest" \
  --min-instances=1

F. 設定 Slack 斜線指令

  1. 前往 api.slack.com/apps → 點選「Create New App」→ 點選「From scratch」
  2. 將其命名為 CIAgent,然後選取工作區 → 點選「建立應用程式」
  3. 依序點選「Features」(功能)「Slash Commands」(斜線指令)「Create New Command」(建立新指令)
  4. 指令:/runci
  5. 要求網址:上述 CIAgent Cloud Run 網址,並附加 /slack (例如 https://ci-agent-xxx-.us-central1.run.app/slack)
  6. 簡短說明:Trigger CI
  7. 儲存
  8. 依序點選「設定」→「安裝應用程式」,然後按一下「安裝到 Workspace」並選取「允許」。

CI 代理程式是「大腦」,位於 Cloud Build 和 Artifact Registry 等強大的 Google Cloud 服務之上。建構作業通過驗證後,系統會透過 A2A 呼叫 CD 代理程式,觸發最終部署階段,確保建構和發布週期之間順利交接。

9. 設定部署作業

代理人角色:CD 代理人。部署不應是碰運氣。這個代理人會為您管理風險。這項功能會評估部署安全性、管理 Canary 流量分配,以及監控即時指標,以決定是否要發布或回溯版本。這是自主代理程式群組中的最後一道關卡。

cd-agent 是以 Cloud Run 服務形式部署的自主初期測試部署代理程式。這項服務會接收 ci-agent 的 A2A 部署要求、計算風險分數、設定經過風險校準的初期測試版本百分比、監控指標,以及自動升級或復原。也會從過去使用 Firestore 的部署作業中學習。

總覽

直接連結代理程式會建立「認知管道」,每次交接時都會豐富地轉移意圖和情境。與傳統 Webhook 不同,A2A 通訊可進行下列操作:

  1. 智慧型情境分享:代理會傳遞整個工作階段的記憶體、PR 差異和風險分數,確保下一個代理在開始工作前,充分瞭解「原因」。
  2. 認知握手:代理程式可以協商閘道。舉例來說,在 Canary 推出期間,CD 代理程式可以向 CI 代理程式要求進行特定煙霧測試,即時驗證修正。
  3. 協作式修復:如果部署失敗,CD 代理程式可以主動通知修復代理程式失敗的指標,在人員收到通知前,啟動自主根本原因分析。
  4. 資源協商:代理商可以協商基礎架構需求。舉例來說,如果 CI 代理程式偵測到大規模重構,可以要求修復代理程式提供更多建構容量;CD 代理程式則可以在重大版本發布前,建議擴充正式環境叢集。
  5. 多代理共識:對於高風險變更,多個代理程式 (例如安全代理程式和 CD 代理程式) 可透過 A2A 執行「聯合簽核」,確保程式碼不僅能建構及部署,還符合安全政策,然後再發布至正式環境。

A. 複製 CDAgent 存放區

cd ~
git clone https://github.com/gca-americas/dinoquest-cd-agent.git
cd dinoquest-cd-agent

B. 建立 Firestore 資料庫

CDAgent 會將部署記憶體模式儲存在 Firestore 中:

gcloud firestore databases create \
  --region=$CLOUD_RUN_REGION \
  --project=$PROJECT_ID

(如果您已在這個專案中建立資料庫,可以略過這個步驟)。

C. 建立 CDAgent 服務帳戶

gcloud iam service-accounts create cd-agent \
  --display-name="CDAgent Canary Deployer"

export SA="cd-agent@${PROJECT_ID}.iam.gserviceaccount.com"

# Grant necessary roles
for ROLE in \
  roles/run.developer \
  roles/iam.serviceAccountUser \
  roles/artifactregistry.reader \
  roles/artifactregistry.writer \
  roles/monitoring.viewer \
  roles/datastore.user \
  roles/aiplatform.user \
  roles/run.admin \
  roles/pubsub.publisher; do
  gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA}" --role="$ROLE" \
    --condition=None
done

D. 授予 CDAgent 密鑰存取權

我們將沿用先前的 GitHub 權杖和 Slack Webhook,並授予 Cloud Run Compute 服務帳戶 Gemini API 金鑰的存取權,讓部署的應用程式可以使用該金鑰:

gcloud secrets add-iam-policy-binding github-token \
  --member="serviceAccount:${SA}" \
  --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding slack-webhook-cd \
  --member="serviceAccount:${SA}" \
  --role="roles/secretmanager.secretAccessor"

# Grant the compute service account access to Gemini API key
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gemini-api-key \
  --project=$PROJECT_ID \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

E. 建構 CDAgent 並部署至 Cloud Run

export GITHUB_OWNER="YOUR_GITHUB_USERNAME"

export CD_AGENT_URL=cd-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app

export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
  gcloud secrets create slack-webhook-cd --data-file=-

AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/cd-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .


export SA="cd-agent@${PROJECT_ID}.iam.gserviceaccount.com"


gcloud run deploy cd-agent \
  --image=$AGENT_IMAGE \
  --region=$CLOUD_RUN_REGION \
  --service-account=$SA \
  --memory=1Gi \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID}" \
  --set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=True" \
  --set-env-vars="HOST=${CD_AGENT_URL},PROTOCOL=https" \
  --set-env-vars="CD_TARGET_SERVICE=dinoquest" \
  --set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
  --set-env-vars="GITHUB_OWNER=${GITHUB_OWNER}" \
  --set-env-vars="GITHUB_REPO=dinoquest" \
  --set-env-vars="DEMO_MODE=true" \
  --set-env-vars="LEADERBOARD_ENABLED=true" \
  --set-secrets="SLACK_WEBHOOK_URL=slack-webhook-cd:latest" \
  --set-secrets="GITHUB_TOKEN=github-token:latest" \
  --allow-unauthenticated \
  --min-instances=1 \
  --no-cpu-throttling \
  --timeout=300

注意: --min-instances=1 --no-cpu-throttling 會讓執行個體保持暖機狀態,以便快速回應 Slack 和 A2A 指令。

CD 代理程式是正式環境的最終把關者。這項功能會評估每次部署的風險、執行風險校準的初期測試,並監控即時指標。如果偵測到任何異常情況,系統會自動啟動回溯程序。

10. 擴大規模:運用 Agent Swarm 解鎖第 2 級

A. 測試完整蜂群

  1. 觸發錯誤:在瀏覽器中開啟您部署的 DinoQuest 網址 (上一個步驟)。
  2. 前往排行榜:按一下「排行榜」按鈕。目前的排行榜實作方式刻意降低效率,會嘗試將大量資料載入記憶體,觸發記憶體不足 (OOM) 錯誤。
  3. 等待代理程式:大約 60 秒內,remediation-agent 會透過 Eventarc 接收錯誤事件,並開始診斷。
  4. 檢查 Slack:Slack 管道中應該會顯示類似以下的通知:DinoAgent Remediation Summary
    • 服務:dinoquest
    • 失敗的修訂版本:dinoquest-xxxx-xxxx
    • 證據:「Memory limit of 128 MiB exceeded with 13x MiB used.」(記憶體用量超過 128 MiB 上限,達到 13x MiB)。
    • 這個修訂版本有何問題/api/leaderboard 端點的 xxxxx 效率不彰,導致 OOM 錯誤。
    • 採取行動:將服務 dinoquest 的記憶體從 xMi 增加至 yGi。已建立新修訂版本。
    • 根本原因 PR:https://github.com/YOUR_USERNAME/DinoQuest/pull/x
  5. 驗證修正結果
    • GitHub:檢查存放區是否有新分支和提取要求。代理程式已修補應用程式程式碼,修正基礎記憶體流失問題。
    • Cloud Run:在 GCP 主控台中,您會看到 dinoquest 服務的新修訂版本,其中包含更新後的記憶體配置。
    • 排行榜:再次嘗試排行榜,現在應該可以順利載入,因為記憶體已增加,程式碼也已修正。

B. 演進:實作第 2 級遊戲邏輯

您將新增一項重要功能:第 2 級 (小行星摧毀者)。高分恐龍可進入新的遊戲模式。

  1. 返回 dinoquest 存放區
    cd ~/dinoquest
    
  2. 建立並切換至新分支
    git checkout -b level_2
    
  3. 套用第 2 級修補程式:執行提供的指令碼,使用第 2 級素材、元件和遊戲邏輯修補本機程式碼集:
    bash level_2_backup/levelup.sh
    
  4. 修訂並推送變更
    git add .
    git commit -m "feat: add Level 2"
    git push origin level_2
    

我們將使用先前設定的 Slack Slash 指令,而不是使用 curl 手動觸發代理程式。這是在實際情境中與自主 CI 管道互動的方式。

  1. 開啟 Slack,然後前往已安裝 CIAgent 應用程式的任何頻道。
  2. 輸入下列指令,觸發 CI 建構作業
    /runci run ci on branch level_2
    
  3. 監控進度
    • Slack:代理程式會確認您的指令,並在建構作業進行期間發布更新。
    • Dino Theater:觀看「想法泡泡」,瞭解代理程式如何分類變更、提交 Cloud Build 工作,以及與 CD 代理程式通訊。
    • GitHub:檢查 level_2 PR,您會看到代理程式發布提交狀態和完整的 CI 報告註解。
  4. 觀看流程
    • 查看 Dino Theater,瞭解 CI 代理程式如何思考、分類變更及執行管道。
    • 檢查 GitHub PR,查看 CI 代理程式發布的提交狀態和最終報告。

11. 結語

您已在 Google Cloud 上建構完整的代理式 DevOps 堆疊:

元件

用途

DinoQuest (Cloud Run dinoquest)

採用 Gemini 的遊戲 - React 前端 + FastAPI 後端

Firebase 驗證 + Firestore

使用者驗證和恐龍設定檔儲存空間

補救代理程式 (Cloud Run + Eventarc)

SRE 代理程式,可自動修正 OOM 錯誤和程式碼錯誤

log-router-bq-report

資料代理程式,可將記錄串流至 BigQuery 並產生洞察資料

CIAgent (Cloud Run)

CI 代理程式,透過 A2A 範圍測試、建構映像檔及呼叫 CD

CDAgent (Cloud Run)

CD 代理程式,可執行風險評分初期測試部署作業,並自動復原

所有 Agent 行為都位於 skills/ 目錄中,以 Markdown 劇本的形式呈現。如要變更行為,請編輯技能,而非程式碼。技能會在 Antigravity with Gemini 上執行,只要告知代理要執行的技能,即可叫用技能。