Cloud Build
1 - Présentation
Cloud Build est un service CI/CD serverless qui exécute des builds sur l'infrastructure Google Cloud.
2 - cloudbuild.yaml
2.1 Structure de base
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/npm'
args: ['install']
- name: 'gcr.io/cloud-builders/npm'
args: ['test']
- name: 'gcr.io/cloud-builders/npm'
args: ['run', 'build']
images:
- 'gcr.io/$PROJECT_ID/mon-app:$COMMIT_SHA'
options:
logging: CLOUD_LOGGING_ONLY
machineType: 'E2_HIGHCPU_8'
timeout: '1200s'
2.2 Build steps
steps:
# Utiliser un builder officiel
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/app', '.']
# Utiliser une image Docker quelconque
- name: 'node:18'
entrypoint: 'npm'
args: ['test']
# Script shell
- name: 'ubuntu'
script: |
#!/bin/bash
echo "Running script"
ls -la
# Avec répertoire de travail
- name: 'gcr.io/cloud-builders/npm'
args: ['install']
dir: 'frontend'
3 - Variables et substitutions
3.1 Variables par défaut
| Variable | Description |
|---|---|
$PROJECT_ID | ID du projet |
$BUILD_ID | ID unique du build |
$COMMIT_SHA | SHA du commit |
$SHORT_SHA | SHA court (7 caractères) |
$BRANCH_NAME | Nom de la branche |
$TAG_NAME | Nom du tag |
$REPO_NAME | Nom du repository |
3.2 Substitutions personnalisées
substitutions:
_ENVIRONMENT: 'production'
_REGION: 'europe-west1'
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args:
- 'run'
- 'deploy'
- 'mon-service'
- '--region=${_REGION}'
- '--image=gcr.io/$PROJECT_ID/app:$COMMIT_SHA'
# Passer des substitutions au build
gcloud builds submit --substitutions=_ENVIRONMENT=staging
4 - Builders officiels
4.1 Builders disponibles
| Builder | Usage |
|---|---|
gcr.io/cloud-builders/docker | Build Docker |
gcr.io/cloud-builders/gcloud | CLI gcloud |
gcr.io/cloud-builders/kubectl | Kubernetes |
gcr.io/cloud-builders/npm | Node.js |
gcr.io/cloud-builders/go | Go |
gcr.io/cloud-builders/gradle | Java/Gradle |
gcr.io/cloud-builders/maven | Java/Maven |
gcr.io/cloud-builders/git | Git operations |
4.2 Exemples
# Docker build et push
steps:
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'europe-west1-docker.pkg.dev/$PROJECT_ID/images/app:$COMMIT_SHA'
- '-t'
- 'europe-west1-docker.pkg.dev/$PROJECT_ID/images/app:latest'
- '.'
- name: 'gcr.io/cloud-builders/docker'
args: ['push', '--all-tags', 'europe-west1-docker.pkg.dev/$PROJECT_ID/images/app']
5 - Build Docker
5.1 Build simple
steps:
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'gcr.io/$PROJECT_ID/app:$COMMIT_SHA'
- '.'
images:
- 'gcr.io/$PROJECT_ID/app:$COMMIT_SHA'
5.2 Multi-stage avec cache
steps:
# Pull l'image de cache (si elle existe)
- name: 'gcr.io/cloud-builders/docker'
entrypoint: 'bash'
args:
- '-c'
- 'docker pull gcr.io/$PROJECT_ID/app:latest || exit 0'
# Build avec cache
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '--cache-from'
- 'gcr.io/$PROJECT_ID/app:latest'
- '-t'
- 'gcr.io/$PROJECT_ID/app:$COMMIT_SHA'
- '-t'
- 'gcr.io/$PROJECT_ID/app:latest'
- '.'
images:
- 'gcr.io/$PROJECT_ID/app:$COMMIT_SHA'
- 'gcr.io/$PROJECT_ID/app:latest'
5.3 Kaniko (builds rootless)
steps:
- name: 'gcr.io/kaniko-project/executor:latest'
args:
- '--destination=gcr.io/$PROJECT_ID/app:$COMMIT_SHA'
- '--cache=true'
- '--cache-ttl=168h'
6 - Secrets et variables d'environnement
6.1 Secret Manager
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud secrets versions access latest --secret=api-key > /workspace/api-key.txt
- name: 'node:18'
entrypoint: 'npm'
args: ['run', 'deploy']
secretEnv: ['API_KEY']
availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/api-key/versions/latest
env: 'API_KEY'
6.2 Variables d'environnement
steps:
- name: 'node:18'
env:
- 'NODE_ENV=production'
- 'LOG_LEVEL=info'
args: ['npm', 'run', 'build']
7 - Artifacts et stockage
7.1 Publier vers Artifact Registry
steps:
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '-t'
- 'europe-west1-docker.pkg.dev/$PROJECT_ID/images/app:$COMMIT_SHA'
- '.'
- name: 'gcr.io/cloud-builders/docker'
args:
- 'push'
- 'europe-west1-docker.pkg.dev/$PROJECT_ID/images/app:$COMMIT_SHA'
7.2 Upload vers Cloud Storage
artifacts:
objects:
location: 'gs://mon-bucket/builds/$BUILD_ID/'
paths:
- 'dist/**'
- 'coverage/**'
8 - Options avancées
8.1 Machine types
options:
machineType: 'E2_HIGHCPU_32'
diskSizeGb: 100
| Type | vCPU | RAM |
|---|---|---|
| E2_MEDIUM | 1 | 4 GB |
| E2_HIGHCPU_8 | 8 | 8 GB |
| E2_HIGHCPU_32 | 32 | 32 GB |
| N1_HIGHCPU_32 | 32 | 28.8 GB |
8.2 Pools privés
options:
pool:
name: 'projects/$PROJECT_ID/locations/europe-west1/workerPools/my-pool'
8.3 Timeout et logs
timeout: '3600s' # 1 heure max
options:
logging: CLOUD_LOGGING_ONLY # ou GCS_ONLY, NONE
logStreamingOption: STREAM_ON
9 - Lancer un build
# Depuis le répertoire local
gcloud builds submit --config=cloudbuild.yaml .
# Avec substitutions
gcloud builds submit \
--config=cloudbuild.yaml \
--substitutions=_ENV=prod,_VERSION=1.0.0 \
.
# Voir les builds
gcloud builds list
# Voir les logs d'un build
gcloud builds log BUILD_ID
Résumé
Dans ce chapitre, nous avons appris :
- La structure cloudbuild.yaml
- Les build steps et builders
- Les variables et substitutions
- La gestion des secrets
- Les artifacts et stockage
- Les options avancées
Prochaine étape
Dans le prochain chapitre, nous verrons Artifact Registry.
→ Chapitre suivant : Artifact Registry