Deploy to Google Cloud Run

Cloud Run runs containers on demand, scales to zero when idle, and charges only for active request time. It's what Axon Cloud itself runs on.

1. Build

axon build
# → .agent/image.tar

2. Push to Artifact Registry

gcloud auth login
gcloud config set project YOUR_PROJECT_ID

# Create a repository if you don't have one
gcloud artifacts repositories create agents \
  --repository-format=docker \
  --location=europe-west1

# Load and push
docker load < .agent/image.tar
docker tag my-agent europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest
gcloud auth configure-docker europe-west1-docker.pkg.dev
docker push europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest

3. Deploy

gcloud run deploy my-agent \
  --image europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest \
  --region europe-west1 \
  --port 3000 \
  --allow-unauthenticated \
  --set-env-vars AXON_API_KEY=axon_...

Add any other keys your agent needs with --set-env-vars KEY=value,KEY2=value2.

For production, store secrets in Secret Manager instead of passing them inline:

echo -n "axon_..." | gcloud secrets create AXON_API_KEY --data-file=-
echo -n "ghp_..."  | gcloud secrets create GITHUB_TOKEN --data-file=-

gcloud run deploy my-agent \
  --image europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest \
  --region europe-west1 \
  --port 3000 \
  --allow-unauthenticated \
  --set-secrets AXON_API_KEY=AXON_API_KEY:latest,GITHUB_TOKEN=GITHUB_TOKEN:latest

Cloud Run prints your service URL when the deployment completes.

Subsequent deploys

Push a new image and redeploy:

axon build
docker load < .agent/image.tar
docker tag my-agent europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest
docker push europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest
gcloud run deploy my-agent --image europe-west1-docker.pkg.dev/YOUR_PROJECT_ID/agents/my-agent:latest