Modernize Docker build infrastructure: multi-arch GitHub Actions + buildkit strategy#222
Conversation
There was a problem hiding this comment.
Pull request overview
Modernizes the container build/release pipeline by moving to a multi-architecture Docker Buildx Bake approach on GitHub Actions (with GHA caching and a manifest-merge deploy step), while updating the application’s container base images to support newer CakePHP/PHP requirements.
Changes:
- Added a new multi-arch GitHub Actions workflow that builds/pushes per-arch images and then merges them into multi-platform manifests.
- Refactored
docker-bake.hclto introduce a shared GHA cache target, registry variables, and per-arch groups/targets with arch-suffixed tags. - Updated Dockerfiles to use newer Node/PHP base images; removed the legacy CircleCI and older GitHub Actions workflow.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
.github/workflows/docker-build.yml |
New multi-arch Buildx Bake workflow + deploy manifest-merge job. |
docker-bake.hcl |
Adds registry/SHA vars, shared cache target, and per-arch build groups/targets. |
manifest-push.sh |
New script to merge per-arch tags into multi-platform manifests. |
common.env |
Updates BALENA_PROJECTS to service-name list used by manifest merge loop. |
Dockerfile.x86_64 |
Updates Node/PHP base images for amd64 build. |
Dockerfile.aarch64 |
Updates Node/PHP base images for arm64 build. |
Dockerfile.armhf |
Updates Node/PHP base images for arm/v7 build. |
Dockerfile.template |
Updates Node/PHP base images in the template. |
.github/workflows/build.yml |
Removed legacy workflow replaced by docker-build.yml. |
.circleci/config.yml |
Removed legacy CircleCI pipeline replaced by GitHub Actions. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - name: Write buildkit secrets | ||
| run: | | ||
| mkdir -p .balena/secrets | ||
| echo "${{ secrets.MYSQL_ROOT_PASSWORD }}" > .balena/secrets/secret_mysql_root_password | ||
| echo "${{ secrets.MYSQL_USER }}" > .balena/secrets/secret_mysql_user | ||
| echo "${{ secrets.MYSQL_PASSWORD }}" > .balena/secrets/secret_mysql_password | ||
| echo "${{ secrets.MYSQL_DATABASE }}" > .balena/secrets/secret_mysql_database | ||
| echo "${{ secrets.MASTER_PASSWORD }}" > .balena/secrets/secret_master_password | ||
|
|
| @@ -0,0 +1,85 @@ | |||
| #!/usr/bin/env bash | |||
| set -eu | |||
| # BEGIN - Multi-stage Build | ||
| # Stage 1: Install NodeJS dependencies | ||
| FROM node:20-alpine3.16 AS node-build | ||
| FROM node:20-alpine AS node-build |
| # BEGIN - Multi-stage Build | ||
| # Stage 1: Install NodeJS dependencies | ||
| FROM node:20-alpine3.16 AS node-build | ||
| FROM node:20-alpine AS node-build |
| # BEGIN - Multi-stage Build | ||
| # Stage 1: Install NodeJS dependencies | ||
| FROM node:20-alpine3.16 AS node-build | ||
| FROM node:20-alpine AS node-build |
| # BEGIN - Multi-stage Build | ||
| # Stage 1: Install NodeJS dependencies | ||
| FROM node:20-alpine3.16 AS node-build | ||
| FROM node:20-alpine AS node-build |
| permissions: | ||
| contents: read |
b23prodtm
left a comment
There was a problem hiding this comment.
docker-bake.hcl needs renaming secret files to id=some_var, target=./balena/secrets/some_var_file
|
Mission : Refactoring complet de la PR #222 acake2php Tu es un agent IA senior spécialisé en :
Tu travailles sur cette Pull Request : Objectif : transformer cette PR en une version fusionnable en production, avec tous les GitHub Checks verts, en alignant l’architecture sur les standards déjà validés dans :
⸻ Principe général Ne pas réinventer l’architecture. Avant toute modification :
Toute divergence avec ces projets devra être justifiée. L’objectif est de créer une architecture homogène entre les projets Balena existants. ⸻ Architecture cible obligatoire La référence absolue est :
Les plateformes supportées sont exclusivement :
Correspondance Docker :
Aucune autre architecture ne doit être ajoutée. ⸻ Docker Buildx / docker-bake.hcl Créer ou corriger docker-bake.hcl. Le build doit produire les images pour :
Les plateformes doivent correspondre exactement aux plateformes Balena Cloud. Utiliser :
Les workflows GitHub Actions doivent utiliser une matrice basée sur : armhf ⸻ GitHub Actions Refactoriser les workflows. Objectifs :
Les checks doivent valider :
⸻ Utilisation des templates Balena Ne pas créer un nouveau système de génération. Utiliser le mécanisme existant de balena-cloud-apps. La génération doit utiliser : update_templates Cette commande est la source officielle. Adapter les templates si nécessaire, mais conserver le mécanisme. ⸻ Déploiement Balena Le flux de déploiement doit suivre : balena_deploy . ${BALENA_ARCH} 2 0 avec : BALENA_ARCH=armhf Le déploiement doit fonctionner sans modification manuelle. ⸻ Sélection du docker-compose Après génération des templates : Méthode préférée : ln -sf docker-compose.${BALENA_ARCH} docker-compose.yml Prévoir également le mode copie : cp docker-compose.${BALENA_ARCH} docker-compose.yml afin de fonctionner dans les environnements où les liens symboliques ne sont pas adaptés. ⸻ Docker Compose Compatibilité obligatoire : Compose version <= 2.1 Ne pas utiliser de fonctionnalités récentes incompatibles. Supprimer tous les bind mounts. Utiliser uniquement :
⸻ Service init-web Créer ou adapter un service init-web basé sur celui de balena-photo-cropper. Responsabilités :
Les autres services doivent dépendre correctement de cette initialisation. ⸻ Architecture applicative Conserver : app/ pour CakePHP. Ne pas déplacer l’application. ⸻ Migration CakePHP 5 Mettre à jour l’application vers CakePHP 5. Corriger :
⸻ PHP Optimiser les builds PHP. Éviter les compilations complètes inutiles. Privilégier :
Vérifier :
⸻ Apache HTTPD Conserver Apache. Ne pas remplacer par Nginx. Architecture : Apache HTTPD Vérifier :
Le problème actuel : httpd non accessible sur 8443 doit être identifié et corrigé. ⸻ Sécurité / Secrets Reprendre le modèle de balena-photo-cropper. Utiliser :
Interdiction :
⸻ MySQL / MariaDB Mettre à jour le service MySQL/MariaDB. Objectifs :
⸻ Dépendances Node.js Identifier les outils nécessitant Node.js. Installer automatiquement les dépendances nécessaires. Mettre à jour :
Éviter toute dépendance inutile. ⸻ Documentation Mettre à jour : INSTALL Ajouter :
update_templates
ln -sf docker-compose.${BALENA_ARCH} docker-compose.yml ou : cp docker-compose.${BALENA_ARCH} docker-compose.yml
⸻ README Documenter :
⸻ Méthode de travail Travailler par itérations. Pour chaque modification :
Ne jamais contourner un test. Produire des commits cohérents. ⸻ Validation finale obligatoire La PR est terminée uniquement lorsque : ✓ GitHub Actions passent ⸻ Rapport final attendu Fournir :
Règle finale : Avant d’écrire une nouvelle implémentation, vérifier systématiquement si elle existe déjà dans balena-cloud-apps ou balena-photo-cropper et la réutiliser. Le but est une convergence d’architecture, pas une nouvelle branche technique. |
Replaces the outdated single-arch CircleCI + GitHub Actions setup with the proven multi-platform buildkit strategy from
balena-photo-cropper. Adds fullarmhf/aarch64/x86_64matrix builds, GHA layer caching, buildkit secret mounts, and manifest merging.CI/CD
.github/workflows/docker-build.yml— replacesbuild.yml; usesdocker/bake-action@v5, full 3-arch matrix, separated "Write buildkit secrets" step, GHA cache injection, manifest merge in deploy job.circleci/config.ymland.github/workflows/build.ymlpermissions: contents: read / actions: writeon both jobs (least-privilege)docker-bake.hcl
REGISTRY,REGISTRY_IMAGE,GITHUB_SHAvariablescommontarget inheriting GHA cache (type=gha) — all service targets inherit itarmhf/aarch64/x86_64, each building all 4 services with platform-suffixed tags (arm32v7,arm64v8,amd64) plus branch-safe and SHA tagsmanifest-push.sh (new)
common.envforBALENA_PROJECTS, parsesREGISTRY/DOCKER_ORGfromdocker-bake.hcllatestonmain/developmentcommon.env
BALENA_PROJECTSupdated from path-based entries to service names:( php-fpm httpd mysqldb balena-storage )Dockerfiles
7.4.33-fpm-alpine3.16→8.3-fpm-alpineacross all arch variants and template (PHP 8.1+ required for CakePHP 5)node:20-alpine(drops end-of-life alpine 3.16)