Aller au contenu principal

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

VariableDescription
$PROJECT_IDID du projet
$BUILD_IDID unique du build
$COMMIT_SHASHA du commit
$SHORT_SHASHA court (7 caractères)
$BRANCH_NAMENom de la branche
$TAG_NAMENom du tag
$REPO_NAMENom 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

BuilderUsage
gcr.io/cloud-builders/dockerBuild Docker
gcr.io/cloud-builders/gcloudCLI gcloud
gcr.io/cloud-builders/kubectlKubernetes
gcr.io/cloud-builders/npmNode.js
gcr.io/cloud-builders/goGo
gcr.io/cloud-builders/gradleJava/Gradle
gcr.io/cloud-builders/mavenJava/Maven
gcr.io/cloud-builders/gitGit 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
TypevCPURAM
E2_MEDIUM14 GB
E2_HIGHCPU_888 GB
E2_HIGHCPU_323232 GB
N1_HIGHCPU_323228.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


← Retour à la table des matières