# Cloud Run Deployment

> Cloud Run Deployment Skill

- Skill: `agentient/cloud-run-deployment` (Agent Skill)
- Install (CLI): `npx skillmds@latest add agentient/cloud-run-deployment`
- Raw SKILL.md: https://api.skillmd.com/api/skills/agentient/cloud-run-deployment/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: Agentient (https://skillmd.com/u/agentient)
- Updated: 2026-09-21
- Page: https://skillmd.com/skills/agentient/cloud-run-deployment

---

# Cloud Run Deployment Skill

## Metadata (Tier 1)

**Keywords**: cloud run, deploy, gcloud run, scaling, concurrency, health check, traffic split, blue-green, canary, revision

**File Patterns**: service.yaml, cloudrun.yaml, *-deployment.sh

**Modes**: cloud_run_dev, deployment

**Activation**: When user mentions Cloud Run deployment, service configuration, or traffic management.

---

## Instructions (Tier 2)

### Core Deployment Patterns

#### 1. Basic Deployment
```bash
gcloud run deploy SERVICE \
  --image=IMAGE_URL \
  --region=REGION \
  --service-account=SA_EMAIL \
  --no-allow-unauthenticated
```

#### 2. Blue-Green Deployment
Deploy new revision without traffic, validate, then switch:
```bash
# Deploy with --no-traffic
gcloud run deploy SERVICE --image=NEW_IMAGE --no-traffic --tag=blue

# Validate health check
curl -f https://blue---SERVICE-xxx.run.app/health

# Shift traffic
gcloud run services update-traffic SERVICE --to-tags=blue=100
```

#### 3. Canary Deployment
Gradual traffic shift:
```bash
# Deploy canary
gcloud run deploy SERVICE --image=NEW_IMAGE --no-traffic --tag=canary

# 10% traffic
gcloud run services update-traffic SERVICE \
  --to-revisions=CANARY_REV=10,LATEST=90

# Monitor, then increase to 50%, 100%
```

### Scaling Configuration

- **min-instances**: Set >0 for latency-sensitive (eliminates cold starts)
- **max-instances**: Limit to control costs
- **concurrency**: Default 80, tune based on workload (lower for CPU-intensive, higher for I/O)

```bash
gcloud run deploy SERVICE \
  --min-instances=2 \
  --max-instances=50 \
  --concurrency=80
```

### Health Checks (MANDATORY)

Use service.yaml for startup and liveness probes:

```yaml
spec:
  template:
    spec:
      containers:
      - startupProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
          failureThreshold: 3
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          periodSeconds: 10
```

### Traffic Management

- **--to-latest**: Send 100% to latest revision
- **--to-tags=TAG=PERCENT**: Tag-based routing
- **--to-revisions=REV1=50,REV2=50**: Revision-based split

### Instant Rollback

```bash
PREVIOUS=$(gcloud run revisions list --service=SERVICE --limit=2 --format='value(metadata.name)' | tail -n 1)
gcloud run services update-traffic SERVICE --to-revisions=$PREVIOUS=100
```

### Anti-Patterns
❌ No health checks
❌ Direct to 100% traffic for critical services
❌ Using --allow-unauthenticated by default
❌ Ignoring startup probe failures

