Alur Kerja Agent First - Dari perintah hingga produksi

1. Ringkasan

Selamat datang di ‘Hari Kedua'. Meskipun membangun aplikasi dan menekan 'Publikasikan' terasa seperti keajaiban, traffic dunia nyata dapat menyebabkan kegagalan di dunia nyata. Daripada menghabiskan waktu berurusan dengan YAML atau mencari-cari log, Anda dapat membangun sekelompok agen khusus untuk mengelola infrastruktur operasional Anda. Codelab ini menunjukkan cara stack terpadu Google Cloud (Eventarc, Cloud Run, Firestore, Cloud Build, BigQuery) memudahkan agen untuk mengambil secret, melakukan streaming log, dan memperbaiki masalah secara langsung dengan aman.

Ringkasan

Dalam codelab ini, Anda akan membuat DinoQuest — game petualangan dinosaurus yang didukung Gemini — dari nol dan menghubungkannya ke pipeline CI/CD yang sepenuhnya agentic. Pada akhir proses, Anda akan:

  • Aplikasi web DinoQuest yang berfungsi dan berjalan di Cloud Run (nama layanan: dinoquest)
  • Pipeline analisis log yang men-streaming log Cloud Run ke BigQuery dan menghasilkan dasbor insight game interaktif
  • Agen Remediasi (remediation-agent) — agen remediasi ADK yang memantau error Cloud Run dan memperbaikinya secara otomatis, di-deploy sebagai layanan Cloud Run-nya sendiri yang dipicu oleh Eventarc
  • Agen CI (ci-agent) yang membaca diff PR Anda, mencakup pengujian secara cerdas, membuat image Docker melalui Cloud Build, dan memposting status commit kembali ke GitHub
  • Agen CD yang menilai risiko deployment, membagi traffic, memantau metrik, serta mempromosikan atau membatalkan secara otomatis

Yang akan Anda pelajari

  • Cara men-deploy aplikasi full-stack Vite + FastAPI di Cloud Run sebagai satu container
  • Cara mengonfigurasi Firebase Auth dan Firestore untuk aplikasi React
  • Cara membuat dan men-deploy agen ADK yang bereaksi terhadap peristiwa Pub/Sub melalui Eventarc
  • Cara mengarahkan log Cloud Run ke BigQuery dan membuat kueri analisis game
  • Cara menulis keterampilan agen untuk CI dan deployment canary

Yang Anda butuhkan

  • Project Google Cloud yang mengaktifkan penagihan
  • Project Firebase (dapat berupa project GCP yang sama)
  • Akun GitHub dan fork repo DinoQuest
  • Akses ke Antigravity dengan Gemini (pelaksana agen Google)
  • CLI gcloud diinstal dan diautentikasi — lihat petunjuk penginstalan di bawah
  • node ≥ 18 dan npm
  • python3 ≥ 3.11
  • git dan gh (GitHub CLI)

Menginstal gcloud CLI

macOS

brew install --cask google-cloud-sdk

Atau, download penginstal dari cloud.google.com/sdk/docs/install.

Windows

winget install Google.CloudSDK

Atau, download penginstal Windows (.exe) dari cloud.google.com/sdk/docs/install dan jalankan.

Setelah menginstal, lakukan inisialisasi dan autentikasi:

gcloud init
gcloud auth login
gcloud auth application-default login

2. Menyiapkan Firebase

Setiap agen memerlukan data untuk melakukan penalaran. DinoQuest menggunakan Firestore dan Firebase Auth untuk menyediakan lapisan data siap produksi yang nantinya akan ditemukan, dieksplorasi, dan diperbarui oleh agen kami menggunakan bahasa alami.

Karena aplikasi ini dibuat melalui AI Studio, aplikasi ini terintegrasi secara mendalam dengan Firebase. Penggunaan Firebase menawarkan beberapa keuntungan, yang paling utama adalah arsitektur yang sudah diamankan dan akses data terkelola langsung, sehingga memastikan status game Anda terlindungi sejak hari pertama.

A. Membuat project Firebase

  1. Buka console.firebase.google.com
  2. Klik Tambahkan project (Tersembunyi di opsi buat project baru) → pilih project GCP yang sudah ada (atau buat project baru)
  3. Nonaktifkan Google Analytics jika diminta → Buat project (Atau Anda dapat menggunakan setelan default)

B. Mengaktifkan Autentikasi Google

  1. Di Firebase console, buka Security → Authentication (Get started) → Sign-in method
  2. Klik Google → alihkan Aktifkan → simpan email dukungan Anda → Simpan

C. Menambahkan localhost sebagai domain resmi

  1. Masih di Authentication, klik tab Settings
  2. Di bagian Authorized domains, konfirmasi bahwa localhost tercantum (secara default, domain ini akan tercantum)

D. Membuat database Firestore

  1. Buka Database & Storage → Firestore Database → Create database
  2. Pilih Edisi StandardBerikutnya
  3. Pilih region us-central1 (atau cocokkan dengan region Cloud Run Anda)
  4. Pilih Start in production modeCreate

Setelah dibuat, catat ID Database Anda — ID ini akan terlihat seperti (default) kecuali jika Anda menamainya.

E. Menetapkan Aturan Keamanan Firebase

Di Firestore Database → Rules, ganti aturan default dengan:

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;
    }
  }
}

Klik Publikasikan.

F. Menambahkan aplikasi web dan mendapatkan konfigurasi

  1. Buka Setelan project (ikon roda gigi) → tab Umum
  2. Scroll ke Aplikasi Anda → klik Tambahkan aplikasi → pilih ikon Web ()
  3. Beri nama dinoquestDaftarkan aplikasi
  4. Salin objek firebaseConfig yang ditampilkan — Anda akan membutuhkannya sebentar lagi

3. Menjalankan Game

Peran Agen: Lingkungan. Sebelum menetapkan agen untuk bekerja, kita memerlukan dunia yang dapat mereka kelola. Pada langkah ini, kita akan men-deploy versi "Day One" DinoQuest. Tindakan ini akan membuat layanan, log, dan status aktif yang akan ditemukan dan dikelola oleh swarm kita nanti.

Ringkasan

Pilih salah satu dari dua opsi di bawah. Keduanya menghasilkan GEMINI_API_KEY yang Anda gunakan secara identik di setiap langkah berikutnya — tidak ada perubahan lain yang diperlukan.

A. Menyiapkan kunci Gemini API

Vertex AI memungkinkan Anda membuat kunci API Gemini yang terikat langsung ke project GCP Anda dan ditagih ke project tersebut, menggunakan akun layanan default project — tidak memerlukan akun AI Studio terpisah.

  1. Ekspor ID project GCP Anda:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    
  2. Aktifkan API yang diperlukan dan berikan izin yang diperlukan ke akun layanan default 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. Buka halaman kunci API Vertex AI di Konsol Cloud
  4. Klik Create Credentials → pilih API Key
  5. Dalam dialog pembuatan:
    • Beri nama kunci Dino_Key
    • Centang kotak Autentikasi panggilan API melalui akun layanan
    • Di bagian Service account, pilih default compute service account (PROJECT_NUMBER-compute@developer.gserviceaccount.com)
    • Kembali ke Pilih pembatasan API, centang GEMINI API
    • Klik Buat
  6. Salin kunci yang dibuat.

Opsi B — AI Studio (paling cepat untuk pengembangan lokal)

  1. Buka aistudio.google.com
  2. Klik Dapatkan kunci API di sidebar kiri
  3. Klik Buat kunci API → pilih project GCP Anda → salin kunci

Salah satu kunci ditetapkan sebagai GEMINI_API_KEY dalam langkah-langkah berikutnya — backend memperlakukannya secara identik.

Melakukan cloning repositori

Repositori kursus berada di https://github.com/gca-americas/dinoquest. Lakukan fork terlebih dahulu ke akun GitHub Anda. Kami akan meminta agen mengerjakan repo Anda.

Setelah melakukan fork, clone cabang main dari repositori DinoQuest yang Anda fork dan masukkan direktori project:

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

B. Menyiapkan Variabel Lingkungan

Di setiap terminal bash baru yang Anda buka selama codelab ini, pastikan untuk menetapkan variabel lingkungan penting ini. Ganti nilai placeholder dengan detail project Anda yang sebenarnya:

Pertama, ekspor URL repositori GitHub Anda:

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

Kemudian, ekspor variabel lingkungan yang tersisa:

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

Pastikan struktur terlihat benar:

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. Buat file lingkungan backend

Pertama, ekspor kunci Gemini API Anda:

export GEMINI_API_KEY=YOUR_GEMINI_API_KEY_FROM_STEP_2

Kemudian, buat file .env:

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

C. Aktifkan Firebase App Check / Akun Layanan (untuk Cloud Run)

Saat berjalan di Cloud Run, backend menggunakan Kredensial Default Aplikasi untuk berkomunikasi dengan Firebase — tidak memerlukan file kunci akun layanan. Panggilan firebase_admin.initialize_app() di backend/main.py akan otomatis mengambilnya.

Untuk pengembangan lokal, lakukan autentikasi sekali:

gcloud auth application-default login

D. Buat file konfigurasi aplikasi Firebase

Di direktori frontend/, buat firebase-applet-config.json dengan konfigurasi Anda dari langkah sebelumnya:

{
  "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)"
}

Catatan: firestoreDatabaseId harus cocok dengan ID database yang Anda buat pada langkah sebelumnya. Jika Anda menggunakan default, biarkan sebagai "(default)".

Lakukan perubahan kembali ke repositori Anda:

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

C. Menjalankan DinoQuest secara lokal

1. Aktifkan API yang diperlukan

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. Mulai DinoQuest

Skrip start.sh membangun frontend React dan menyerahkan terminal ke backend FastAPI, yang melayani file statis yang dikompilasi:

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

Buka http://localhost:8000 di browser Anda. Anda akan melihat layar judul DinoQuest. Login dengan Google, buat dinosaurus pertama Anda, dan konfirmasi bahwa dinosaurus tersebut disimpan ke Firestore.

Pemecahan masalah: Jika Anda melihat halaman kosong atau error autentikasi Firebase, periksa kembali apakah frontend/firebase-applet-config.json memiliki nilai yang benar dan localhost ada dalam daftar domain yang diizinkan.

E. Men-deploy DinoQuest ke Cloud Run

1. Menetapkan project Anda

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

3. Membuat repositori Artifact Registry

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

4. Menyimpan kunci Gemini API di 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. Bangun image container dengan Cloud Build

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

Tindakan ini akan menjalankan Dockerfile multi-tahap: membangun aplikasi React terlebih dahulu, lalu mengemas output ke dalam image FastAPI. Memerlukan waktu sekitar 3–5 menit.

6. Men-deploy ke Cloud Run

Pertama, ekspor email admin Anda:

export ADMIN_EMAIL=<YOUR_TEST_ACCOUNT_EMAIL>

Kemudian, deploy layanan:

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"

Setelah perintah selesai, Cloud Run akan mencetak Service URL. Salin URL ini — Anda akan memerlukannya untuk mengotorisasi domain di Firebase.

7. Memberikan otorisasi domain Cloud Run di Firebase

Agar pengguna dapat login dari aplikasi yang di-deploy, Anda harus menambahkan URL Cloud Run ke domain resmi Firebase:

  1. Kembali ke Firebase consoleAuthentication → Settings → Authorized domains
  2. Klik Tambahkan domain.
  3. Tempelkan URL layanan Cloud Run Anda (misalnya, dinoquest-xxxxx.us-central1.run.app) — hapus awalan https://
  4. Klik Simpan

8. Menambahkan Data Papan Peringkat

Untuk memberikan "kehidupan" awal pada game Anda dan memastikan agen Anda memiliki data, Anda dapat mengisi papan peringkat dengan beberapa skor awal.

  1. Pastikan Anda berada di direktori root dinoquest:
    cd ~/dinoquest
    
  2. Buat dan aktifkan lingkungan virtual:
    python3 -m venv venv
    source venv/bin/activate
    
  3. Instal dependensi Firestore yang diperlukan:
    pip install google-cloud-firestore
    
  4. Jalankan skrip pengisian data:
    python3 prep/seed_scores.py
    
  5. Nonaktifkan lingkungan virtual:
    deactivate
    

Sekarang Anda dapat membuka URL Layanan di browser — DinoQuest sudah sepenuhnya aktif.

4. Menyiapkan Dino Theater

Peran Agen: Visualizer. Bagaimana cara memantau tim agen otonom? Dino Theater memberikan jendela real-time ke dalam pikiran sekelompok agen Anda. Daripada menatap log terminal, Anda dapat melihat agen Anda bernalar, saling memanggil, dan menjalankan tugas di seluruh cloud dalam dasbor visual live.

Ringkasan

A. Men-deploy Dino Theater ke Cloud Run

Pertama, kembali ke direktori utama Anda dan clone kode Dino Theater:

cd ~
git clone https://github.com/gca-americas/dinoquest-theater.git
cd dinoquest-theater
  1. Buat dan kirim container:
    gcloud builds submit --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest .
    
  2. Menyiapkan Akun Layanan & Izin:
    # 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. Deploy aplikasi:
    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
    
    Catatan: --min-instances=1 direkomendasikan untuk menjaga koneksi SSE tetap aktif di antara peristiwa.
  4. Verifikasi apakah berfungsi: Buka URL Layanan yang di-deploy di browser Anda (misalnya, https://dino-theater-xxx-uc.a.run.app/demo).

5. Agentic DevOps di IDE

Peran Agen: Antigravitasi Native. Untuk menjembatani kesenjangan antara IDE dan cloud, kita menghubungkan Antigravity ke server MCP Terkelola Google Cloud. Dengan demikian, agen native Anda dapat ‘melihat' project Anda, sehingga dapat mem-parsing log, memeriksa metrik, dan memahami infrastruktur tanpa Anda harus mengelola kunci API atau beralih konteks ke konsol.

Sebelum menjalankan keterampilan apa pun, Anda perlu mengonfigurasi akses Antigravity ke Google Cloud dan memuat buku pedoman keterampilan DinoQuest.

A. Menginstal layanan MCP Terkelola Google

Layanan MCP Terkelola Google menyediakan akses ke semua Google Cloud API melalui satu endpoint yang dihosting.

Lakukan autentikasi menggunakan Kredensial Default Aplikasi:

gcloud auth application-default login

B. Mengonfigurasi mcp_config.json

Buat atau perbarui mcp_config.json di direktori konfigurasi Antigravity (biasanya ~/.gemini/antigravity/mcp_config.json). atau dari konsol. Hal ini memberi Antigravity akses ke alat Google Cloud dan GitHub yang dibutuhkan oleh keterampilan tersebut:

{
  "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. Memuat keahlian ke Antigravity (Opsional)

Antigravity menemukan keterampilan di direktori standar tertentu. Salin keterampilan DinoQuest dari repositori yang di-clone ke folder keterampilan Antigravity global:

# 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. Mulai Ulang Antigravity(Opsional)

Untuk menerapkan perubahan mcp_config.json dan memuat keterampilan yang baru disalin, mulai ulang aplikasi Antigravity.

Setelah dimulai ulang:

  1. Pastikan server MCP google dan github menampilkan status "Terhubung" berwarna hijau di Setelan.
  2. Pastikan keterampilan DinoQuest muncul dalam daftar keterampilan Anda.

Catatan: Setiap keterampilan memiliki tabel ## Configuration di bagian atas SKILL.md-nya. Setelah menyalin, Anda harus memperbarui nilai di ~/.gemini/antigravity/skills//SKILL.md agar sesuai dengan project Anda.

E. Memperbaiki layanan cloud di IDE lokal

  1. Memicu error: Buka URL DinoQuest yang di-deploy (dari langkah terakhir) di browser Anda.
  2. Buka Papan Peringkat: Klik tombol Papan Peringkat. Implementasi papan peringkat saat ini sengaja dibuat tidak efisien—papan peringkat akan mencoba memuat data dalam jumlah besar ke dalam memori, sehingga memicu error Kehabisan Memori (OOM).
  3. Di Antigravity Agent Manager (Agent HUB), minta bantuan untuk memulihkan error dan kemungkinan memperbaiki penyebab utamanya.
  • perintah 1: Cari tahu masalah yang terjadi pada dinoquest.
  • Perintah 2: Dapatkah Anda melihat kode untuk game Dinoquest dan memperbaiki penyebab error kehabisan memori?

6. Melakukan streaming log ke BigQuery dan membuat analisis

Peran Agen: Agen Data. Mengubah log mentah menjadi strategi produk yang dapat ditindaklanjuti tidak boleh memerlukan waktu berjam-jam untuk pemrosesan data manual. Dengan menggunakan Data Agent Kit dan MCP BigQuery, kami membuat pipeline 'Zero ETL' yang mengalirkan log langsung ke BigQuery, sehingga memungkinkan agen membuat dasbor analisis premium dalam waktu kurang dari dua menit.

Kumpulan keterampilan log-router-bq-report menyiapkan sink Cloud Logging yang terus-menerus mengalirkan log Cloud Run DinoQuest ke BigQuery, lalu mengkueri data untuk menghasilkan laporan traffic dan insight analisis game.

Ringkasan

A. Mengonfigurasi variabel skill

Buka skills/log-router-bq-report/SKILL.md di repo DinoQuest Anda dan perbarui bagian Configuration di bagian atas:

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

B. Menjalankan keahlian di Antigravity

Buka Antigravity dengan repo DinoQuest sebagai konteks dan beri tahu Gemini:

Run the log-router-bq-report skill

Keterampilan ini akan:

  1. Menyelesaikan project GCP secara otomatis
  2. Periksa apakah sink BigQuery sudah ada — jika tidak, sink tersebut akan membuat set data dan sink.
  3. Memberi izin IAM: Tindakan ini akan memberi writerIdentity sink peran BigQuery Data Editor pada set data.

Catatan: Sama seperti sink Eventarc, Anda mungkin melihat peringatan dari gcloud selama proses ini: "Jangan lupa untuk memberikan peran BigQuery Data Editor pada set data ke serviceAccount:service-...." Skill akan menanganinya secara otomatis.

C. Menggunakan Antigravity untuk membuat laporan

Cukup minta Antigravity untuk "menyiapkan sink log BigQuery dan membuat laporan analisis". Agen akan:

  1. Konfigurasi Infrastruktur: Buat set data BigQuery dan sink Cloud Logging.
  2. Kelola Izin: Memberikan peran IAM yang diperlukan secara otomatis ke identitas penulis sink.
  3. Buat Insight: Menganalisis log dan menghasilkan dasbor HTML interaktif premium dengan telemetri game dan analisis rasio kemenangan.

7. Agen Perbaikan Mandiri

Peran Agen: Agen SRE. Jika layanan produksi gagal pada pukul 02.00, Anda tidak perlu bangun. Agen ini bertindak sebagai responden pertama Anda. Dipicu oleh log error Cloud Run melalui Eventarc, alat ini otomatis menganalisis error, menyarankan perbaikan, dan memulai pipeline perbaikan—semuanya sebelum Anda login ke konsol.

DinoAgent adalah agen ADK yang memantau log error Cloud Run melalui Eventarc, mendiagnosis penyebab masalah, dan melakukan perbaikan otomatis — baik dengan meningkatkan memori, mengembalikan traffic, atau mengajukan PR perbaikan kode di GitHub.

Ringkasan

A. Buat clone repositori Remediation Agent

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

Struktur project:

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. Menyiapkan akses GitHub (jalur perbaikan kode)

Jalur perbaikan kode meng-clone repo DinoQuest Anda, membaca file sumber, menerapkan patch, dan membuka PR. Token ini memerlukan Token Akses Pribadi GitHub dengan cakupan repo.

  1. Buka github.com/settings/tokensGenerate new token (classic)
  2. Beri nama, pilih cakupan repoBuat token → salin token

Simpan di Secret Manager:

Pertama, ekspor token GitHub Anda:

export GH_TOKEN=ghp_YOUR_TOKEN_HERE

Kemudian, buat secret:

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

C. Menyiapkan notifikasi Slack (opsional)

Setelah perbaikan selesai, DinoAgent akan memposting ringkasan ke saluran Slack.

  1. Buka api.slack.com/appsCreate New App → From scratch
  2. Beri nama DinoAgent, pilih ruang kerja Anda → Buat Aplikasi
  3. Di bagian FiturWebhook Masuk → aktifkan
  4. Klik Add New Webhook to Workspace → pilih saluran → Izinkan
  5. Salin URL webhook (https://hooks.slack.com/services/...)

Simpan di 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. Buat akun layanan 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

Berikan akses ke secret:

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

E. Membangun dan men-deploy DinoAgent ke Cloud Run

# 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. Hubungkan pemicu Eventarc

Buat topik Pub/Sub untuk menerima log error Cloud Run:

gcloud pubsub topics create cloud-run-errors

Buat sink Cloud Logging yang memfilter log error dari layanan dinoquest dan merutekannya ke topik:

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"

Catatan: Saat Anda menjalankan perintah di atas, gcloud akan mencetak pesan Info yang menyatakan: "Jangan lupa untuk memberikan peran Pub/Sub Publisher pada topik ke serviceAccount:service-...." Langkah berikutnya akan menangani hal tersebut.

Beri identitas penulis sink (akun layanan yang disebutkan dalam peringatan) izin untuk memublikasikan:

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"

Pastikan sudah aktif:

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

Beri Eventarc izin untuk memanggil agen perbaikan:

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

Buat pemicu 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}

Perbaikan kini sepenuhnya otomatis. Selain hanya menskalakan infrastruktur, DinoAgent melakukan analisis akar masalah yang mendalam pada kode aplikasi, menerapkan patch semantik, dan menggunakan komunikasi Agent-to-Agent (A2A) untuk menyerahkan perbaikan ke CI Agent untuk verifikasi dan deployment. Anda dapat mempelajari detail penerapan di codebase reme-agent.

8. Menyiapkan agen CI

Peran Agen: Pipeline CI. Berhenti bergelut dengan file YAML yang kompleks dan skrip build manual. Agen ini mengelola infrastruktur operasional PR Anda. Alat ini membaca perubahan kode Anda, memahami konteks, menentukan cakupan pengujian yang diperlukan, dan membangun image Docker Anda melalui Cloud Build, sehingga memastikan setiap commit "disetujui agen" sebelum mencapai cabang utama.

ci-agent adalah agen pipeline CI otonom yang di-deploy sebagai layanan Cloud Run. Skrip ini mengirimkan build Docker ke Cloud Build, melakukan polling untuk penyelesaian, memverifikasi image di Artifact Registry, dan melaporkan ke GitHub.

Ringkasan

Mengapa menggunakan agen untuk pipeline CI? Tidak seperti skrip statis tradisional, pipeline CI agentik menyediakan:

  1. Klasifikasi Cakupan Kognitif (Cognitive Scope Classification): Secara cerdas, fitur ini menentukan kedalaman pengujian yang diperlukan—beralih antara pemeriksaan jenis, pengujian unit, atau rangkaian integrasi lengkap—berdasarkan dampak semantik perubahan kode Anda.
  2. Pengelolaan PR secara Otonom: Agen dapat membuat PR secara otomatis, memposting ringkasan perubahan yang mendetail, dan bahkan mengelola pemindaian rahasia dan audit keamanan tanpa intervensi manusia.
  3. Diagnosis Kegagalan Real-time: Saat build gagal, agen tidak hanya menampilkan log; agen menganalisis stack trace, mengidentifikasi kemungkinan penyebab, dan memposting diagnosis yang dapat dibaca manusia langsung ke PR.

A. Buat clone repositori CIAgent

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

B. Buat akun layanan 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. Menghubungkan repositori GitHub ke Cloud Build

CIAgent mengirimkan build melalui repoSource, yang mengharuskan repositori GitHub terhubung ke Cloud Build Developer Connect.

  1. Buka GCP Console → Cloud Build → Repositories
  2. Klik Connect Repository.
  3. Pilih GitHub (Cloud Build GitHub App).
  4. Beri otorisasi dan pilih repositori YOUR_GITHUB_USERNAME/dinoquest Anda
  5. Klik Hubungkan dan Lewati saat diminta untuk membuat pemicu.
  6. Catat nama koneksi Anda (defaultnya biasanya nama pengguna GitHub Anda atau yang serupa).

D. Memberikan akses CIAgent ke secret

Kita akan menggunakan kembali secret yang dibuat sebelumnya untuk 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. Membangun dan men-deploy CIAgent ke 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. Penyiapan perintah garis miring Slack

  1. Buka api.slack.com/appsCreate New AppFrom scratch
  2. Beri nama CIAgent, pilih ruang kerja Anda → Buat Aplikasi
  3. Di bagian FiturPerintah Garis MiringBuat Perintah Baru
  4. Perintah: /runci
  5. URL permintaan: URL Cloud Run CIAgent Anda dari atas dengan /slack ditambahkan (mis. https://ci-agent-xxx-.us-central1.run.app/slack)
  6. Deskripsi singkat: Trigger CI
  7. Simpan
  8. Di bagian SetelanInstal Aplikasi, klik Instal ke Workspace dan Izinkan.

Agen CI bertindak sebagai "otak" yang berada di atas layanan Google Cloud yang andal seperti Cloud Build dan Artifact Registry. Setelah build diverifikasi, build akan memicu fase deployment akhir dengan memanggil Agen CD melalui A2A, sehingga memastikan penyerahan yang lancar antara siklus build dan rilis.

9. Menyiapkan Deployment

Peran Agen: Agen CD. Deployment tidak boleh menjadi sesuatu yang tidak pasti. Agen ini mengelola risiko untuk Anda. Layanan ini menilai keamanan deployment, mengelola pemisahan traffic canary, dan memantau metrik real-time untuk memutuskan apakah akan mempromosikan rilis atau mengembalikannya. Ini adalah penjaga gerbang terakhir dalam swarm agen otonom Anda.

cd-agent adalah agen deployment canary otonom yang di-deploy sebagai layanan Cloud Run. Layanan ini menerima permintaan deployment A2A dari ci-agent, menghitung skor risiko, menetapkan persentase canary yang dikalibrasi risiko, memantau metrik, dan mempromosikan atau mengembalikan secara otomatis. Aplikasi ini juga belajar dari deployment sebelumnya menggunakan Firestore.

Ringkasan

Menghubungkan agen secara langsung akan membuat "pipeline kognitif" di mana setiap pengalihan adalah transfer intent dan konteks yang kaya. Berbeda dengan webhook tradisional, komunikasi A2A memungkinkan:

  1. Berbagi Konteks Cerdas: Agen meneruskan seluruh memori sesi, perbedaan PR, dan skor risiko, sehingga memastikan agen berikutnya memiliki "alasan" lengkap sebelum memulai pekerjaan.
  2. Cognitive Handshakes: Agen dapat menegosiasikan gerbang. Misalnya, CD Agent dapat meminta pengujian ringan tertentu dari CI Agent selama peluncuran canary untuk memverifikasi perbaikan secara real-time.
  3. Perbaikan Kolaboratif: Jika deployment gagal, Agen CD dapat secara proaktif memberi tahu Agen Perbaikan dengan metrik yang gagal, sehingga memulai analisis penyebab masalah secara otonom bahkan sebelum operator manusia dihubungi.
  4. Negosiasi Resource: Agen dapat menegosiasikan kebutuhan infrastruktur. Misalnya, Agen CI dapat meminta Agen Remediasi untuk menyediakan kapasitas build yang lebih besar jika mendeteksi refaktor skala besar, atau Agen CD dapat menyarankan penskalaan cluster produksi sebelum rilis besar.
  5. Konsensus Multi-Agen: Untuk perubahan berisiko tinggi, beberapa agen (misalnya, Agen Keamanan dan Agen CD) dapat melakukan "persetujuan bersama" melalui A2A, sehingga memastikan bahwa kode tidak hanya dibuat dan di-deploy, tetapi juga mematuhi kebijakan keamanan sebelum masuk ke produksi.

A. Buat clone repositori CDAgent

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

B. Membuat Database Firestore

CDAgent menyimpan pola memori deployment-nya di Firestore:

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

(Jika Anda sudah membuat database dalam project ini, Anda dapat melewati langkah ini.)

C. Buat akun layanan 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. Memberikan akses CDAgent ke secret

Kita akan menggunakan kembali token GitHub dan webhook Slack dari sebelumnya, serta memberikan akses akun layanan komputasi Cloud Run ke Kunci API Gemini agar aplikasi yang di-deploy dapat menggunakannya:

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. Membangun dan men-deploy CDAgent ke 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

Catatan: --min-instances=1 --no-cpu-throttling menjaga instance tetap aktif sehingga dapat merespons perintah Slack dan A2A dengan cepat.

Agen CD adalah penjaga terakhir lingkungan produksi Anda. Sistem ini mengevaluasi risiko setiap deployment, menjalankan canary yang dikalibrasi risiko, dan memantau metrik real-time. Jika ada anomali yang terdeteksi, sistem akan memulai rollback otomatis.

10. Meningkatkan Skala: Membuka Level 2 dengan Agent Swarm

A. Menguji Full Swarm

  1. Memicu error: Buka URL DinoQuest yang di-deploy (dari langkah terakhir) di browser Anda.
  2. Buka Papan Peringkat: Klik tombol Papan Peringkat. Implementasi papan peringkat saat ini sengaja dibuat tidak efisien—papan peringkat akan mencoba memuat data dalam jumlah besar ke dalam memori, sehingga memicu error Kehabisan Memori (OOM).
  3. Menunggu Agen: Dalam waktu sekitar 60 detik, remediation-agent akan menerima peristiwa error melalui Eventarc dan memulai diagnosisnya.
  4. Periksa Slack: Anda akan melihat notifikasi di saluran Slack yang terlihat seperti ini:Ringkasan Perbaikan DinoAgent
    • Layanan: dinoquest
    • Revisi yang gagal: dinoquest-xxxx-xxxx
    • Bukti: "Batas memori 128 MiB terlampaui dengan 13x MiB yang digunakan."
    • Alasan revisi ini buruk: Endpoint /api/leaderboard tidak efisien xxxxx, sehingga menyebabkan error OOM.
    • Tindakan yang dilakukan: Meningkatkan memori dari xMi menjadi yGi untuk layanan dinoquest. Revisi baru telah dibuat.
    • PR penyebab masalah: https://github.com/YOUR_USERNAME/DinoQuest/pull/x
  5. Verifikasi perbaikan:
    • GitHub: Periksa repositori Anda untuk menemukan cabang baru dan Permintaan Pull. Agen telah menambal kode aplikasi untuk memperbaiki kebocoran memori yang mendasarinya.
    • Cloud Run: Di GCP Console, Anda akan melihat revisi baru layanan dinoquest dengan alokasi memori yang diperbarui.
    • Papan Peringkat: Coba papan peringkat lagi—sekarang papan peringkat akan berhasil dimuat berkat peningkatan memori dan perbaikan kode.

B. Evolusi: Menerapkan Logika Game Level 2

Anda akan menambahkan fitur baru yang signifikan: Level 2 (Penghancur Asteroid). Hal ini memungkinkan dinosaurus dengan skor tinggi untuk melanjutkan ke mode game baru.

  1. Kembali ke repositori dinoquest Anda:
    cd ~/dinoquest
    
  2. Buat dan beralih ke cabang baru:
    git checkout -b level_2
    
  3. Terapkan patch Level 2: Jalankan skrip yang disediakan untuk menerapkan patch pada codebase lokal Anda dengan aset, komponen, dan logika game Level 2:
    bash level_2_backup/levelup.sh
    
  4. Commit dan kirim perubahan:
    git add .
    git commit -m "feat: add Level 2"
    git push origin level_2
    

Daripada menggunakan curl untuk memicu agen secara manual, kita akan menggunakan Perintah Slash Slack yang Anda konfigurasi sebelumnya. Berikut cara berinteraksi dengan pipeline CI otonom dalam skenario dunia nyata.

  1. Buka Slack dan buka channel tempat aplikasi CIAgent diinstal.
  2. Picu build CI dengan mengetik perintah berikut:
    /runci run ci on branch level_2
    
  3. Memantau progres:
    • Slack: Agen akan mengonfirmasi perintah Anda dan memposting update saat build berlangsung.
    • Dino Theater: Tonton "balon pikiran" saat agen mengklasifikasikan perubahan, mengirimkan tugas Cloud Build, dan berkomunikasi dengan agen CD.
    • GitHub: Periksa PR level_2 Anda; Anda akan melihat agen memposting status commit dan komentar laporan CI lengkap.
  4. Tonton prosesnya:
    • Periksa Dino Theater untuk melihat Agen CI berpikir, mengklasifikasikan perubahan, dan menjalankan pipeline.
    • Periksa PR GitHub Anda untuk melihat Agen CI memposting status commit dan laporan akhir.

11. Kesimpulan

Anda telah membangun stack DevOps agentik lengkap di Google Cloud:

Komponen

Fungsinya

DinoQuest (Cloud Run dinoquest)

Game yang didukung Gemini — Frontend React + backend FastAPI

Firebase Auth + Firestore

Autentikasi pengguna dan penyimpanan profil dinosaurus

Remediation Agent (Cloud Run + Eventarc)

Agen SRE yang secara otomatis memperbaiki error OOM dan bug kode

log-router-bq-report

Agen data yang melakukan streaming log ke BigQuery dan menghasilkan insight

CIAgent (Cloud Run)

Agen CI yang mencakup pengujian, membangun image, dan memanggil CD melalui A2A

CDAgent (Cloud Run)

Agen CD yang menjalankan deployment canary dengan skor risiko dan rollback otomatis

Semua perilaku Agen berada di direktori skills/ sebagai playbook Markdown — ubah perilaku dengan mengedit skill, bukan kode. Keahlian berjalan di Antigravity dengan Gemini dan dipanggil dengan memberi tahu agen keahlian mana yang akan dijalankan.