GCP for DevOps — Cloud Deploy
Cloud Deploy
Cloud Deploy is Google Cloud’s managed continuous delivery service. It defines a delivery pipeline with ordered stages (dev → staging → production) and promotes releases through each stage with optional approvals.
How Cloud Deploy Works
┌──────────────────────────────────────────────────────┐
│ Cloud Deploy Pipeline │
├──────────────────────────────────────────────────────┤
│ │
│ Cloud Build │
│ │ (creates release) │
│ ▼ │
│ ┌─────────┐ promote ┌──────────┐ promote │
│ │ Dev ├────────────►│ Staging ├──────────► │
│ │ Target │ │ Target │ (approval) │
│ └─────────┘ └──────────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │Production│ │
│ │ Target │ │
│ └──────────┘ │
│ │
│ Targets: GKE clusters, Cloud Run services, │
│ Anthos clusters, Custom targets │
└──────────────────────────────────────────────────────┘
Define a Delivery Pipeline
# clouddeploy.yaml
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: my-app-pipeline
description: "Pipeline for my-app"
serialPipeline:
stages:
- targetId: dev
profiles: [dev]
- targetId: staging
profiles: [staging]
- targetId: production
profiles: [production]
strategy:
canary:
runtimeConfig:
cloudRun:
automaticTrafficControl: true
canaryDeployment:
percentages: [25, 50, 75]
verify: true
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: dev
description: "Development GKE cluster"
gke:
cluster: projects/my-project/locations/us-central1/clusters/dev-cluster
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: staging
description: "Staging GKE cluster"
gke:
cluster: projects/my-project/locations/us-central1/clusters/staging-cluster
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: production
description: "Production GKE cluster"
requireApproval: true
gke:
cluster: projects/my-project/locations/us-central1/clusters/prod-cluster
Register the Pipeline
# Apply the delivery pipeline and targets
$ gcloud deploy apply --file=clouddeploy.yaml \
--region=us-central1
# List pipelines
$ gcloud deploy delivery-pipelines list --region=us-central1
NAME DESCRIPTION
my-app-pipeline Pipeline for my-app
# Describe a pipeline
$ gcloud deploy delivery-pipelines describe my-app-pipeline \
--region=us-central1
Create a Release
# Create a release (triggered by CI or manually)
$ gcloud deploy releases create release-v1-0-0 \
--delivery-pipeline=my-app-pipeline \
--region=us-central1 \
--images=my-app=us-central1-docker.pkg.dev/my-project/my-repo/my-app:v1.0.0
# This automatically deploys to the first target (dev)
# List releases
$ gcloud deploy releases list \
--delivery-pipeline=my-app-pipeline \
--region=us-central1
Promote Between Stages
# Promote from dev to staging
$ gcloud deploy releases promote \
--release=release-v1-0-0 \
--delivery-pipeline=my-app-pipeline \
--region=us-central1
# Promote from staging to production (requires approval)
$ gcloud deploy releases promote \
--release=release-v1-0-0 \
--delivery-pipeline=my-app-pipeline \
--region=us-central1
# Approve a rollout (for production with requireApproval: true)
$ gcloud deploy rollouts approve rollout-abc123 \
--release=release-v1-0-0 \
--delivery-pipeline=my-app-pipeline \
--region=us-central1
Cloud Run Target
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: run-production
description: "Cloud Run production"
run:
location: projects/my-project/locations/us-central1
requireApproval: true
Rollbacks
# Rollback to a previous release
$ gcloud deploy targets rollback production \
--delivery-pipeline=my-app-pipeline \
--region=us-central1
# Or create a new release from a known-good image
$ gcloud deploy releases create release-rollback \
--delivery-pipeline=my-app-pipeline \
--region=us-central1 \
--images=my-app=us-central1-docker.pkg.dev/my-project/my-repo/my-app:v0.9.0
Integration with Cloud Build
# cloudbuild.yaml — CI + CD trigger
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-app:$SHORT_SHA', '.']
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-app:$SHORT_SHA']
- name: 'gcr.io/cloud-builders/gcloud'
args:
- 'deploy'
- 'releases'
- 'create'
- 'release-$SHORT_SHA'
- '--delivery-pipeline=my-app-pipeline'
- '--region=us-central1'
- '--images=my-app=us-central1-docker.pkg.dev/$PROJECT_ID/my-repo/my-app:$SHORT_SHA'
Common Mistakes
| Mistake | Why It’s Wrong | Fix |
|---|---|---|
| No approval on production | Accidental prod deployments | Set requireApproval: true |
| Skipping staging | Issues hit production | Always promote through all stages |
| No rollback plan | Stuck with bad release | Test rollback procedures |
| Manual image tags | Inconsistent deployments | Use $SHORT_SHA or semantic versions |
| Not using profiles | Same config across environments | Define per-stage profiles |
Quick Reference
| Command | Description |
|---|---|
gcloud deploy apply --file=F |
Register pipeline/targets |
gcloud deploy releases create R --images=IMG |
Create release |
gcloud deploy releases promote --release=R |
Promote to next stage |
gcloud deploy rollouts approve R |
Approve a rollout |
gcloud deploy targets rollback T |
Rollback a target |
Next → Deployment Strategies