web-dev-qa-db-fra.com

Intégration de GitHub Cloud Build avec plusieurs cloudbuild.yamls dans monorepo

GitHub intégration Google Cloud Build ne détecte pas un cloudbuild.yaml ou Dockerfile s'il ne se trouve pas à la racine du référentiel.

Lorsque vous utilisez un monorepo contenant plusieurs cloudbuild.yamls, comment configurer l'intégration de Google Cloud Build de GitHub pour détecter le bon cloudbuild.yaml?

Chemins de fichiers:

services/api/cloudbuild.yaml
services/nginx/cloudbuild.yaml
services/websocket/cloudbuild.yaml

Sortie d'intégration de Cloud Build:

Failed build

13
sabrehagen

Vous pouvez le faire en ajoutant un cloudbuild.yaml À la racine de votre référentiel en une seule étape gcr.io/cloud-builders/gcloud. Cette étape devrait:

  1. Parcourez chaque sous-répertoire ou utilisez find pour localiser des fichiers cloudbuild.yaml Supplémentaires.
  2. Pour chaque cloudbuild.yaml Trouvé, fourchez et soumettez un build en exécutant gcloud builds submit.
  3. Attendez que toutes les commandes gcloud fourchues se terminent.

Il existe un bon exemple d'une façon de le faire dans la racine cloudbuild.yaml dans le référentiel GoogleCloudPlatform/cloud-builders-community .

Si nous supprimons les parties non essentielles, vous avez essentiellement quelque chose comme ceci:

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    for d in */; do
      config="${d}cloudbuild.yaml"
      if [[ ! -f "${config}" ]]; then
        continue
      fi

      echo "Building $d ... "
      (
        gcloud builds submit $d --config=${config}
      ) &
    done
    wait
19
Rohan Singh

Nous migrons vers un mono-repo en ce moment, et je n'ai trouvé aucune solution CI/CD qui gère bien cela.

La clé est non seulement de détecter les changements, mais également tous les services qui dépendent de ces changements. Voici ce que nous faisons:

  • Exiger que chaque service ait un MAKEFILE avec une commande build.
  • Mettre un cloudbuild.yaml à la racine du repo mono
  • Nous exécutons ensuite une étape de construction personnalisée avec ce petit outil (ancien mais qui semble toujours fonctionner) https://github.com/jharlap/affected qui répertorie tous les packages modifiés et tous les packages qui dépendent de ces paquets, etc.
  • alors le script Shell s'exécutera make build sur tout service affecté par la modification.

Jusqu'à présent, cela fonctionne bien, mais je comprends parfaitement si cela ne correspond pas à votre flux de travail.

Une autre option que beaucoup de gens utilisent est Bazel. Ce n'est pas l'outil le plus simple, mais surtout génial si vous avez de nombreux langages différents ou si vous créez des processus sur votre repo mono.

1
Clint