Рабочие процессы, ориентированные на агента: от запроса до выполнения.

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 and npm
  • python3 ≥ 3.11
  • git and gh (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

  1. Go to console.firebase.google.com
  2. Нажмите «Добавить проект» (эта опция скрыта в меню создания нового проекта) → выберите существующий проект GCP (или создайте новый).
  3. Отключите Google Analytics, если появится соответствующее сообщение → Создать проект (или можете использовать настройки по умолчанию).

B. Enable Google Authentication

  1. В консоли Firebase перейдите в раздел Безопасность → Аутентификация (Начало работы) → Способ входа в систему
  2. Нажмите Googleвключите → сохраните адрес электронной почты службы поддержки → Сохранить

C. Add localhost as an authorized domain

  1. Still in Authentication , click the Settings tab
  2. В разделе «Авторизованные домены» убедитесь, что localhost указан (он должен быть там по умолчанию).

D. Create a Firestore database

  1. Перейдите в раздел «База данных и хранилище» → «База данных Firestore» → «Создать базу данных».
  2. Choose Standard EditionNext
  3. Выберите регион us-central1 (или соответствующий региону вашего Cloud Run)
  4. Choose Start in production modeCreate

После создания запишите идентификатор вашей базы данных — он будет выглядеть как (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

  1. Перейдите в «Настройки проекта» (значок шестеренки) → вкладка «Общие» .
  2. Прокрутите до раздела «Ваши приложения» → нажмите «Добавить приложение» → выберите значок «Веб» ( )
  3. Name it dinoquestRegister app
  4. Скопируйте показанный объект firebaseConfig — он вам понадобится чуть позже.

3. Running the Game

Роль агента: Окружающая среда . Прежде чем мы сможем запустить наших агентов, нам нужен мир, которым они смогут управлять. На этом этапе мы развернем версию DinoQuest "Day One". Это создаст работающий сервис, журналы и состояние, которые наш рой позже обнаружит и будет обрабатывать.

Обзор

Выберите один из двух вариантов ниже. В любом случае будет создан объект GEMINI_API_KEY который вы будете использовать одинаково на каждом последующем шаге — никаких других изменений не потребуется.

А. Настройка ключа API Gemini

Vertex AI позволяет создать ключ API Gemini, напрямую привязанный к вашему проекту GCP и оплачиваемый с его помощью, используя учетную запись сервиса проекта по умолчанию — отдельная учетная запись AI Studio не требуется.

  1. Export your GCP project ID:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    
  2. Включите необходимые API и предоставьте необходимые разрешения учетной записи службы Compute Engine по умолчанию:
    gcloud auth application-default set-quota-project $PROJECT_ID
    gcloud config set project $PROJECT_ID
    
    # Enable Vertex AI, Compute Engine, and Generative Language APIs
    gcloud services enable aiplatform.googleapis.com \
                           compute.googleapis.com \
                           generativelanguage.googleapis.com
    
    # Grant Vertex AI User role to the default compute service account
    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
      --role="roles/aiplatform.user" \
      --condition=None
    
  3. Откройте страницу с ключами API Vertex AI в облачной консоли.
  4. Нажмите «Создать учетные данные» → выберите «Ключ API».
  5. In the creation dialog:
    • Name the key Dino_Key
    • Установите флажок «Аутентифицировать вызовы API через учетную запись службы» .
    • В разделе «Учетная запись службы» выберите учетную запись службы вычислений по умолчанию ( PROJECT_NUMBER-compute@developer.gserviceaccount.com ).
    • В разделе «Выбор ограничений API» установите флажок «GEMINI API» .
    • Нажмите «Создать».
  6. Скопируйте сгенерированный ключ.

Option B — AI Studio (quickest for local dev)

  1. Open aistudio.google.com
  2. Click Get API key in the left sidebar
  3. Нажмите «Создать ключ 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:

  1. Вернитесь в консоль FirebaseАутентификация → Настройки → Авторизованные домены
  2. Нажмите «Добавить домен» .
  3. Вставьте URL-адрес вашей службы Cloud Run (например, dinoquest-xxxxx.us-central1.run.app ) — удалите префикс https://
  4. Нажмите «Сохранить».

8. Подготовка данных для таблицы лидеров.

Чтобы оживить игру на начальном этапе и убедиться, что у ваших агентов есть данные, вы можете задать в таблице лидеров начальные значения очков.

  1. Убедитесь, что вы находитесь в корневом каталоге dinoquest :
    cd ~/dinoquest
    
  2. Создайте и активируйте виртуальную среду:
    python3 -m venv venv
    source venv/bin/activate
    
  3. Установите необходимые зависимости Firestore:
    pip install google-cloud-firestore
    
  4. Запустите скрипт для инициализации системы:
    python3 prep/seed_scores.py
    
  5. Отключите виртуальную среду:
    deactivate
    

Теперь вы можете открыть 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
  1. Соберите и отправьте контейнер:
    gcloud builds submit --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest .
    
  2. Настройка служебной учетной записи и прав доступа:
    # Create the service account
    gcloud iam service-accounts create dino-theater
    
    # Create the Pub/Sub topic (if you haven't yet)
    gcloud pubsub topics create harness-events
    
    # Create the subscription
    gcloud pubsub subscriptions create harness-events-theater \
      --topic=harness-events
    
    # Grant subscriber role
    gcloud pubsub subscriptions add-iam-policy-binding harness-events-theater \
      --member="serviceAccount:dino-theater@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role="roles/pubsub.subscriber"
    
  3. Разверните приложение:
    gcloud run deploy dino-theater \
      --image $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest \
      --region=$CLOUD_RUN_REGION \
      --service-account=dino-theater@${PROJECT_ID}.iam.gserviceaccount.com \
      --set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID" \
      --allow-unauthenticated \
      --min-instances=1
    
    Примечание: Рекомендуется использовать --min-instances=1 для поддержания активного соединения SSE между событиями.
  4. Убедитесь, что всё работает: откройте 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 .

После перезапуска:

  1. Убедитесь, что серверы Google и GitHub MCP отображаются в настройках в зеленом статусе «Подключено».
  2. Убедитесь, что навыки из DinoQuest отображаются в вашем списке навыков.

Примечание: Для каждого навыка в верхней части файла SKILL.md есть таблица ## Configuration . После копирования вам следует обновить значения в ~/.gemini/antigravity/skills/ /SKILL.md для соответствия вашему проекту.

E. Исправление работы облачного сервиса в локальной среде разработки.

  1. Чтобы вызвать ошибку : откройте URL-адрес развернутой версии DinoQuest (из предыдущего шага) в браузере.
  2. Перейдите в таблицу лидеров : нажмите на кнопку «Таблица лидеров» . Текущая реализация таблицы лидеров намеренно неэффективна — она попытается загрузить в память огромный объем данных, что вызовет ошибку «Недостаточно памяти» (OOM).
  3. В менеджере агентов 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

Этот навык позволит:

  1. Автоматическое разрешение проблем с вашим проектом GCP.
  2. Проверьте, существует ли уже приемник данных BigQuery — если нет, он создаст набор данных и приемник.
  3. Предоставление разрешений IAM : это предоставит writerIdentity приемника роль редактора данных BigQuery для набора данных.

Примечание: Как и в случае с Eventarc sink, во время этого процесса вы можете увидеть предупреждение от gcloud : «Пожалуйста, не забудьте предоставить serviceAccount:service-... роль редактора данных BigQuery для набора данных». Навык обрабатывает это автоматически.

C. Использование антигравитации для составления отчета.

Просто попросите Antigravity "настроить приемник логов BigQuery и сгенерировать аналитический отчет" . Агент выполнит следующие действия:

  1. Настройка инфраструктуры : создание набора данных BigQuery и приемника Cloud Logging.
  2. Управление разрешениями : Автоматическое предоставление необходимых ролей IAM учетной записи автора в приемнике.
  3. Получайте аналитические данные : анализируйте логи и создавайте высококачественную интерактивную 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 .

  1. Перейдите на github.com/settings/tokensСгенерировать новый токен (классический способ)
  2. Присвойте ему имя, выберите область действия repoСгенерировать токен → скопируйте его.

Сохраните это в Secret Manager:

Сначала экспортируйте свой токен GitHub:

export GH_TOKEN=ghp_YOUR_TOKEN_HERE

Затем создайте секрет:

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

C. Настройка уведомлений в Slack (необязательно)

После завершения процесса устранения неполадок DinoAgent публикует сводку в канале Slack.

  1. Перейдите на api.slack.com/appsСоздать новое приложение → С нуля
  2. Назовите его DinoAgent , выберите рабочую область → Создать приложение
  3. В разделе «Функции»«Входящие веб-перехватчики» → включите эту опцию.
  4. Нажмите «Добавить новый веб-перехватчик в рабочую область» → выберите канал → «Разрешить».
  5. Скопируйте 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 обеспечивает:

  1. Классификация когнитивной области : она интеллектуально определяет необходимую глубину тестирования — переключаясь между проверками типов, модульными тестами или полными интеграционными наборами тестов — в зависимости от семантического влияния изменений в коде.
  2. Автономное управление запросами на изменения : агент может автоматически создавать запросы на изменения, публиковать подробные сводки изменений и даже управлять сканированием секретной информации и аудитами безопасности без вмешательства человека.
  3. Диагностика сбоев в реальном времени : когда сборка завершается с ошибкой, агент не просто отображает логи; он анализирует трассировку стека, определяет вероятную причину и отправляет удобочитаемый диагноз непосредственно в запрос на слияние.

А. Клонируйте репозиторий CIAgent.

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

B. Создайте учетную запись службы CIAgent.

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

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

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



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

C. Подключите репозиторий GitHub к Cloud Build.

CIAgent отправляет сборки через repoSource , для чего требуется подключение репозитория GitHub к Cloud Build Developer Connect.

  1. Перейдите в консоль GCP → Cloud Build → Репозитории
  2. Нажмите «Подключить репозиторий»
  3. Выберите GitHub (создайте облачное приложение GitHub).
  4. Авторизуйте и выберите свой репозиторий YOUR_GITHUB_USERNAME/dinoquest
  5. Для создания триггера нажмите «Подключить» и «Пропустить» , когда появится соответствующий запрос.
  6. Запишите имя вашего подключения (по умолчанию это обычно ваше имя пользователя 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 с косой чертой

  1. Перейдите на api.slack.com/appsСоздать новое приложениеС нуля
  2. Назовите его CIAgent , выберите рабочее пространство → Создать приложение
  3. В разделе «Функции»«Команды со слэшем»«Создать новую команду»
  4. Команда: /runci
  5. URL запроса: ваш URL-адрес CIAgent Cloud Run, указанный выше, с добавлением /slack (например, https://ci-agent-xxx-.us-central1.run.app/slack )
  6. Краткое описание: Trigger CI
  7. Сохранять
  8. В разделе «Настройки»«Установка приложений» нажмите «Установить в рабочую область» и разрешите установку.

Агент CI выступает в роли «мозга», работающего поверх мощных сервисов Google Cloud, таких как Cloud Build и Artifact Registry. После проверки сборки он запускает заключительный этап развертывания, вызывая агента CD через A2A , обеспечивая бесперебойную передачу данных между циклами сборки и выпуска.

9. Настройка развертывания

Роль агента: Агент непрерывной доставки (CD Agent ). Развертывание не должно быть рискованным шагом. Этот агент управляет рисками за вас. Он оценивает безопасность развертывания, управляет распределением трафика для канареечных тестов и отслеживает метрики в реальном времени, чтобы решить, следует ли продвигать релиз или откатить его. Это последний привратник в вашем автономном рое агентов.

cd-agent — это автономный агент канареечного развертывания, развертываемый как сервис Cloud Run. Он получает запросы на развертывание A2A от ci-agent , вычисляет оценку риска, устанавливает процент канареечного развертывания с учетом риска, отслеживает метрики и автоматически продвигает или откатывает развертывание. Он также обучается на основе предыдущих развертываний с помощью Firestore.

Обзор

Прямое соединение агентов создает «когнитивный конвейер», где каждая передача информации представляет собой содержательный обмен намерениями и контекстом. В отличие от традиционных веб-хуков, коммуникация A2A позволяет:

  1. Интеллектуальный обмен контекстной информацией : агенты передают всю память сессии, различия в запросах на слияние и оценки рисков, гарантируя, что следующий агент получит полную информацию о «причине» перед началом работы.
  2. Когнитивные рукопожатия : Агенты могут согласовывать этапы проверки. Например, агент CD может запросить у агента CI проведение конкретных дымовых тестов во время развертывания «канареечного» обновления, чтобы проверить исправление в режиме реального времени.
  3. Совместное устранение неполадок : Если развертывание завершается с ошибкой, агент непрерывной доставки может заблаговременно уведомить агента устранения неполадок о некорректных метриках, инициируя автономный анализ первопричин еще до того, как будет вызван специалист.
  4. Согласование ресурсов : Агенты могут согласовывать потребности в инфраструктуре. Например, агент CI может попросить агента исправления выделить больше ресурсов сборки, если обнаружит масштабную рефакторизацию, или агент непрерывной доставки может предложить масштабировать производственный кластер перед крупным релизом.
  5. Согласование несколькими агентами : для изменений с высоким риском несколько агентов (например, агент безопасности и агент непрерывной доставки) могут выполнить «совместное утверждение» через 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-го уровня с помощью Роя Агентов

А. Проверка работы всего роя.

  1. Чтобы вызвать ошибку : откройте URL-адрес развернутой версии DinoQuest (из предыдущего шага) в браузере.
  2. Перейдите в таблицу лидеров : нажмите на кнопку «Таблица лидеров» . Текущая реализация таблицы лидеров намеренно неэффективна — она попытается загрузить в память огромный объем данных, что вызовет ошибку «Недостаточно памяти» (OOM).
  3. Ожидание агента : Примерно через 60 секунд remediation-agent получит событие ошибки через Eventarc и начнет диагностику.
  4. Проверьте Slack : в вашем канале Slack должно появиться уведомление следующего вида: Сводка по устранению неполадок DinoAgent.
    • Сервис : dinoquest
    • Неудачная попытка проверки : dinoquest-xxxx-xxxx
    • Доказательство : «Превышен лимит памяти в 128 МиБ, использовано в 13 раз больше МиБ».
    • Почему эта версия оказалась неудачной : конечная точка /api/leaderboard работала неэффективно, что привело к ошибке нехватки памяти (OOM).
    • Предпринятые действия : Увеличено количество памяти с xMi до yGi для сервиса dinoquest . Создана новая ревизия.
    • Первопричина запроса на слияние : https://github.com/YOUR_USERNAME/DinoQuest/pull/x
  5. Проверьте исправления :
    • GitHub : Проверьте свой репозиторий на наличие новой ветки и запроса на слияние (Pull Request). Агент внес исправления в код приложения для устранения утечки памяти.
    • Cloud Run : В консоли GCP вы увидите новую версию сервиса dinoquest с обновленным распределением памяти.
    • Таблица лидеров : Попробуйте еще раз просмотреть таблицу лидеров — теперь она должна успешно загрузиться благодаря увеличенному объему памяти и возможному исправлению кода.

Б. Эволюция: Реализация игровой логики 2-го уровня

Вы добавите новую важную функцию: Уровень 2 (Уничтожитель астероидов) . Это позволит динозаврам с высокими результатами перейти в новый игровой режим.

  1. Вернитесь в свой репозиторий Dinoquest :
    cd ~/dinoquest
    
  2. Создайте новую ветку и переключитесь на неё :
    git checkout -b level_2
    
  3. Примените патч уровня 2 : Запустите предоставленный скрипт, чтобы внести изменения в локальный код, добавив ресурсы, компоненты и игровую логику уровня 2:
    bash level_2_backup/levelup.sh
    
  4. Внедрите изменения и продвигайте их :
    git add .
    git commit -m "feat: add Level 2"
    git push origin level_2
    

Вместо того чтобы использовать curl для ручного запуска агента, мы будем использовать команду Slack Slash Command, которую вы настроили ранее. Так происходит взаимодействие с вашим автономным конвейером CI в реальных условиях.

  1. Откройте Slack и перейдите в любой канал, где установлено приложение CIAgent .
  2. Чтобы запустить сборку CI , введите следующую команду:
    /runci run ci on branch level_2
    
  3. Отслеживайте ход выполнения :
    • Slack : Агент подтвердит вашу команду и будет публиковать обновления по мере выполнения сборки.
    • Театр Дино : Наблюдайте за «облачками мыслей», пока агент классифицирует изменение, отправляет задание Cloud Build и взаимодействует с агентом CD.
    • GitHub : Проверьте свой запрос на слияние level_2 ; вы увидите, что агент публикует статусы коммитов и полный комментарий к отчету CI.
  4. Посмотрите, как это происходит :
    • Посмотрите Dino Theater , чтобы увидеть, как агент CI обрабатывает информацию, классифицирует изменения и запускает конвейер.
    • Проверьте свой запрос на слияние (PR) на GitHub, чтобы увидеть, как агент CI публикует статус коммита и итоговый отчет.

11. Заключение

Вы создали полноценную агентную DevOps-инфраструктуру в Google Cloud:

Компонент

Что это делает

DinoQuest (Cloud Run dinoquest )

Игра на платформе 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 и вызываются путем указания агенту, какой навык нужно запустить.