Skip to content

ci(cd): pipeline de build et de déploiement d'image — Artifact Registry puis Cloud Run #32

Description

@arenier

🚧 Draft — à instruire. Description courte volontairement : le périmètre, les critères
d'acceptation et le découpage en tâches restent à écrire avant de démarrer.

De quoi il s'agit

L'infrastructure d'hébergement existe (#12, PR #28), mais rien ne construit ni ne pousse d'image.
Les deux services Cloud Run servent donc l'image placeholder publique de Google, et l'Artifact
Registry provisionné est vide. Cette issue couvre le chaînon manquant : de la source à une révision
Cloud Run qui exécute le code du repo.

Ce qui existe déjà

Relevé sur pick-a-book-505922 au 2026-08-21, après l'apply de #28 et le correctif #31 :

État
Artifact Registry europe-west1-docker.pkg.dev/pick-a-book-505922/pick-a-bookvide, aucune image poussée
pick-a-book-api Ready, sert us-docker.pkg.dev/cloudrun/container/hello
pick-a-book-web Ready, sert la même image placeholder
Identités runtime pick-a-book-api (accès Secret Manager + storage.objectCreator sur le bucket), pick-a-book-web (aucun grant)
docker/api.Dockerfile s'annonce comme « the deployment unit (ADR 0004) »
docker/web.Dockerfile s'annonce comme « Frontend development image: Vite dev server, hot reload »

Le module cloud-run-service porte déjà
ignore_changes = [template[0].containers[0].image, client, client_version] : il attend
explicitement que l'image soit poussée hors Terraform, par le pipeline que cette issue doit créer
(c'est la raison d'être du correctif #31).

Ce qui manque

  1. Aucun chemin d'authentification vers GCP depuis GitHub Actions. Vérifié : le repo n'a ni
    secret, ni variable, ni environment. Le job terraform de la CI tourne d'ailleurs en
    terraform init -backend=false et mock_provider, hermétique par construction.
  2. Aucune image de production pour le front. docker/web.Dockerfile est un Dockerfile de
    développement, en toutes lettres dans son en-tête. Or l'ADR 0004 fait du front un second service
    Cloud Run : il lui faut donc une image qui serve du statique via un serveur HTTP, écoutant sur le
    port attendu par le module (container_port, défaut 3000).
  3. Aucun workflow de build/push/deploy. ci.yml s'arrête aux vérifications.

À instruire

  • Authentification. Workload Identity Federation plutôt qu'une clé de service account en secret
    longue durée — mais ça suppose de provisionner pool, provider et bindings dans infra/, et c'est
    une décision structurante : ADR avant ou avec le code, selon la règle du repo. Prérequis
    partagé avec ci(infra): instruire l'automatisation du terraform plan/apply — plan relu, apply derrière approbation #33
    : à instruire une seule fois, en gardant deux identités distinctes (pousser
    une image n'exige pas d'écrire l'état Terraform).
  • Déclencheur. push sur main, tag, ou déclenchement manuel ? Et faut-il une étape
    d'approbation (GitHub environment avec reviewer) avant que du code atteigne la prod ?
  • Étiquetage des images. SHA de commit, semver, ou les deux ? Un tag mutable latest est-il
    souhaitable, sachant que le module référence l'image par ce que le pipeline y met ?
  • Qui déploie. gcloud run deploy — cohérent avec l'ignore_changes en place — ou repasser la
    main à Terraform sur l'image, ce qui reviendrait à défaire fix(infra): ignore client/client_version drift on Cloud Run services #31 ?
  • Granularité. API et front déployés ensemble, ou indépendamment selon nx affected ?
  • Retour arrière. Cloud Run garde les révisions : le rollback est-il un gcloud run services update-traffic, et est-il documenté quelque part ?

Hors périmètre

🤖 Generated with Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions