1. Обзор
Добро пожаловать во второй день. Хотя создание приложения и нажатие кнопки «Опубликовать» — это волшебство, реальный трафик приводит к реальным сбоям. Вместо того чтобы тратить дни на борьбу с YAML или поиск информации в логах, вы можете создать рой специализированных агентов, которые будут управлять операционной инфраструктурой за вас. В этом практическом занятии показано, как унифицированный стек Google Cloud (Eventarc, Cloud Run, Firestore, Cloud Build, BigQuery) позволяет агентам легко и безопасно получать секреты, передавать логи и устранять проблемы «из коробки».

В этом практическом занятии вы с нуля создадите DinoQuest — приключенческую игру о динозаврах на движке Gemini — и интегрируете её в полностью агентный конвейер CI/CD. В итоге вы получите:
- Рабочее веб-приложение DinoQuest, запущенное на платформе Cloud Run (имя сервиса:
dinoquest). - Конвейер анализа логов , который передает логи Cloud Run в BigQuery и генерирует интерактивную панель мониторинга с игровыми данными.
- Агент исправления ошибок (
remediation-agent) — это ADK-агент для автоматического исправления ошибок, который отслеживает ошибки Cloud Run и автоматически их исправляет. Он развертывается как отдельная служба Cloud Run, запускаемая Eventarc. - Агент CI (
ci-agent), который считывает различия в ваших запросах на слияние, интеллектуально определяет область действия тестов, создает образ Docker с помощью Cloud Build и отправляет статус коммита обратно в GitHub. - Агент непрерывной доставки (CD Agent) , который оценивает риски развертывания, разделяет трафик, отслеживает метрики и автоматически переводит систему в более высокий или более высокий уровень или откатывает ее.
Что вы узнаете
- Как развернуть полнофункциональное приложение Vite + FastAPI в Cloud Run в виде единого контейнера.
- Как настроить Firebase Auth и Firestore для приложения React
- Как создать и развернуть агент ADK, реагирующий на события Pub/Sub через Eventarc.
- Как перенаправлять журналы Cloud Run в BigQuery и запрашивать игровую аналитику.
- Как писать навыки для агентов в рамках непрерывной интеграции и канареечного развертывания
Что вам понадобится
- A Google Cloud project with billing enabled
- A Firebase project (can be the same GCP project)
- Аккаунт на GitHub и форк репозитория DinoQuest.
- Доступ к антигравитации с помощью Gemini (агент-бегун Google)
- Интерфейс командной строки
gcloudустановлен и авторизован — см. инструкции по установке ниже. -
node≥ 18 andnpm -
python3≥ 3.11 -
gitandgh(GitHub CLI)
Установите интерфейс командной строки gcloud.
macOS
brew install --cask google-cloud-sdk
Или загрузите установщик с сайта cloud.google.com/sdk/docs/install .
Windows
winget install Google.CloudSDK
Или загрузите установщик для Windows (.exe) с сайта cloud.google.com/sdk/docs/install и запустите его.
After installing, initialise and authenticate:
gcloud init
gcloud auth login
gcloud auth application-default login
2. Set up Firebase
Каждому агенту нужны данные для анализа. DinoQuest использует Firestore и Firebase Auth для предоставления готового к использованию слоя данных, который наши агенты впоследствии будут обнаруживать, исследовать и обновлять, используя естественный язык.
Поскольку это приложение было создано с помощью AI Studio, оно тесно интегрировано с Firebase. Использование Firebase предоставляет ряд преимуществ, главными из которых являются предварительно защищенная архитектура и управляемый доступ к данным «из коробки», гарантирующие защиту состояния вашей игры с первого дня.
A. Create a Firebase project
- Go to console.firebase.google.com
- Нажмите «Добавить проект» (эта опция скрыта в меню создания нового проекта) → выберите существующий проект GCP (или создайте новый).
- Отключите Google Analytics, если появится соответствующее сообщение → Создать проект (или можете использовать настройки по умолчанию).
B. Enable Google Authentication
- В консоли Firebase перейдите в раздел Безопасность → Аутентификация (Начало работы) → Способ входа в систему
- Нажмите Google → включите → сохраните адрес электронной почты службы поддержки → Сохранить
C. Add localhost as an authorized domain
- Still in Authentication , click the Settings tab
- В разделе «Авторизованные домены» убедитесь, что
localhostуказан (он должен быть там по умолчанию).
D. Create a Firestore database
- Перейдите в раздел «База данных и хранилище» → «База данных Firestore» → «Создать базу данных».
- Choose Standard Edition → Next
- Выберите регион
us-central1(или соответствующий региону вашего Cloud Run) - Choose Start in production mode → Create
После создания запишите идентификатор вашей базы данных — он будет выглядеть как (default) если вы не присвоили ей имя.
E. Set Firebase Security Rules
В разделе «База данных Firestore» → «Правила» замените правила по умолчанию следующими:
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;
}
}
}
Click Publish .
F. Add a web app and get the config
- Перейдите в «Настройки проекта» (значок шестеренки) → вкладка «Общие» .
- Прокрутите до раздела «Ваши приложения» → нажмите «Добавить приложение» → выберите значок «Веб» (
>) - Name it
dinoquest→ Register app - Скопируйте показанный объект
firebaseConfig— он вам понадобится чуть позже.
3. Running the Game
Роль агента: Окружающая среда . Прежде чем мы сможем запустить наших агентов, нам нужен мир, которым они смогут управлять. На этом этапе мы развернем версию DinoQuest "Day One". Это создаст работающий сервис, журналы и состояние, которые наш рой позже обнаружит и будет обрабатывать.

Выберите один из двух вариантов ниже. В любом случае будет создан объект GEMINI_API_KEY который вы будете использовать одинаково на каждом последующем шаге — никаких других изменений не потребуется.
А. Настройка ключа API Gemini
Вариант A — API-ключ Vertex AI Gemini (рекомендуется, если у вас проект в GCP)
Vertex AI позволяет создать ключ API Gemini, напрямую привязанный к вашему проекту GCP и оплачиваемый с его помощью, используя учетную запись сервиса проекта по умолчанию — отдельная учетная запись AI Studio не требуется.
- Export your GCP project ID:
export PROJECT_ID=<YOUR_PROJECT_ID> - Включите необходимые API и предоставьте необходимые разрешения учетной записи службы Compute Engine по умолчанию:
gcloud auth application-default set-quota-project $PROJECT_ID gcloud config set project $PROJECT_ID # Enable Vertex AI, Compute Engine, and Generative Language APIs gcloud services enable aiplatform.googleapis.com \ compute.googleapis.com \ generativelanguage.googleapis.com # Grant Vertex AI User role to the default compute service account PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)") gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \ --role="roles/aiplatform.user" \ --condition=None - Откройте страницу с ключами API Vertex AI в облачной консоли.
- Нажмите «Создать учетные данные» → выберите «Ключ API».
- In the creation dialog:
- Name the key
Dino_Key - Установите флажок «Аутентифицировать вызовы API через учетную запись службы» .
- В разделе «Учетная запись службы» выберите учетную запись службы вычислений по умолчанию (
PROJECT_NUMBER-compute@developer.gserviceaccount.com). - В разделе «Выбор ограничений API» установите флажок «GEMINI API» .
- Нажмите «Создать».
- Name the key
- Скопируйте сгенерированный ключ.
Option B — AI Studio (quickest for local dev)
- Open aistudio.google.com
- Click Get API key in the left sidebar
- Нажмите «Создать ключ API» → выберите свой проект GCP → скопируйте ключ.
На последующих этапах любой из ключей устанавливается как GEMINI_API_KEY — бэкэнд обрабатывает их одинаково.
Клонируйте репозиторий
Репозиторий курса находится по адресу https://github.com/gca-americas/dinoquest . Пожалуйста, сначала сделайте форк на свой аккаунт GitHub. Мы поручим агенту работать с вашим репозиторием.
После создания форка клонируйте main ветку созданного вами репозитория DinoQuest и перейдите в каталог проекта:
git clone https://github.com/YOUR_GITHUB_USERNAME/dinoquest.git
cd dinoquest
B. Настройка переменных среды
В каждом новом терминале bash, который вы открываете во время выполнения этого практического задания, обязательно установите следующие необходимые переменные окружения. Замените значения-заполнители фактическими данными вашего проекта:
First, export your GitHub repository URL:
export GITHUB_REPO_URL=https://github.com/YOUR_GITHUB_USERNAME/dinoquest
Then export the remaining environment variables:
export PROJECT_ID=your-project-id
export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
export CLOUD_RUN_REGION=us-central1
export GOOGLE_GENAI_USE_VERTEXAI=True
export HARNESS_EVENTS_TOPIC=projects/$PROJECT_ID/topics/harness-events
export CLOUD_BUILD_REPO=<YOUR_GITHUB_USERNAME>-dinoquest
Убедитесь, что структура выглядит правильно:
dinoquest/
├── backend/ # FastAPI backend (serves frontend + Gemini API calls)
├── frontend/ # React/Vite frontend
├── skills/ # Agentic CI/CD skill files
├── Dockerfile # Multi-stage build (React → Python)
├── start.sh # Local dev launcher
└── README.md
B. Создайте файл среды бэкэнда.
Сначала экспортируйте свой API-ключ Gemini:
export GEMINI_API_KEY=YOUR_GEMINI_API_KEY_FROM_STEP_2
Затем создайте файл .env :
cat > backend/.env <<EOF
GEMINI_API_KEY=$GEMINI_API_KEY
GOOGLE_GENAI_USE_VERTEXAI=False
GOOGLE_CLOUD_PROJECT=$PROJECT_ID
EOF
C. Включите проверку приложения Firebase / учетную запись службы (для Cloud Run)
При работе в Cloud Run бэкенд использует учетные данные приложения по умолчанию для взаимодействия с Firebase — файл ключа сервисной учетной записи не требуется. Вызов firebase_admin.initialize_app() в backend/main.py автоматически это определяет.
Для локальной разработки аутентификацию необходимо выполнить один раз:
gcloud auth application-default login
D. Создайте файл конфигурации приложения Firebase.
В каталоге frontend/ создайте firebase-applet-config.json содержащий конфигурацию, полученную на предыдущем шаге:
{
"apiKey": "YOUR_API_KEY",
"authDomain": "YOUR_PROJECT_ID.firebaseapp.com",
"projectId": "YOUR_PROJECT_ID",
"storageBucket": "YOUR_PROJECT_ID.appspot.com",
"messagingSenderId": "YOUR_SENDER_ID",
"appId": "YOUR_APP_ID",
"firestoreDatabaseId": "(default)"
}
Примечание: firestoreDatabaseId должен совпадать с идентификатором базы данных, созданной на предыдущем шаге. Если вы использовали значение по умолчанию, оставьте его как "(default)" .
Зафиксируйте изменения в своем репозитории:
git add frontend/firebase-applet-config.json
git commit -m "chore: add firebase config"
git push origin main
C. Запустите DinoQuest локально.
1. Включите необходимые API.
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
secretmanager.googleapis.com \
firestore.googleapis.com \
logging.googleapis.com \
pubsub.googleapis.com \
eventarc.googleapis.com \
aiplatform.googleapis.com \
bigquery.googleapis.com \
aiplatform.googleapis.com
2. Запустите DinoQuest
Скрипт start.sh собирает фронтенд на React и передает управление терминалу бэкенду FastAPI, который обслуживает скомпилированные статические файлы:
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt -q
cd ..
# Force-remove the Vertex AI flag from the current terminal session to avoid conflicts
unset GOOGLE_GENAI_USE_VERTEXAI
./start.sh
Откройте http://localhost:8000 в своем браузере. Вы должны увидеть заставку DinoQuest. Войдите в систему с помощью Google, создайте своего первого динозавра и подтвердите сохранение в Firestore.
Устранение неполадок: Если вы видите пустую страницу или ошибки аутентификации Firebase, убедитесь, что frontend/firebase-applet-config.json указаны правильные значения и что localhost находится в списке авторизованных доменов.
E. Развертывание DinoQuest в облаке.
1. Настройте свой проект.
export PROJECT_ID=$(gcloud config get-value project)
3. Создайте репозиторий реестра артефактов.
gcloud artifacts repositories create dinoquest \
--repository-format=docker \
--location=$CLOUD_RUN_REGION \
--description="DinoQuest container images"
4. Сохраните ключ API Gemini в Secret Manager.
echo -n $GEMINI_API_KEY | \
gcloud secrets create gemini-api-key --data-file=-
# Grant the default compute service account access to the secret
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gemini-api-key \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
5. Создайте образ контейнера с помощью Cloud Build.
gcloud builds submit \
--tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest .
Этот скрипт запускает многоэтапный Dockerfile: сначала он собирает приложение React, а затем упаковывает результат в образ FastAPI. Занимает около 3–5 минут.
6. Развертывание в облаке.
Сначала экспортируйте электронную почту администратора:
export ADMIN_EMAIL=<YOUR_TEST_ACCOUNT_EMAIL>
Затем разверните сервис:
gcloud run deploy dinoquest \
--image=$CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest \
--region=$CLOUD_RUN_REGION \
--platform=managed \
--allow-unauthenticated \
--memory=128Mi \
--set-secrets="GEMINI_API_KEY=gemini-api-key:latest" \
--set-env-vars="ADMIN_EMAILS=$ADMIN_EMAIL" \
--set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=False" \
--set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID"
После завершения выполнения команды Cloud Run выведет URL-адрес службы . Скопируйте этот URL — он понадобится вам для авторизации домена в Firebase.
7. Авторизуйте домен Cloud Run в Firebase.
Чтобы разрешить пользователям входить в систему из развернутого приложения, необходимо добавить URL-адрес Cloud Run в список авторизованных доменов Firebase:
- Вернитесь в консоль Firebase → Аутентификация → Настройки → Авторизованные домены
- Нажмите «Добавить домен» .
- Вставьте URL-адрес вашей службы Cloud Run (например,
dinoquest-xxxxx.us-central1.run.app) — удалите префиксhttps:// - Нажмите «Сохранить».
8. Подготовка данных для таблицы лидеров.
Чтобы оживить игру на начальном этапе и убедиться, что у ваших агентов есть данные, вы можете задать в таблице лидеров начальные значения очков.
- Убедитесь, что вы находитесь в корневом каталоге
dinoquest:cd ~/dinoquest - Создайте и активируйте виртуальную среду:
python3 -m venv venv source venv/bin/activate - Установите необходимые зависимости Firestore:
pip install google-cloud-firestore - Запустите скрипт для инициализации системы:
python3 prep/seed_scores.py - Отключите виртуальную среду:
deactivate
Теперь вы можете открыть URL-адрес сервиса в своем браузере — DinoQuest полностью запущен!
4. Обустройство Динозаврового Театра
Роль агента: Визуализатор . Как отслеживать работу автономной команды агентов? Dino Theater предоставляет возможность в режиме реального времени заглянуть в мысли вашего роя агентов. Вместо того чтобы смотреть на журналы терминала, вы можете наблюдать за тем, как ваши агенты рассуждают, связываются друг с другом и выполняют задачи в облаке, на наглядной панели мониторинга в реальном времени.

А. Разверните Dino Theater на Cloud Run
Сначала вернитесь в свою домашнюю директорию и клонируйте код Dino Theater:
cd ~
git clone https://github.com/gca-americas/dinoquest-theater.git
cd dinoquest-theater
- Соберите и отправьте контейнер:
gcloud builds submit --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest . - Настройка служебной учетной записи и прав доступа:
# 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" - Разверните приложение:
Примечание: Рекомендуется использоватьgcloud run deploy dino-theater \ --image $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest \ --region=$CLOUD_RUN_REGION \ --service-account=dino-theater@${PROJECT_ID}.iam.gserviceaccount.com \ --set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID" \ --allow-unauthenticated \ --min-instances=1--min-instances=1для поддержания активного соединения SSE между событиями. - Убедитесь, что всё работает: откройте URL-адрес развернутой службы в браузере (например,
https://dino-theater-xxx-uc.a.run.app/demo).
5. Агентный DevOps в IDE
Роль агента: Нативный Antigravity . Чтобы устранить разрыв между вашей IDE и облаком, мы подключаем Antigravity к управляемым серверам MCP Google Cloud. Это позволяет вашему нативному агенту «смотреть» на ваш проект, анализировать логи, проверять метрики и анализировать инфраструктуру без необходимости вам возиться с ключами API или переключаться на консоль.
Перед запуском каких-либо навыков необходимо настроить доступ Antigravity к Google Cloud и загрузить сценарии выполнения навыков DinoQuest.
А. Установите сервис Google Managed MCP.
Сервис Google Managed MCP предоставляет доступ ко всем API Google Cloud через единую размещенную конечную точку.
Аутентификация с использованием учетных данных приложения по умолчанию:
gcloud auth application-default login
B. Настройка файла mcp_config.json
Создайте или обновите mcp_config.json в каталоге конфигурации Antigravity (обычно ~/.gemini/antigravity/mcp_config.json ) или через консоль. Это предоставит Antigravity доступ к инструментам Google Cloud и GitHub, необходимым для работы этих специалистов:
{
"mcpServers": {
"google-developer-knowledge": {
"serverUrl": "https://developerknowledge.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-bigquery": {
"serverUrl": "https://bigquery.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-cloud-logging": {
"serverUrl": "https://logging.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-cloud-monitoring": {
"serverUrl": "https://monitoring.googleapis.com/mcp",
"authProviderType": "google_credentials",
"disabledTools": [
"get_dashboard",
"list_dashboards"
]
},
"google-cloud-run": {
"serverUrl": "https://run.googleapis.com/mcp",
"authProviderType": "google_credentials",
"disabledTools": [
"deploy_service_from_image",
"deploy_service_from_archive",
"deploy_service_from_file_contents"
]
},
"google-cloud-sql": {
"serverUrl": "https://sqladmin.googleapis.com/mcp",
"authProviderType": "google_credentials",
"disabled": true
},
"google-cloud-trace": {
"serverUrl": "https://cloudtrace.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-error-reporting": {
"serverUrl": "https://clouderrorreporting.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-firestore": {
"serverUrl": "https://firestore.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-resource-manager": {
"serverUrl": "https://cloudresourcemanager.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"gemini-cloud-assist": {
"serverUrl": "https://geminicloudassist.googleapis.com/mcp",
"authProviderType": "google_credentials"
}
}
}
C. Загрузите навыки в режим «Антигравитация» (необязательно)
Antigravity обнаруживает навыки в определенных стандартных каталогах. Скопируйте навыки DinoQuest из клонированного репозитория в глобальную папку навыков Antigravity:
# Create the standard skills directory if it doesn't exist
mkdir -p ~/.gemini/antigravity/skills
# Copy all DinoQuest skills into the global skills folder
cp -r skills/* ~/.gemini/antigravity/skills/
D. Перезапуск антигравитации (необязательно)
Чтобы применить изменения из файла mcp_config.json и загрузить скопированные навыки, перезапустите приложение Antigravity .
После перезапуска:
- Убедитесь, что серверы Google и GitHub MCP отображаются в настройках в зеленом статусе «Подключено».
- Убедитесь, что навыки из DinoQuest отображаются в вашем списке навыков.
Примечание: Для каждого навыка в верхней части файла SKILL.md есть таблица ## Configuration . После копирования вам следует обновить значения в ~/.gemini/antigravity/skills/ для соответствия вашему проекту.
E. Исправление работы облачного сервиса в локальной среде разработки.
- Чтобы вызвать ошибку : откройте URL-адрес развернутой версии DinoQuest (из предыдущего шага) в браузере.
- Перейдите в таблицу лидеров : нажмите на кнопку «Таблица лидеров» . Текущая реализация таблицы лидеров намеренно неэффективна — она попытается загрузить в память огромный объем данных, что вызовет ошибку «Недостаточно памяти» (OOM).
- В менеджере агентов Antigravity (центре агентов) попросите его помочь устранить ошибку и, возможно, исправить ее первопричину.
- Задание 1: Выясните, что не так с Dinoquest.
- Задание 2: Не могли бы вы посмотреть код игры Dinoquest и исправить причину ошибки нехватки памяти?
6. Передача логов в BigQuery и генерация аналитических данных.
Роль агента: Агент данных . Преобразование необработанных логов в действенную продуктовую стратегию не должно занимать часы ручной обработки данных. Используя Data Agent Kit и BigQuery MCP, мы создаем конвейер «нулевого ETL», который передает логи непосредственно в BigQuery, позволяя агенту генерировать премиальную аналитическую панель менее чем за две минуты.
Навык log-router-bq-report настраивает приемник Cloud Logging, который непрерывно передает журналы DinoQuest Cloud Run в BigQuery, а затем запрашивает данные для создания отчетов о трафике и аналитических выводов по игре.

А. Настройте переменные навыка.
Откройте skills/log-router-bq-report/SKILL.md в вашем репозитории DinoQuest и обновите раздел Configuration вверху:
| Variable | Your Value |
|---------------|--------------------|
| SERVICE_NAME | dinoquest |
| BQ_DATASET | dinoquest_logs |
| LOG_SINK_NAME | dinoquest-bq-sink |
Б. Запустите навык в режиме антигравитации.
Откройте Antigravity, используя репозиторий DinoQuest в качестве контекста, и сообщите Gemini:
Run the log-router-bq-report skill
Этот навык позволит:
- Автоматическое разрешение проблем с вашим проектом GCP.
- Проверьте, существует ли уже приемник данных BigQuery — если нет, он создаст набор данных и приемник.
- Предоставление разрешений IAM : это предоставит
writerIdentityприемника роль редактора данных BigQuery для набора данных.
Примечание: Как и в случае с Eventarc sink, во время этого процесса вы можете увидеть предупреждение от gcloud : «Пожалуйста, не забудьте предоставить serviceAccount:service-... роль редактора данных BigQuery для набора данных». Навык обрабатывает это автоматически.
C. Использование антигравитации для составления отчета.
Просто попросите Antigravity "настроить приемник логов BigQuery и сгенерировать аналитический отчет" . Агент выполнит следующие действия:
- Настройка инфраструктуры : создание набора данных BigQuery и приемника Cloud Logging.
- Управление разрешениями : Автоматическое предоставление необходимых ролей IAM учетной записи автора в приемнике.
- Получайте аналитические данные : анализируйте логи и создавайте высококачественную интерактивную HTML-панель с телеметрией игры и анализом процента побед.
7. Самовосстанавливающееся лечебное средство
Роль агента: SRE-агент . Когда производственный сервис выходит из строя в 2 часа ночи, вам не нужно просыпаться. Этот агент выступает в роли вашего первого реагирующего. Запускаемый на основе журналов ошибок Cloud Run через Eventarc, он автоматически анализирует сбой, предлагает решение и запускает конвейер устранения неполадок — и всё это ещё до того, как вы войдете в консоль.
DinoAgent — это агент ADK, который отслеживает журналы ошибок Cloud Run через Eventarc, диагностирует первопричину и автоматически устраняет проблему — либо увеличивая объем памяти, либо откатывая трафик, либо отправляя запрос на исправление кода в GitHub.

А. Клонируйте репозиторий агента восстановления.
cd ~
git clone https://github.com/gca-americas/dinoquest-reme-agent.git
cd dinoquest-reme-agent
Структура проекта:
dinoquest-reme-agent/
├── main.py # Service entrypoint — receives Eventarc HTTP POST, runs agent
├── runner.py # ADK Runner + session service
├── agent.py # LlmAgent definition, loads skill from file
├── tools.py # Cloud Run v2 API tools (list/get/rollback/update)
├── skills/
│ └── remediation/
│ ├── SKILL.md # Agent playbook — edit this to change behavior
│ └── scripts/ # Shell scripts for the code-fix track
│ ├── clone_repo.sh
│ ├── read_file.sh
│ ├── apply_fix.sh
│ ├── commit_branch.sh
│ ├── open_pr.sh
│ └── rollback_fix.sh
├── requirements.txt
└── Dockerfile
B. Настройка доступа к GitHub (система отслеживания исправлений кода).
Функция исправления кода клонирует ваш репозиторий DinoQuest, считывает исходные файлы, применяет патчи и открывает запросы на слияние (PR). Для этого требуется персональный токен доступа GitHub с областью действия repo .
- Перейдите на github.com/settings/tokens → Сгенерировать новый токен (классический способ)
- Присвойте ему имя, выберите область действия
repo→ Сгенерировать токен → скопируйте его.
Сохраните это в Secret Manager:
Сначала экспортируйте свой токен GitHub:
export GH_TOKEN=ghp_YOUR_TOKEN_HERE
Затем создайте секрет:
echo -n $GH_TOKEN | \
gcloud secrets create github-token --data-file=-
C. Настройка уведомлений в Slack (необязательно)
После завершения процесса устранения неполадок DinoAgent публикует сводку в канале Slack.
- Перейдите на api.slack.com/apps → Создать новое приложение → С нуля
- Назовите его
DinoAgent, выберите рабочую область → Создать приложение - В разделе «Функции» → «Входящие веб-перехватчики» → включите эту опцию.
- Нажмите «Добавить новый веб-перехватчик в рабочую область» → выберите канал → «Разрешить».
- Скопируйте URL веб-перехватчика (
https://hooks.slack.com/services/...)
Сохраните это в Secret Manager:
export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
gcloud secrets create slack-webhook --data-file=-
D. Создайте учетную запись службы DinoAgent.
gcloud iam service-accounts create remediation-agent \
--display-name="Cloud Run Remediation Agent"
export SA="remediation-agent@${PROJECT_ID}.iam.gserviceaccount.com"
for ROLE in \
roles/run.admin \
roles/iam.serviceAccountUser \
roles/eventarc.eventReceiver \
roles/aiplatform.user \
roles/artifactregistry.reader \
roles/secretmanager.secretAccessor \
roles/pubsub.publisher \
roles/logging.viewer; do
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SA}" --role="$ROLE" \
--condition=None
done
Предоставьте ему доступ к секретам:
for SECRET in github-token slack-webhook; do
gcloud secrets add-iam-policy-binding $SECRET \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
done
E. Создание и развертывание DinoAgent в 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. Подключите триггер Eventarc.
Создайте тему Pub/Sub для получения журналов ошибок Cloud Run:
gcloud pubsub topics create cloud-run-errors
Создайте приемник Cloud Logging, который будет фильтровать журналы ошибок из вашего сервиса dinoquest и направлять их в соответствующую тему:
export SERVICE_NAME=dinoquest
FILTER="resource.type=\"cloud_run_revision\" resource.labels.service_name=\"$SERVICE_NAME\" severity=ERROR NOT logName=~\"cloudaudit\" NOT httpRequest.requestUrl=~\"/_ah/health\""
gcloud logging sinks create cloud-run-errors-sink \
pubsub.googleapis.com/projects/${PROJECT_ID}/topics/cloud-run-errors \
--log-filter="$FILTER"
Примечание: При выполнении указанной выше команды gcloud выведет информационное сообщение: «Пожалуйста, не забудьте предоставить serviceAccount:service-... роль издателя/подписчика для темы». Следующий шаг обрабатывает именно это.
Предоставьте учетной записи автора приемника (указанной в предупреждении учетной записи службы) разрешение на публикацию:
SINK_SA=$(gcloud logging sinks describe cloud-run-errors-sink \
--format='value(writerIdentity)')
gcloud pubsub topics add-iam-policy-binding cloud-run-errors \
--member="${SINK_SA}" --role="roles/pubsub.publisher"
Убедитесь, что оно активно:
gcloud eventarc triggers describe remediation-trigger --location=$CLOUD_RUN_REGION
Предоставьте Eventarc разрешение на вызов агента по устранению неполадок:
gcloud run services add-iam-policy-binding remediation-agent \
--region=$CLOUD_RUN_REGION \
--member="serviceAccount:${SA}" \
--role="roles/run.invoker"
Создайте триггер Eventarc:
gcloud eventarc triggers create remediation-trigger \
--location=$CLOUD_RUN_REGION \
--destination-run-service=remediation-agent \
--destination-run-region=$CLOUD_RUN_REGION \
--event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
--transport-topic=projects/${PROJECT_ID}/topics/cloud-run-errors \
--service-account=${SA}
Процесс исправления теперь полностью автоматизирован. Помимо масштабирования инфраструктуры, DinoAgent проводит глубокий анализ первопричин в коде приложения, применяет семантический патч и использует связь между агентами (A2A) для передачи исправления агенту CI для проверки и развертывания. Подробности реализации можно изучить в кодовой базе reme-agent .
8. Настройте агент CI.
Роль агента: конвейер CI . Прекратите возиться со сложными YAML-файлами и скриптами ручной сборки. Этот агент управляет операционной инфраструктурой ваших запросов на слияние (PR). Он читает ваши изменения в коде, понимает контекст, определяет необходимые тесты и собирает ваши образы Docker с помощью Cloud Build, гарантируя, что каждый коммит будет «одобрен агентом» до того, как он попадет в основную ветку.
ci-agent — это автономный агент конвейера CI, развернутый в качестве сервиса Cloud Run. Он отправляет сборки Docker в Cloud Build, отслеживает завершение сборки, проверяет образ в реестре артефактов и отправляет отчет в GitHub.

Почему стоит использовать агент для конвейера CI? В отличие от традиционных статических скриптов, агентный конвейер CI обеспечивает:
- Классификация когнитивной области : она интеллектуально определяет необходимую глубину тестирования — переключаясь между проверками типов, модульными тестами или полными интеграционными наборами тестов — в зависимости от семантического влияния изменений в коде.
- Автономное управление запросами на изменения : агент может автоматически создавать запросы на изменения, публиковать подробные сводки изменений и даже управлять сканированием секретной информации и аудитами безопасности без вмешательства человека.
- Диагностика сбоев в реальном времени : когда сборка завершается с ошибкой, агент не просто отображает логи; он анализирует трассировку стека, определяет вероятную причину и отправляет удобочитаемый диагноз непосредственно в запрос на слияние.
А. Клонируйте репозиторий CIAgent.
cd ~
git clone https://github.com/gca-americas/dinoquest-ci-agent.git
cd dinoquest-ci-agent
B. Создайте учетную запись службы CIAgent.
gcloud iam service-accounts create ci-agent \
--display-name="CIAgent CI Pipeline"
export SA="ci-agent@${PROJECT_ID}.iam.gserviceaccount.com"
# Grant necessary roles to the service account
for ROLE in \
roles/cloudbuild.builds.editor \
roles/cloudbuild.builds.builder \
roles/artifactregistry.reader \
roles/artifactregistry.writer \
roles/aiplatform.user \
roles/secretmanager.secretAccessor \
roles/pubsub.publisher \
roles/developerconnect.admin; do
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SA}" --role="$ROLE" \
--condition=None
done
# ci-agent needs to act as itself when running build steps
gcloud iam service-accounts add-iam-policy-binding $SA \
--member="serviceAccount:${SA}" \
--role="roles/iam.serviceAccountUser"
C. Подключите репозиторий GitHub к Cloud Build.
CIAgent отправляет сборки через repoSource , для чего требуется подключение репозитория GitHub к Cloud Build Developer Connect.
- Перейдите в консоль GCP → Cloud Build → Репозитории
- Нажмите «Подключить репозиторий»
- Выберите GitHub (создайте облачное приложение GitHub).
- Авторизуйте и выберите свой репозиторий
YOUR_GITHUB_USERNAME/dinoquest - Для создания триггера нажмите «Подключить» и «Пропустить» , когда появится соответствующий запрос.
- Запишите имя вашего подключения (по умолчанию это обычно ваше имя пользователя GitHub или аналогичное).
Д. Грант, агент ЦРУ, получил доступ к секретам.
Мы повторно используем секреты, созданные ранее для DinoAgent:
gcloud secrets add-iam-policy-binding github-token \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
gcloud secrets add-iam-policy-binding slack-webhook-ci \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
E. Создание и развертывание CIAgent в Cloud Run
# Set up required variables for orchestration
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export CDAGENT_URL=https://cd-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export CI_AGENT_URL=ci-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export GITHUB_OWNER="YOUR_GITHUB_USERNAME"
export CLOUD_BUILD_CONNECTION="YOUR_CONNECTION_NAME" # Update this if your connection name is different
export CLOUD_BUILD_REPO="YOUR_GITHUB_USERNAME-dinoquest" # Update this if your connection name is different
export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
gcloud secrets create slack-webhook-ci --data-file=-
export SA="ci-agent@${PROJECT_ID}.iam.gserviceaccount.com"
AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/ci-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .
gcloud run deploy ci-agent \
--image=$AGENT_IMAGE \
--region=$CLOUD_RUN_REGION \
--service-account=$SA \
--memory=1Gi \
--timeout=600 \
--allow-unauthenticated \
--min-instances=1 \
--set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID},GOOGLE_GENAI_USE_VERTEXAI=True" \
--set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
--set-env-vars="HOST=${CI_AGENT_URL},PROTOCOL=https" \
--set-secrets="SLACK_WEBHOOK_URL=slack-webhook-ci:latest" \
--set-env-vars="GITHUB_OWNER=${GITHUB_OWNER},GITHUB_REPO=dinoquest" \
--set-env-vars="CLOUD_BUILD_CONNECTION=${CLOUD_BUILD_CONNECTION},CLOUD_BUILD_REPO=${CLOUD_BUILD_REPO},CLOUD_BUILD_REGION=${CLOUD_RUN_REGION}" \
--set-env-vars="CDAGENT_URL=${CDAGENT_URL}" \
--set-secrets="GITHUB_TOKEN=github-token:latest" \
--min-instances=1
F. Настройка команды Slack с косой чертой
- Перейдите на api.slack.com/apps → Создать новое приложение → С нуля
- Назовите его
CIAgent, выберите рабочее пространство → Создать приложение - В разделе «Функции» → «Команды со слэшем» → «Создать новую команду»
- Команда:
/runci - URL запроса: ваш URL-адрес CIAgent Cloud Run, указанный выше, с добавлением
/slack(например,https://ci-agent-xxx-.us-central1.run.app/slack) - Краткое описание:
Trigger CI - Сохранять
- В разделе «Настройки» → «Установка приложений» нажмите «Установить в рабочую область» и разрешите установку.
Агент CI выступает в роли «мозга», работающего поверх мощных сервисов Google Cloud, таких как Cloud Build и Artifact Registry. После проверки сборки он запускает заключительный этап развертывания, вызывая агента CD через A2A , обеспечивая бесперебойную передачу данных между циклами сборки и выпуска.
9. Настройка развертывания
Роль агента: Агент непрерывной доставки (CD Agent ). Развертывание не должно быть рискованным шагом. Этот агент управляет рисками за вас. Он оценивает безопасность развертывания, управляет распределением трафика для канареечных тестов и отслеживает метрики в реальном времени, чтобы решить, следует ли продвигать релиз или откатить его. Это последний привратник в вашем автономном рое агентов.
cd-agent — это автономный агент канареечного развертывания, развертываемый как сервис Cloud Run. Он получает запросы на развертывание A2A от ci-agent , вычисляет оценку риска, устанавливает процент канареечного развертывания с учетом риска, отслеживает метрики и автоматически продвигает или откатывает развертывание. Он также обучается на основе предыдущих развертываний с помощью Firestore.

Прямое соединение агентов создает «когнитивный конвейер», где каждая передача информации представляет собой содержательный обмен намерениями и контекстом. В отличие от традиционных веб-хуков, коммуникация A2A позволяет:
- Интеллектуальный обмен контекстной информацией : агенты передают всю память сессии, различия в запросах на слияние и оценки рисков, гарантируя, что следующий агент получит полную информацию о «причине» перед началом работы.
- Когнитивные рукопожатия : Агенты могут согласовывать этапы проверки. Например, агент CD может запросить у агента CI проведение конкретных дымовых тестов во время развертывания «канареечного» обновления, чтобы проверить исправление в режиме реального времени.
- Совместное устранение неполадок : Если развертывание завершается с ошибкой, агент непрерывной доставки может заблаговременно уведомить агента устранения неполадок о некорректных метриках, инициируя автономный анализ первопричин еще до того, как будет вызван специалист.
- Согласование ресурсов : Агенты могут согласовывать потребности в инфраструктуре. Например, агент CI может попросить агента исправления выделить больше ресурсов сборки, если обнаружит масштабную рефакторизацию, или агент непрерывной доставки может предложить масштабировать производственный кластер перед крупным релизом.
- Согласование несколькими агентами : для изменений с высоким риском несколько агентов (например, агент безопасности и агент непрерывной доставки) могут выполнить «совместное утверждение» через A2A, гарантируя, что код не только собирается и развертывается, но и соответствует политикам безопасности до попадания в производственную среду.
А. Клонируйте репозиторий CDAgent.
cd ~
git clone https://github.com/gca-americas/dinoquest-cd-agent.git
cd dinoquest-cd-agent
B. Создайте базу данных Firestore.
CDAgent хранит шаблоны развертывания в памяти Firestore:
gcloud firestore databases create \
--region=$CLOUD_RUN_REGION \
--project=$PROJECT_ID
(Если вы уже создали базу данных в этом проекте, можете пропустить этот шаг.)
C. Создайте учетную запись службы CDAgent.
gcloud iam service-accounts create cd-agent \
--display-name="CDAgent Canary Deployer"
export SA="cd-agent@${PROJECT_ID}.iam.gserviceaccount.com"
# Grant necessary roles
for ROLE in \
roles/run.developer \
roles/iam.serviceAccountUser \
roles/artifactregistry.reader \
roles/artifactregistry.writer \
roles/monitoring.viewer \
roles/datastore.user \
roles/aiplatform.user \
roles/run.admin \
roles/pubsub.publisher; do
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SA}" --role="$ROLE" \
--condition=None
done
Д. Грант CDAgent получает доступ к секретам.
Мы повторно используем токен GitHub и веб-перехватчик Slack, которые использовались ранее, и предоставим учетной записи вычислительной службы Cloud Run доступ к ключу API Gemini, чтобы развернутое приложение могло его использовать:
gcloud secrets add-iam-policy-binding github-token \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
gcloud secrets add-iam-policy-binding slack-webhook-cd \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
# Grant the compute service account access to Gemini API key
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gemini-api-key \
--project=$PROJECT_ID \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
E. Создайте и разверните CDAgent в Cloud Run.
export GITHUB_OWNER="YOUR_GITHUB_USERNAME"
export CD_AGENT_URL=cd-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
gcloud secrets create slack-webhook-cd --data-file=-
AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/cd-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .
export SA="cd-agent@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud run deploy cd-agent \
--image=$AGENT_IMAGE \
--region=$CLOUD_RUN_REGION \
--service-account=$SA \
--memory=1Gi \
--set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID}" \
--set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=True" \
--set-env-vars="HOST=${CD_AGENT_URL},PROTOCOL=https" \
--set-env-vars="CD_TARGET_SERVICE=dinoquest" \
--set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
--set-env-vars="GITHUB_OWNER=${GITHUB_OWNER}" \
--set-env-vars="GITHUB_REPO=dinoquest" \
--set-env-vars="DEMO_MODE=true" \
--set-env-vars="LEADERBOARD_ENABLED=true" \
--set-secrets="SLACK_WEBHOOK_URL=slack-webhook-cd:latest" \
--set-secrets="GITHUB_TOKEN=github-token:latest" \
--allow-unauthenticated \
--min-instances=1 \
--no-cpu-throttling \
--timeout=300
Примечание: --min-instances=1 --no-cpu-throttling поддерживает экземпляр в рабочем состоянии, чтобы он мог быстро отвечать на команды Slack и A2A.
Агент непрерывной доставки (CD Agent) — это последний привратник вашей производственной среды. Он оценивает риски каждого развертывания, запускает предварительно настроенный тест на соответствие критериям риска и отслеживает метрики в реальном времени. При обнаружении каких-либо аномалий он инициирует автоматический откат.
10. Масштабирование: Разблокировка 2-го уровня с помощью Роя Агентов
А. Проверка работы всего роя.
- Чтобы вызвать ошибку : откройте URL-адрес развернутой версии DinoQuest (из предыдущего шага) в браузере.
- Перейдите в таблицу лидеров : нажмите на кнопку «Таблица лидеров» . Текущая реализация таблицы лидеров намеренно неэффективна — она попытается загрузить в память огромный объем данных, что вызовет ошибку «Недостаточно памяти» (OOM).
- Ожидание агента : Примерно через 60 секунд
remediation-agentполучит событие ошибки через Eventarc и начнет диагностику. - Проверьте Slack : в вашем канале Slack должно появиться уведомление следующего вида: Сводка по устранению неполадок DinoAgent.
- Сервис : dinoquest
- Неудачная попытка проверки : dinoquest-xxxx-xxxx
- Доказательство : «Превышен лимит памяти в 128 МиБ, использовано в 13 раз больше МиБ».
- Почему эта версия оказалась неудачной : конечная точка
/api/leaderboardработала неэффективно, что привело к ошибке нехватки памяти (OOM). - Предпринятые действия : Увеличено количество памяти с xMi до yGi для сервиса
dinoquest. Создана новая ревизия. - Первопричина запроса на слияние : https://github.com/YOUR_USERNAME/DinoQuest/pull/x
- Проверьте исправления :
- GitHub : Проверьте свой репозиторий на наличие новой ветки и запроса на слияние (Pull Request). Агент внес исправления в код приложения для устранения утечки памяти.
- Cloud Run : В консоли GCP вы увидите новую версию сервиса
dinoquestс обновленным распределением памяти. - Таблица лидеров : Попробуйте еще раз просмотреть таблицу лидеров — теперь она должна успешно загрузиться благодаря увеличенному объему памяти и возможному исправлению кода.
Б. Эволюция: Реализация игровой логики 2-го уровня
Вы добавите новую важную функцию: Уровень 2 (Уничтожитель астероидов) . Это позволит динозаврам с высокими результатами перейти в новый игровой режим.
- Вернитесь в свой репозиторий Dinoquest :
cd ~/dinoquest - Создайте новую ветку и переключитесь на неё :
git checkout -b level_2 - Примените патч уровня 2 : Запустите предоставленный скрипт, чтобы внести изменения в локальный код, добавив ресурсы, компоненты и игровую логику уровня 2:
bash level_2_backup/levelup.sh - Внедрите изменения и продвигайте их :
git add . git commit -m "feat: add Level 2" git push origin level_2
Вместо того чтобы использовать curl для ручного запуска агента, мы будем использовать команду Slack Slash Command, которую вы настроили ранее. Так происходит взаимодействие с вашим автономным конвейером CI в реальных условиях.
- Откройте Slack и перейдите в любой канал, где установлено приложение
CIAgent. - Чтобы запустить сборку CI , введите следующую команду:
/runci run ci on branch level_2 - Отслеживайте ход выполнения :
- Slack : Агент подтвердит вашу команду и будет публиковать обновления по мере выполнения сборки.
- Театр Дино : Наблюдайте за «облачками мыслей», пока агент классифицирует изменение, отправляет задание Cloud Build и взаимодействует с агентом CD.
- GitHub : Проверьте свой запрос на слияние
level_2; вы увидите, что агент публикует статусы коммитов и полный комментарий к отчету CI.
- Посмотрите, как это происходит :
- Посмотрите Dino Theater , чтобы увидеть, как агент CI обрабатывает информацию, классифицирует изменения и запускает конвейер.
- Проверьте свой запрос на слияние (PR) на GitHub, чтобы увидеть, как агент CI публикует статус коммита и итоговый отчет.
11. Заключение
Вы создали полноценную агентную DevOps-инфраструктуру в Google Cloud:
Компонент | Что это делает |
DinoQuest (Cloud Run | Игра на платформе Gemini — фронтенд на React + бэкенд на FastAPI. |
Firebase Auth + Firestore | Аутентификация пользователей и хранение профилей динозавров |
Агент для устранения неполадок (Cloud Run + Eventarc) | SRE-агент, автоматически устраняющий ошибки нехватки памяти и ошибки в коде. |
log-router-bq-report | Агент данных, который передает журналы в BigQuery и генерирует аналитические данные. |
CIAgent (Cloud Run) | Агент CI, который определяет область тестирования, создает образы и вызывает CD через A2A. |
CDAgent (Cloud Run) | Агент непрерывной доставки (CD), запускающий тестовые развертывания с оценкой рисков и автоматическим откатом. |
Все действия агента хранятся в каталоге skills/ в виде плейбуков Markdown — изменить поведение можно, отредактировав навык, а не код. Навыки работают на Antigravity с Gemini и вызываются путем указания агенту, какой навык нужно запустить.