1. Genel Bakış
İkinci güne hoş geldiniz. Uygulama oluşturup "Yayınla"yı tıklamak sihirli bir an olsa da gerçek dünyadaki trafik, gerçek dünyadaki hataları da beraberinde getirir. Günlerinizi YAML ile uğraşarak veya günlükleri inceleyerek geçirmek yerine, operasyonel altyapıyı sizin için yönetecek uzmanlaşmış bir aracı grubu oluşturabilirsiniz. Bu codelab'de, Google Cloud'un birleşik yığınının (Eventarc, Cloud Run, Firestore, Cloud Build, BigQuery) aracıların gizli dizeleri güvenli bir şekilde getirmesini, günlükleri yayınlamasını ve sorunları kullanıma hazır şekilde düzeltmesini nasıl kolaylaştırdığı gösterilmektedir.

Bu codelab'de, Gemini destekli bir dinozor macera oyunu olan DinoQuest'i sıfırdan oluşturacak ve tamamen temsilci tabanlı bir CI/CD ardışık düzenine bağlayacaksınız. Bu kursun sonunda:
- Cloud Run'da çalışan bir DinoQuest web uygulaması (hizmet adı:
dinoquest) - Cloud Run günlüklerini BigQuery'ye aktaran ve etkileşimli bir oyun analizleri kontrol paneli oluşturan bir günlük analizi ardışık düzeni
- Düzeltme Aracısı (
remediation-agent): Cloud Run hatalarını izleyen ve bunları otomatik olarak düzelten bir ADK düzeltme aracısıdır. Eventarc tarafından tetiklenen kendi Cloud Run hizmeti olarak dağıtılır. - PR farkınızı okuyan, testleri akıllıca kapsamlandıran, Cloud Build aracılığıyla Docker görüntüsü oluşturan ve GitHub'a geri bir commit durumu yayınlayan bir CI aracısı (
ci-agent) - Dağıtım riskini puanlayan, trafiği bölen, metrikleri izleyen ve otomatik olarak tanıtım yapan veya geri alan bir CD aracısı
Neler öğreneceksiniz?
- Cloud Run'da tam yığınlı bir Vite + FastAPI uygulamasını tek bir kapsayıcı olarak dağıtma
- Firebase Auth ve Firestore'u React uygulaması için yapılandırma
- Eventarc aracılığıyla Pub/Sub etkinliklerine tepki veren bir ADK aracısı oluşturma ve dağıtma
- Cloud Run günlüklerini BigQuery'ye yönlendirme ve oyun analizlerini sorgulama
- CI ve canary dağıtımı için etkili beceriler yazma
İhtiyacınız olanlar
- Faturalandırmanın etkin olduğu bir Google Cloud projesi
- Bir Firebase projesi (aynı GCP projesi olabilir)
- GitHub hesabı ve DinoQuest deposunun bir fork'u
- Gemini ile Antigravity'ye (Google'ın aracı çalıştırıcısı) erişim
gcloudKSA'nın yüklendiğinden ve kimliğinizin doğrulandığından emin olun. Yükleme talimatlarını aşağıda bulabilirsiniz.node≥ 18 venpmpython3≥ 3.11gitvegh(GitHub CLI)
gcloud CLI'yı yükleme
macOS
brew install --cask google-cloud-sdk
Alternatif olarak, yükleyiciyi cloud.google.com/sdk/docs/install adresinden indirebilirsiniz.
Windows
winget install Google.CloudSDK
Alternatif olarak, Windows yükleyicisini (.exe) cloud.google.com/sdk/docs/install adresinden indirip çalıştırabilirsiniz.
Yükledikten sonra başlatın ve kimlik doğrulayın:
gcloud init
gcloud auth login
gcloud auth application-default login
2. Firebase'i ayarlama
Her temsilcinin akıl yürütmek için verilere ihtiyacı vardır. DinoQuest, Firestore ve Firebase Auth'u kullanarak, temsilcilerimizin daha sonra doğal dili kullanarak keşfedeceği, inceleyeceği ve güncelleyeceği üretime hazır bir veri katmanı sağlar.
Bu uygulama AI Studio üzerinden oluşturulduğu için Firebase ile yoğun bir şekilde entegre edilmiştir. Firebase kullanmanın çeşitli avantajları vardır. Bunların başında, önceden güvenliği sağlanmış bir mimari ve kutudan çıktığı gibi yönetilen veri erişimi gelir. Bu sayede oyununuzun durumu ilk günden itibaren korunur.
C. Firebase projesi oluşturma
- console.firebase.google.com adresine gidin.
- Proje ekle'yi tıklayın (Yeni proje oluşturma seçeneğinde gizlidir) → mevcut GCP projenizi seçin (veya yeni bir proje oluşturun).
- İstendiğinde Google Analytics'i devre dışı bırakın → Proje oluştur'u tıklayın (veya varsayılan ayarı kullanabilirsiniz).
B. Google kimlik doğrulamayı etkinleştirme
- Firebase konsolunda Güvenlik → Kimlik doğrulama (Başlayın) → Oturum açma yöntemi'ne gidin.
- Google'ı tıklayın → Etkinleştir'i açın → destek e-posta adresinizi kaydedin → Kaydet'i tıklayın.
C. Yerel ana makineyi yetkilendirilmiş alan olarak ekleme
- Hâlâ Authentication (Kimlik Doğrulama) bölümündeyken Settings (Ayarlar) sekmesini tıklayın.
- Yetkilendirilmiş alanlar bölümünde
localhostalanının listelendiğini doğrulayın (varsayılan olarak listelenir).
D. Firestore veritabanı oluşturma
- Veritabanı ve Depolama → Firestore Veritabanı → Veritabanı oluştur'a gidin.
- Standard Edition → Next'i (Standart Sürüm → Sonraki) seçin.
- Bölgeyi seçin
us-central1(veya Cloud Run bölgenizle eşleştirin) - Üretim modunda başlat → Oluştur'u seçin.
Oluşturduktan sonra Veritabanı kimliğinizi not edin. Adlandırmadıysanız (default) gibi görünür.
E. Firebase Güvenlik Kurallarını ayarlama
Firestore Database → Rules (Firestore Veritabanı → Kurallar) bölümünde varsayılan kuralları aşağıdakilerle değiştirin:
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;
}
}
}
Yayınla'yı tıklayın.
F. Web uygulaması ekleme ve yapılandırmayı alma
- Proje ayarları (dişli simgesi) → Genel sekmesine gidin.
- Uygulamalarınız'a gidin → Uygulama ekle'yi tıklayın → Web simgesini (
) seçin. - Adlandırın
dinoquest→ Uygulamayı kaydet - Gösterilen
firebaseConfignesnesini kopyalayın. Biraz sonra bu nesneye ihtiyacınız olacak.
3. Oyunu çalıştırma
Temsilcinin Rolü: Çevre. Ajanlarımızı çalışmaya başlamadan önce yönetebilecekleri bir dünyaya ihtiyacımız var. Bu adımda, DinoQuest'in "İlk Gün" sürümünü dağıtacağız. Bu işlem, sürümüzün daha sonra keşfedip yöneteceği canlı hizmeti, günlükleri ve durumu oluşturur.

Aşağıdaki iki seçenekten birini belirleyin. Sonraki her adımda aynı şekilde kullanacağınız bir GEMINI_API_KEY oluşturur. Başka değişiklik yapmanız gerekmez.
C. Gemini API anahtarını ayarlama
A seçeneği: Vertex AI Gemini API anahtarı (GCP projeniz varsa önerilir)
Vertex AI, projenin varsayılan hizmet hesabını kullanarak doğrudan GCP projenize bağlı ve bu proje üzerinden faturalandırılan bir Gemini API anahtarı oluşturmanıza olanak tanır. Ayrı bir AI Studio hesabı gerekmez.
- GCP proje kimliğinizi dışa aktarın:
export PROJECT_ID=<YOUR_PROJECT_ID> - Gerekli API'leri etkinleştirin ve Compute Engine varsayılan hizmet hesabına gerekli izinleri verin:
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 - Cloud Console'da Vertex AI API anahtarları sayfasını açın.
- Kimlik bilgileri oluştur'u tıklayın → API anahtarı'nı seçin.
- Oluşturma iletişim kutusunda:
- Anahtara
Dino_Keyadını verin. - API çağrılarını bir hizmet hesabı üzerinden doğrulayın kutusunu işaretleyin.
- Hizmet hesabı bölümünde varsayılan Compute hizmet hesabını (
PROJECT_NUMBER-compute@developer.gserviceaccount.com) seçin. - API kısıtlamalarını seçin bölümüne geri dönün ve GEMINI API'yi işaretleyin.
- Oluştur'u tıklayın
- Anahtara
- Oluşturulan anahtarı kopyalayın.
B seçeneği: AI Studio (yerel geliştirme için en hızlı yöntem)
- aistudio.google.com adresini açın.
- Sol kenar çubuğunda Get API key'i (API anahtarını al) tıklayın.
- API anahtarı oluştur'u tıklayın → GCP projenizi seçin → anahtarı kopyalayın.
Sonraki adımlarda tuşlardan biri GEMINI_API_KEY olarak ayarlanır. Arka uç, tuşları aynı şekilde işler.
Depoyu klonlama
Kurs deposu https://github.com/gca-americas/dinoquest konumunda bulunur. Lütfen önce kendi GitHub hesabınıza fork edin. Bunun yerine, temsilcinin deponuz üzerinde çalışmasını sağlayacağız.
Çatal oluşturduktan sonra, çatal oluşturduğunuz DinoQuest deposunun main dalını klonlayın ve proje dizinine girin:
git clone https://github.com/YOUR_GITHUB_USERNAME/dinoquest.git
cd dinoquest
B. Ortam değişkenlerini ayarlama
Bu codelab sırasında açtığınız her yeni bash terminalinde bu temel ortam değişkenlerini ayarladığınızdan emin olun. Yer tutucu değerleri, gerçek proje ayrıntılarınızla değiştirin:
Öncelikle GitHub depo URL'nizi dışa aktarın:
export GITHUB_REPO_URL=https://github.com/YOUR_GITHUB_USERNAME/dinoquest
Ardından, kalan ortam değişkenlerini dışa aktarın:
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
Yapının doğru göründüğünü onaylayın:
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. Arka uç ortamı dosyasını oluşturma
Öncelikle Gemini API anahtarınızı dışa aktarın:
export GEMINI_API_KEY=YOUR_GEMINI_API_KEY_FROM_STEP_2
Ardından .env dosyasını oluşturun:
cat > backend/.env <<EOF
GEMINI_API_KEY=$GEMINI_API_KEY
GOOGLE_GENAI_USE_VERTEXAI=False
GOOGLE_CLOUD_PROJECT=$PROJECT_ID
EOF
C. Firebase Uygulama Kontrolü / Hizmet Hesabı'nı (Cloud Run için) etkinleştirme
Arka uç, Cloud Run'da çalışırken Firebase ile iletişim kurmak için Uygulama Varsayılan Kimlik Bilgileri'ni kullanır. Hizmet hesabı anahtar dosyası gerekmez. backend/main.py numaralı telefonda firebase_admin.initialize_app() araması otomatik olarak yanıtlanır.
Yerel geliştirme için bir kez kimlik doğrulayın:
gcloud auth application-default login
D. Firebase uygulama yapılandırma dosyasını oluşturun
frontend/ dizininde, önceki adımdaki yapılandırmanızla firebase-applet-config.json dosyasını oluşturun:
{
"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)"
}
Not: firestoreDatabaseId, önceki adımda oluşturduğunuz veritabanı kimliğiyle eşleşmelidir. Varsayılanı kullandıysanız "(default)" olarak bırakın.
Değişiklikleri deponuza geri gönderin:
git add frontend/firebase-applet-config.json
git commit -m "chore: add firebase config"
git push origin main
C. DinoQuest'i yerel olarak çalıştırma
1. Gerekli API'leri etkinleştirme
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'i başlatma
start.sh komut dosyası, React ön ucunu oluşturur ve derlenmiş statik dosyaları sunan FastAPI arka ucuna terminali teslim eder:
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
Tarayıcınızda http://localhost:8000 adresini açın. DinoQuest başlık ekranını görmelisiniz. Google ile oturum açın, ilk dinozorunuzu oluşturun ve Firestore'a kaydedildiğini onaylayın.
Sorun giderme: Boş bir sayfa veya Firebase kimlik doğrulama hataları görüyorsanız frontend/firebase-applet-config.json değerlerinin doğru olduğundan ve localhost değerinin yetkili alanlar listesinde bulunduğundan emin olun.
E. DinoQuest'i Cloud Run'a dağıtma
1. Projenizi ayarlama
export PROJECT_ID=$(gcloud config get-value project)
3. Artifact Registry deposu oluşturma
gcloud artifacts repositories create dinoquest \
--repository-format=docker \
--location=$CLOUD_RUN_REGION \
--description="DinoQuest container images"
4. Gemini API anahtarını Secret Manager'da saklama
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 ile container görüntüsünü oluşturma
gcloud builds submit \
--tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest .
Bu komut, çok kademeli Dockerfile'ı çalıştırır: Önce React uygulamasını oluşturur, ardından çıktıyı FastAPI görüntüsüne paketler. Yaklaşık 3-5 dakika sürer.
6. Cloud Run'a dağıt
Öncelikle yönetici e-posta adresinizi dışa aktarın:
export ADMIN_EMAIL=<YOUR_TEST_ACCOUNT_EMAIL>
Ardından hizmeti dağıtın:
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"
Komut tamamlandığında Cloud Run, Hizmet URL'si yazdırır. Bu URL'yi kopyalayın. Alanı Firebase'de yetkilendirmek için bu URL'ye ihtiyacınız olacak.
7. Firebase'de Cloud Run alanına yetki verme
Kullanıcıların dağıtılan uygulamanızdan oturum açmasına izin vermek için Cloud Run URL'sini Firebase'in yetkili alanlarına eklemeniz gerekir:
- Firebase konsolu → Kimlik Doğrulama → Ayarlar → Yetkili alanlar'a geri dönün.
- Alan ekle'yi tıklayın.
- Cloud Run hizmeti URL'nizi (ör.
dinoquest-xxxxx.us-central1.run.app) yapıştırın.https://önekini kaldırın. - Kaydet'i tıklayın
8. Skor tablosu verilerini doldurma
Oyununuza başlangıçta biraz "canlılık" katmak ve temsilcilerinizin veriye sahip olmasını sağlamak için skor tablosuna başlangıç skorları ekleyebilirsiniz.
dinoquestkök dizininde olduğunuzdan emin olun:cd ~/dinoquest- Sanal ortam oluşturun ve etkinleştirin:
python3 -m venv venv source venv/bin/activate - Gerekli Firestore bağımlılığını yükleyin:
pip install google-cloud-firestore - İlk veri oluşturma komut dosyasını çalıştırın:
python3 prep/seed_scores.py - Sanal ortamı devre dışı bırakın:
deactivate
Artık hizmet URL'sini tarayıcınızda açabilirsiniz. DinoQuest tamamen kullanıma hazır.
4. Dino Tiyatrosu'nu kurma
Temsilci Rolü: Görselleştirici. Kendi kendine hareket eden bir temsilci ekibini nasıl izlersiniz? Dino Theater, arı sürüsü gibi çalışan temsilcilerinizin düşünce dünyasına anlık bir bakış sunar. Terminal günlüklerine bakmak yerine, canlı ve görsel bir kontrol panelinde aracılarınızın akıl yürütmesini, birbirlerini çağırmasını ve bulutta görevleri yürütmesini izleyebilirsiniz.

C. Dino Theater'ı Cloud Run'a dağıtma
Öncelikle ana dizininize geri dönün ve Dino Theater kodunu klonlayın:
cd ~
git clone https://github.com/gca-americas/dinoquest-theater.git
cd dinoquest-theater
- Container'ı oluşturun ve aktarın:
gcloud builds submit --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest . - Hizmet Hesabı ve İzinleri Ayarlama:
# 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" - Uygulamayı dağıtma:
Not: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, etkinlikler arasında SSE bağlantısının etkin kalması için önerilir. - Çalıştığını doğrulayın: Dağıtılan hizmet URL'sini tarayıcınızda açın (ör.
https://dino-theater-xxx-uc.a.run.app/demo).
5. IDE'de Agentic DevOps
Temsilci Rolü: Yerel Yerçekimsiz Ortam. IDE'niz ile bulut arasındaki boşluğu kapatmak için Antigravity'yi Google Cloud'un Managed MCP sunucularına bağlarız. Bu sayede, yerel aracınız projenizi "görebilir". Böylece, API anahtarlarıyla uğraşmanıza veya konsola geçmenize gerek kalmadan günlükleri ayrıştırabilir, metrikleri kontrol edebilir ve altyapı hakkında akıl yürütebilir.
Becerileri çalıştırmadan önce Antigravity'nin Google Cloud'a erişimini yapılandırmanız ve DinoQuest becerisi oyun planlarını yüklemeniz gerekir.
C. Google'ın Managed MCP hizmetini yükleme
Google'ın Managed MCP hizmeti, tek bir barındırılan uç nokta üzerinden tüm Google Cloud API'lerine erişim sağlar.
Uygulama Varsayılan Kimlik Bilgileri'ni kullanarak kimlik doğrulama:
gcloud auth application-default login
B. mcp_config.json dosyasını yapılandırma
Antigravity yapılandırma dizininizde (genellikle ~/.gemini/antigravity/mcp_config.json) veya konsoldan mcp_config.json oluşturun ya da güncelleyin. Bu işlem, Antigravity'ye becerilerin ihtiyaç duyduğu Google Cloud ve GitHub araçlarına erişim izni verir:
{
"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. Becerileri Antigravity'ye yükleme (isteğe bağlı)
Antigravity, belirli standart dizinlerdeki becerileri keşfeder. Klonlanan deponuzdaki DinoQuest becerilerini, genel Antigravity becerileri klasörüne kopyalayın:
# 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'yi yeniden başlatma(isteğe bağlı)
mcp_config.json değişikliklerini uygulamak ve yeni kopyalanan becerileri yüklemek için Antigravity uygulamasını yeniden başlatın.
Yeniden başlatıldıktan sonra:
- Ayarlar'da google ve github MCP sunucularının durumunun yeşil "Bağlandı" olarak gösterildiğini doğrulayın.
- DinoQuest becerilerinin beceri listenizde göründüğünü doğrulayın.
Not: Her becerinin SKILL.md sayfasının üst kısmında ## Configuration tablosu bulunur. Kopyaladıktan sonra, ~/.gemini/antigravity/skills/ içindeki değerleri projenizle eşleşecek şekilde güncellemeniz gerekir.
E. Yerel IDE'de bulut hizmetini düzeltme
- Hatayı tetikleyin: Tarayıcınızda dağıtılan DinoQuest URL'nizi (son adımdan) açın.
- Skor tablosuna gitme: Skor tablosu düğmesini tıklayın. Mevcut skor tablosu uygulaması kasıtlı olarak verimsizdir. Çok büyük miktarda veriyi belleğe yüklemeye çalışarak bellek yetersiz (OOM) hatasına neden olur.
- Antigravity Agent Manager'da (Agent HUB) hatanın kurtarılmasına ve temel nedenin düzeltilmesine yardımcı olmasını isteyin.
- 1. istem: dinoquest ile ilgili sorunları öğren.
- 2. istem: Dinoquest oyununun koduna bakıp bellek yetersizliği hatasına neden olan kısmı düzeltebilir misin?
6. Günlükleri BigQuery'ye aktarma ve analiz oluşturma
Aracı Rolü: Veri Aracısı. Ham günlükleri uygulanabilir ürün stratejisine dönüştürmek için saatlerce manuel veri işleme gerekmez. Veri Aracısı Kiti ve BigQuery MCP'yi kullanarak günlükleri doğrudan BigQuery'ye aktaran bir "sıfır ETL" ardışık düzeni oluşturuyoruz. Bu sayede aracı, iki dakikadan kısa bir sürede premium analiz kontrol paneli oluşturabiliyor.
log-router-bq-report becerisi, DinoQuest'in Cloud Run günlüklerini BigQuery'ye sürekli olarak aktaran bir Cloud Logging havuzu oluşturur, ardından trafik raporları ve oyun analizi içgörüleri oluşturmak için verileri sorgular.

C. Becerinin değişkenlerini yapılandırma
DinoQuest deponuzda skills/log-router-bq-report/SKILL.md dosyasını açın ve üst kısımdaki Configuration (Yapılandırma) bölümünü güncelleyin:
| Variable | Your Value |
|---------------|--------------------|
| SERVICE_NAME | dinoquest |
| BQ_DATASET | dinoquest_logs |
| LOG_SINK_NAME | dinoquest-bq-sink |
B. Antigravity'de beceriyi çalıştırma
DinoQuest deposunu bağlam olarak kullanarak Antigravity'i açın ve Gemini'a şunu söyleyin:
Run the log-router-bq-report skill
Bu beceri:
- GCP projenizi otomatik olarak çözme
- BigQuery havuzunun mevcut olup olmadığını kontrol edin. Mevcut değilse veri kümesi ve havuz oluşturulur.
- IAM izinleri verme: Bu işlem, veri kümesinde
writerIdentityhavuzuna BigQuery Veri Düzenleyicisi rolünü verir.
Not: Eventarc hedefinde olduğu gibi, bu işlem sırasında gcloud tarafından bir uyarı görebilirsiniz: "Lütfen serviceAccount:service-... hesabına veri kümesinde BigQuery Veri Düzenleyicisi rolünü vermeyi unutmayın." Bu işlem, beceri tarafından otomatik olarak gerçekleştirilir.
C. Antigravity'yi kullanarak rapor oluşturma
Antigravity'den "BigQuery günlük havuzunu ayarlamasını ve analiz raporunu oluşturmasını" isteyin. Temsilci:
- Altyapıyı yapılandırma: BigQuery veri kümesini ve Cloud Logging havuzunu oluşturun.
- İzinleri Yönet: Gerekli IAM rollerini, hedef yazıcı kimliğine otomatik olarak verin.
- Analizler Oluşturma: Günlükleri analiz edin ve oyun telemetrisi ile kazanma oranı analizini içeren premium, etkileşimli bir HTML kontrol paneli oluşturun.
7. Kendiliğinden İyileştirme Aracısı
Aracı Rolü: SRE Aracısı. Üretim hizmeti saat 02:00'de başarısız olduğunda uyanmanız gerekmez. Bu temsilci, ilk müdahale ekibiniz olarak hareket eder. Eventarc aracılığıyla Cloud Run hata günlükleri tarafından tetiklenen bu özellik, kilitlenmeyi otomatik olarak analiz eder, düzeltme önerisinde bulunur ve düzeltme ardışık düzenini başlatır. Tüm bunlar, konsola giriş yapmadan önce gerçekleşir.
DinoAgent, Eventarc aracılığıyla Cloud Run hata günlüklerini dinleyen, temel nedeni teşhis eden ve otomatik olarak düzeltme uygulayan (belleği artırarak, trafiği geri alarak veya GitHub'da kod düzeltme PR'si göndererek) bir ADK aracısıdır.

C. Düzeltme aracısı deposunu klonlayın
cd ~
git clone https://github.com/gca-americas/dinoquest-reme-agent.git
cd dinoquest-reme-agent
Proje yapısı:
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 erişimini ayarlama (kod düzeltme parçası)
Kod düzeltme parçası, DinoQuest deponuzu klonlar, kaynak dosyaları okur, yamaları uygular ve PR'leri açar. repo kapsamlı bir GitHub kişisel erişim jetonu gerekir.
- github.com/settings/tokens → Generate new token (classic) seçeneğine gidin.
- Bir ad verin,
repokapsamını seçin → Jeton oluştur'u seçin → jetonu kopyalayın.
Secret Manager'da saklayın:
Öncelikle GitHub jetonunuzu dışa aktarın:
export GH_TOKEN=ghp_YOUR_TOKEN_HERE
Ardından, gizli anahtarı oluşturun:
echo -n $GH_TOKEN | \
gcloud secrets create github-token --data-file=-
C. Slack bildirimlerini ayarlama (isteğe bağlı)
Bir düzeltme tamamlandığında DinoAgent, Slack kanalına bir özet gönderir.
- api.slack.com/apps → Create New App → From scratch (Yeni Uygulama Oluştur → Sıfırdan) seçeneğine gidin.
DinoAgentadını verin, çalışma alanınızı seçin → Uygulama Oluştur- Özellikler → Gelen Webhook'lar'ın altında açma/kapatma düğmesini etkinleştirin.
- Add New Webhook to Workspace (Çalışma alanına yeni webhook ekle) → bir kanal seçin → Allow'u (İzin ver) tıklayın.
- Web kancası URL'sini kopyalayın (
https://hooks.slack.com/services/...).
Secret Manager'da saklayın:
export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
gcloud secrets create slack-webhook --data-file=-
D. DinoAgent hizmet hesabını oluşturma
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
Bu hizmete gizli anahtarlara erişim izni verin:
for SECRET in github-token slack-webhook; do
gcloud secrets add-iam-policy-binding $SECRET \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
done
E. DinoAgent'ı oluşturma ve Cloud Run'a dağıtma
# 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 tetikleyicisini bağlama
Cloud Run hata günlüklerini almak için bir Pub/Sub konusu oluşturun:
gcloud pubsub topics create cloud-run-errors
dinoquest hizmetinizdeki hata günlüklerini filtreleyen ve bunları konuya yönlendiren bir Cloud Logging havuzu oluşturun:
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"
Not: Yukarıdaki komutu çalıştırdığınızda gcloud, "Lütfen serviceAccount:service-... hesabına konu üzerinde Pub/Sub Publisher rolünü vermeyi unutmayın." şeklinde bir Bilgi mesajı yazdırır. Bir sonraki adım tam olarak bunu ele alır.
Havuzun yazıcı kimliğine (uyarıda belirtilen hizmet hesabı) yayınlama izni verin:
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"
Etkin olup olmadığını doğrulayın:
gcloud eventarc triggers describe remediation-trigger --location=$CLOUD_RUN_REGION
Düzeltme aracını çağırmak için Eventarc'a izin verin:
gcloud run services add-iam-policy-binding remediation-agent \
--region=$CLOUD_RUN_REGION \
--member="serviceAccount:${SA}" \
--role="roles/run.invoker"
Eventarc tetikleyicisini oluşturun:
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}
Düzeltme işlemi artık tamamen otomatik olarak gerçekleştiriliyor. DinoAgent, yalnızca altyapıyı ölçeklendirmekle kalmaz, uygulama kodunda derin bir temel neden analizi yapar, semantik bir yama uygular ve düzeltmeyi doğrulama ve dağıtım için CI aracısına aktarmak üzere Agent-to-Agent (A2A) iletişimini kullanır. Uygulama ayrıntılarını reme-agent kod tabanında inceleyebilirsiniz.
8. CI aracısını ayarlama
Aracı Rolü: CI ardışık düzeni. Karmaşık YAML dosyaları ve manuel derleme komut dosyalarıyla uğraşmayı bırakın. Bu aracı, PR'lerinizin operasyonel altyapısını yönetir. Kod değişikliklerinizi okur, bağlamı anlar, gerekli testleri kapsar ve Cloud Build aracılığıyla Docker görüntülerinizi oluşturur. Böylece her taahhüdün ana dala ulaşmadan önce "aracı onaylı" olmasını sağlar.
ci-agent, Cloud Run hizmeti olarak dağıtılan bağımsız bir CI ardışık düzen aracısıdır. Docker yapılarını Cloud Build'e gönderir, tamamlanma durumunu yoklar, Artifact Registry'deki görüntüyü doğrular ve GitHub'a rapor gönderir.

CI işlem hattınız için neden aracı kullanmalısınız? Geleneksel statik komut dosyalarının aksine, ajan tabanlı bir CI ardışık düzeni şunları sağlar:
- Bilişsel Kapsam Sınıflandırması: Kod değişikliklerinizin anlamsal etkisine göre gerekli test derinliğini akıllıca belirler (tür kontrolleri, birim testleri veya tam entegrasyon paketleri arasında geçiş yapar).
- Bağımsız PR Yönetimi: Aracı, PR'leri otomatik olarak oluşturabilir, değişikliklerin ayrıntılı özetlerini yayınlayabilir ve hatta gizli tarama ile güvenlik denetimlerini insan müdahalesi olmadan yönetebilir.
- Anlık Hata Teşhisi: Derleme başarısız olduğunda aracı yalnızca günlükleri göstermekle kalmaz. Stack izini analiz eder, olası nedeni belirler ve doğrudan PR'ye okunabilir bir teşhis gönderir.
C. CIAgent deposunu klonlama
cd ~
git clone https://github.com/gca-americas/dinoquest-ci-agent.git
cd dinoquest-ci-agent
B. CIAgent hizmet hesabını oluşturma
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 deposunu Cloud Build'e bağlama
CIAgent, derlemeleri repoSource üzerinden gönderir. Bu işlem için GitHub deposunun Cloud Build Developer Connect'e bağlı olması gerekir.
- GCP Console → Cloud Build → Repositories'e (GCP Konsolu → Cloud Build → Depolar) gidin.
- Depoyu Bağla'yı tıklayın.
- GitHub (Cloud Build GitHub Uygulaması)'nı seçin.
YOUR_GITHUB_USERNAME/dinoquestdeponuzu yetkilendirin ve seçin- Bağlan'ı tıklayın ve tetikleyici oluşturmanız istendiğinde Atla'yı tıklayın.
- Bağlantı adınızı not edin (varsayılan olarak genellikle GitHub kullanıcı adınız veya benzeri bir ad kullanılır).
D. CIAgent'a gizli anahtarlara erişim izni verme
DinoAgent için daha önce oluşturulan sırları yeniden kullanacağız:
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'ı derleme ve Cloud Run'a dağıtma
# 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 eğik çizgi komutu kurulumu
- api.slack.com/apps → Create New App (Yeni Uygulama Oluştur) → From scratch (Sıfırdan) seçeneğine gidin.
CIAgentadını verin, çalışma alanınızı seçin → Uygulama Oluştur'u tıklayın.- Özellikler → Eğik Çizgi Komutları → Yeni Komut Oluştur'u tıklayın.
- Komut:
/runci - İstek URL'si: Yukarıdaki CIAgent Cloud Run URL'niz ve sonuna
/slackeklenmiş hali (ör.https://ci-agent-xxx-.us-central1.run.app/slack) - Kısa açıklama:
Trigger CI - Kaydet
- Ayarlar → Uygulama Yükle bölümünde Workspace'e yükle'yi tıklayın ve izin verin.
CI aracısı, Cloud Build ve Artifact Registry gibi güçlü Google Cloud hizmetlerinin üzerinde yer alan bir "beyin" gibi davranır. Derleme doğrulandıktan sonra, A2A aracılığıyla CD aracısı çağrılarak son dağıtım aşaması tetiklenir. Böylece, derleme ve yayın döngüleri arasında sorunsuz bir geçiş sağlanır.
9. Dağıtımı ayarlama
Temsilci Rolü: CD Temsilcisi. Dağıtım, bilinmeyene doğru bir sıçrama olmamalıdır. Bu ajan, riski sizin için yönetir. Dağıtım güvenliğini puanlar, erken erişim trafiği bölümlerini yönetir ve bir sürümün tanıtılıp tanıtılmayacağına veya geri alınacağına karar vermek için gerçek zamanlı metrikleri izler. Otonom ajan sürünüzdeki son bekçidir.
cd-agent, Cloud Run hizmeti olarak dağıtılan bağımsız bir canary dağıtım aracısıdır. ci-agent kaynağından A2A dağıtım istekleri alır, risk puanı hesaplar, riske göre ayarlanmış bir canary yüzdesi belirler, metrikleri izler ve otomatik olarak yükseltir veya geri alır. Ayrıca Firestore kullanılarak yapılan geçmiş dağıtımlardan da bilgi edinir.

Aracıları doğrudan bağlamak, her devrin niyet ve bağlamın zengin bir şekilde aktarılması olduğu bir "bilişsel kanal" oluşturur. Geleneksel webhook'lardan farklı olarak A2A iletişimi şunları sağlar:
- Akıllı Bağlam Paylaşımı: Ajanlar, oturum anılarının tamamını, PR farklılıklarını ve risk puanlarını ileterek bir sonraki ajanın çalışmaya başlamadan önce tüm "neden" bilgilerine sahip olmasını sağlar.
- Bilişsel El Sıkışmaları: Temsilciler, kapılarla ilgili pazarlık yapabilir. Örneğin, CD aracısı, bir düzeltmenin gerçek zamanlı olarak doğrulanması için kanarya sürümü sırasında CI aracısından belirli smoke testleri isteyebilir.
- İşbirlikçi Düzeltme: Bir dağıtım başarısız olursa CD Aracısı, başarısız olan metriklerle ilgili olarak Düzeltme Aracısı'nı proaktif bir şekilde bilgilendirebilir. Böylece, bir kullanıcıya çağrı gönderilmeden önce bağımsız bir temel neden analizi başlatılır.
- Kaynak pazarlığı: Temsilciler, altyapı ihtiyaçları konusunda pazarlık yapabilir. Örneğin, CI aracısı büyük ölçekli bir yeniden düzenleme algılarsa düzeltme aracısından daha fazla derleme kapasitesi sağlamasını isteyebilir veya CD aracısı büyük bir sürümden önce üretim kümesinin ölçeklendirilmesini önerebilir.
- Çoklu Aracı Onayı: Yüksek riskli değişiklikler için birden fazla aracı (ör.güvenlik aracısı ve CD aracısı) A2A aracılığıyla "ortak onay" gerçekleştirebilir. Bu sayede kodun yalnızca oluşturulup dağıtılması değil, aynı zamanda üretime geçmeden önce güvenlik politikalarına da uyması sağlanır.
C. CDAgent deposunu klonlayın
cd ~
git clone https://github.com/gca-americas/dinoquest-cd-agent.git
cd dinoquest-cd-agent
B. Firestore veritabanını oluşturma
CDAgent, dağıtım bellek kalıplarını Firestore'da depolar:
gcloud firestore databases create \
--region=$CLOUD_RUN_REGION \
--project=$PROJECT_ID
(Bu projede zaten bir veritabanı oluşturduysanız bu adımı atlayabilirsiniz.)
C. CDAgent hizmet hesabını oluşturma
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'ın gizli anahtarlara erişmesine izin verme
Daha önce oluşturulan GitHub jetonunu ve Slack webhook'unu yeniden kullanacağız. Ayrıca, dağıtılan uygulamanın kullanabilmesi için Cloud Run Compute hizmet hesabına Gemini API anahtarına erişim izni vereceğiz:
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'ı oluşturma ve Cloud Run'a dağıtma
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
Not: --min-instances=1 --no-cpu-throttling, Slack ve A2A komutlarına hızlı yanıt verebilmesi için örneği sıcak tutar.
CD aracısı, üretim ortamınızın son bekçisidir. Her dağıtımın riskini değerlendirir, riske göre ayarlanmış bir kanarya dağıtımı gerçekleştirir ve gerçek zamanlı metrikleri izler. Anormallik algılanırsa otomatik geri alma işlemi başlatılır.
10. Büyüme: Agent Swarm ile 2. seviyeyi etkinleştirme
C. Tam Swarm'u test etme
- Hatayı tetikleyin: Tarayıcınızda dağıtılan DinoQuest URL'nizi (son adımdan) açın.
- Skor tablosuna gitme: Skor tablosu düğmesini tıklayın. Mevcut skor tablosu uygulaması kasıtlı olarak verimsizdir. Çok büyük miktarda veriyi belleğe yüklemeye çalışarak bellek yetersiz (OOM) hatasına neden olur.
- Temsilciyi Bekleyin: Yaklaşık 60 saniye içinde
remediation-agent, Eventarc aracılığıyla hata etkinliğini alır ve teşhisine başlar. - Slack'i kontrol edin: Slack kanalınızda şu şekilde bir bildirim görmeniz gerekir:DinoAgent Remediation Summary
- Hizmet: dinoquest
- Başarısız olan düzeltme: dinoquest-xxxx-xxxx
- Kanıt: "128 MiB'lik bellek sınırı aşıldı ve 13x MiB kullanıldı."
- Bu düzeltme neden kötüydü?:
/api/leaderboarduç noktası verimsiz bir şekilde xxxxx olduğundan OOM hatasına neden oldu. - Yapılan işlem:
dinoquesthizmeti için bellek xMi'den yGi'ye yükseltildi. Yeni bir düzeltme oluşturuldu. - Temel neden PR'si: https://github.com/YOUR_USERNAME/DinoQuest/pull/x
- Düzeltmeleri doğrulayın:
- GitHub: Deponuzda yeni bir dal ve çekme isteği olup olmadığını kontrol edin. Aracı, temel bellek sızıntısını düzeltmek için uygulama koduna yama uyguladı.
- Cloud Run: GCP Console'da, güncellenen bellek ayırma işlemine sahip
dinoquesthizmetinin yeni bir sürümünü görürsünüz. - Skor tablosu: Skor tablosunu tekrar deneyin. Artan bellek ve nihai kod düzeltmesi sayesinde artık başarıyla yüklenmesi gerekir.
B. Evrim: 2. Düzey Oyun Mantığını Uygulama
Önemli bir yeni özellik ekleyeceksiniz: 2. Seviye (Asteroid Destroyer). Bu sayede yüksek puanlı dinozorlar yeni bir oyun moduna geçebilir.
- Dinoquest deponuza geri dönün:
cd ~/dinoquest - Yeni bir dal oluşturma ve bu dala geçme:
git checkout -b level_2 - 2. seviye yamayı uygulayın: Yerel kod tabanınızı 2. seviye öğeler, bileşenler ve oyun mantığı ile yamalamak için sağlanan komut dosyasını çalıştırın:
bash level_2_backup/levelup.sh - Değişiklikleri işleyin ve gönderin:
git add . git commit -m "feat: add Level 2" git push origin level_2
Aracıyı manuel olarak tetiklemek için curl kullanmak yerine, daha önce yapılandırdığınız Slack Slash Command'i kullanacağız. Gerçek hayattaki bir senaryoda bağımsız CI işlem hattınızla bu şekilde etkileşim kurarsınız.
- Slack'i açın ve
CIAgentuygulamasının yüklü olduğu herhangi bir kanala gidin. - Aşağıdaki komutu yazarak CI derlemesini tetikleyin:
/runci run ci on branch level_2 - İlerleme durumunu izleme:
- Slack: Temsilci, komutunuzu onaylar ve derleme ilerledikçe güncellemeler yayınlar.
- Dino Theater: Ajan değişikliği sınıflandırırken, Cloud Build işini gönderirken ve CD ajanıyla iletişim kurarken "düşünce balonlarını" izleyin.
- GitHub:
level_2PR'nizi kontrol edin. Aracı, commit durumlarını ve tam bir CI raporu yorumunu yayınlar.
- Süreci izleyin:
- CI aracısının düşünme, değişikliği sınıflandırma ve ardışık düzeni çalıştırma sürecini görmek için Dino Theater'ı kontrol edin.
- CI aracısının commit durumunu ve nihai raporu yayınladığını görmek için GitHub PR'nizi kontrol edin.
11. Sonuç
Google Cloud'da eksiksiz bir agentic DevOps yığını oluşturmuş olmanız gerekir:
Bileşen | Ne işe yarar? |
DinoQuest (Cloud Run | Gemini destekli oyun: React ön ucu + FastAPI arka ucu |
Firebase Auth + Firestore | Kullanıcı kimlik doğrulaması ve dinozor profili depolama |
Düzeltme Aracısı (Cloud Run + Eventarc) | OOM hatalarını ve kod hatalarını otomatik olarak düzelten SRE aracısı |
log-router-bq-report | Günlükleri BigQuery'ye aktaran ve analizler oluşturan veri aracısı |
CIAgent (Cloud Run) | Testleri kapsamlandıran, görüntüleri oluşturan ve A2A aracılığıyla CD'yi çağıran CI ajanı |
CDAgent (Cloud Run) | Otomatik geri alma özelliğiyle risk puanı verilmiş canary dağıtımlarını çalıştıran CD aracısı |
Tüm Agent davranışları, skills/ dizininde Markdown oyun kitapları olarak bulunur. Davranışı değiştirmek için kodu değil, beceriyi düzenleyin. Beceriler Gemini ile Antigravity üzerinde çalışır ve hangi becerinin çalıştırılacağını temsilciye söyleyerek çağrılır.