--- kind: pipeline type: docker name: build-and-deploy # Ce pipeline Woodpecker CI automatise le build et le déploiement de l'application statique # Il se déclenche automatiquement sur chaque push vers les branches main ou stand-alone steps: # ============================================ # ÉTAPE 1: BUILD DE L'APPLICATION STATIQUE # ============================================ # Cette étape construit l'application Next.js et génère les fichiers statiques HTML/CSS/JS - name: build # Image Docker utilisée : Node.js 20 sur Alpine Linux (légère et rapide) image: node:20-alpine # Variables d'environnement nécessaires pour le build environment: NODE_ENV: production # Mode production (optimisations activées) HUSKY: 0 # Désactive Husky (git hooks) pour éviter les erreurs HUSKY_SKIP_INSTALL: 1 # Skip l'installation de Husky # Commandes exécutées dans l'ordre commands: # Installation des dépendances système nécessaires # - git : pour cloner/récupérer des dépendances si nécessaire # - python3 : requis pour les scripts de patch (patch_document.py, add_team_link.py) - apk add --no-cache git python3 # Installation des dépendances Node.js de la racine du projet # npm ci : Clean Install (supprime node_modules et réinstalle depuis package-lock.json) # --legacy-peer-deps : Ignore les conflits de dépendances peer (compatibilité) - npm ci --legacy-peer-deps # Installation des dépendances de radar-app/ (le framework Next.js vendu) # On se déplace dans le dossier radar-app pour installer ses dépendances - cd radar-app # Installation des dépendances de radar-app (y compris devDependencies) # --include=dev : Inclut les dépendances de développement (tsx, eslint, etc.) - npm ci --legacy-peer-deps --include=dev # Build des icônes SVG en composants React TypeScript # Ce script génère les composants Icons depuis les fichiers SVG dans src/icons/ - npm run build:icons # Retour à la racine du projet - cd .. # Génération des données de visualisation équipe # Ce script lit les profils dans docs/data/team/*.md et les technologies # Il génère public/team-visualization-data.json utilisé par la page /team - node scripts/generate-team-visualization-data.js # Build de l'application complète # Ce script (build-radar.js) : # 1. Copie config-business.json vers radar-app/data/config.json # 2. Copie radar-business/2025-01-15/ vers radar-app/data/radar/2025-01-15/ # 3. Copie public/* vers radar-app/public/ # 4. Applique les patches (team page, _document, Navigation) # 5. Lance npm run build:data puis npm run build dans radar-app/ # 6. Copie radar-app/out/ vers build/ à la racine - npm run build # Vérification que le build a réussi # Affiche les 10 premiers fichiers du dossier build/ pour vérifier la génération - ls -la build/ | head -10 # Volumes temporaires pour accélérer les builds suivants # Ces volumes persistent les node_modules entre les étapes pour éviter de réinstaller volumes: - name: node_modules_root path: /app/node_modules - name: node_modules_radar_app path: /app/radar-app/node_modules # ============================================ # ÉTAPE 2: DÉPLOIEMENT VIA RSYNC (OPTIONNEL) # ============================================ # Cette étape synchronise les fichiers statiques vers un serveur web distant # Utile si vous avez un serveur Nginx/Apache qui sert des fichiers statiques - name: deploy-rsync # Image Alpine (légère) avec rsync et SSH image: alpine:latest # Variables d'environnement récupérées depuis les secrets Woodpecker environment: DEPLOY_HOST: from_secret: deploy_host # Exemple: techradar.example.com DEPLOY_USER: from_secret: deploy_user # Exemple: deploy DEPLOY_PATH: from_secret: deploy_path # Exemple: /var/www/techradar DEPLOY_KEY: from_secret: deploy_key # Clé privée SSH complète commands: # Installation des outils nécessaires - apk add --no-cache openssh-client rsync # Création du dossier .ssh pour les clés SSH - mkdir -p ~/.ssh # Écriture de la clé privée SSH dans le fichier id_rsa # $$ est échappé pour éviter l'interpolation par le shell - echo "$$DEPLOY_KEY" > ~/.ssh/id_rsa # Protection de la clé privée (lecture/écriture uniquement pour le propriétaire) - chmod 600 ~/.ssh/id_rsa # Ajout de la clé publique du serveur dans known_hosts # Évite la vérification manuelle lors de la première connexion - ssh-keyscan -H $$DEPLOY_HOST >> ~/.ssh/known_hosts || true # Synchronisation des fichiers # rsync -avz : Archive mode, Verbose, Compression # --delete : Supprime les fichiers sur le serveur qui n'existent plus localement # build/ : Source (dossier build généré à l'étape précédente) # $$DEPLOY_USER@$$DEPLOY_HOST:$$DEPLOY_PATH/ : Destination (serveur distant) - rsync -avz --delete build/ $$DEPLOY_USER@$$DEPLOY_HOST:$$DEPLOY_PATH/ # Message de confirmation - echo "✅ Déploiement terminé sur $$DEPLOY_HOST:$$DEPLOY_PATH" # Conditions de déclenchement # Cette étape ne s'exécute que si : when: branch: - main # Sur la branche main - stand-alone # Ou sur la branche stand-alone event: - push # Et uniquement sur un événement push (pas sur les PR) # ============================================ # ÉTAPE 3: DÉPLOIEMENT DOCKER (RECOMMANDÉ) # ============================================ # Cette étape build et déploie l'application via Docker # Plus simple et reproductible que rsync - name: deploy-docker # Image Docker officielle avec docker-compose image: docker:latest # Configuration Docker environment: DOCKER_HOST: unix:///var/run/docker.sock # Socket Docker du serveur Woodpecker commands: # Installation de docker-compose - apk add --no-cache docker-compose # Build de l'image Docker sans cache # --no-cache : Force un rebuild complet (garantit que tout est à jour) # docker-compose.business.yml : Fichier de configuration Docker Compose - docker compose -f docker-compose.business.yml build --no-cache # Démarrage du conteneur en mode détaché # -d : Détaché (en arrière-plan) # up : Crée et démarre les conteneurs - docker compose -f docker-compose.business.yml up -d # Vérification que le conteneur tourne # Affiche les conteneurs contenant "laplank-radar" ou un message si non trouvé - docker ps | grep laplank-radar || echo "Conteneur non trouvé" # Volume pour accéder au socket Docker du serveur # Nécessaire pour que le conteneur puisse utiliser Docker volumes: - name: dockersock path: /var/run/docker.sock # Conditions de déclenchement (identique à deploy-rsync) when: branch: - main - stand-alone event: - push # ============================================ # ÉTAPE 4: NOTIFICATION TELEGRAM # ============================================ # Cette étape envoie une notification Telegram à la fin du pipeline # Utile pour être informé immédiatement du résultat du build - name: notify # Plugin Drone/Woodpecker pour Telegram # Compatible avec Woodpecker (fork de Drone) image: appleboy/drone-telegram # Configuration du plugin Telegram settings: token: from_secret: telegram_token # Token du bot Telegram to: from_secret: telegram_chat_id_ajr # ID du chat Telegram (destinataire) format: markdown # Format du message (Markdown supporté) # Message personnalisé avec template Woodpecker # {{#success build.status}} : Condition si le build a réussi # {{repo.name}} : Nom du dépôt Git # {{commit.branch}} : Branche du commit # {{commit.message}} : Message du commit # {{commit.author}} : Auteur du commit # {{build.link}} : Lien vers le build dans Woodpecker message: > {{#success build.status}} ✅ Build réussi pour `{{repo.name}}` sur la branche `{{commit.branch}}` 📝 Commit: `{{commit.message}}` 👤 Auteur: {{commit.author}} 🔗 {{ build.link }} {{else}} ❌ Build échoué pour `{{repo.name}}` sur la branche `{{commit.branch}}` 📝 Commit: `{{commit.message}}` 👤 Auteur: {{commit.author}} 🔗 {{ build.link }} {{/success}} # Conditions de déclenchement # S'exécute toujours, que le build réussisse ou échoue when: status: - success # Si le build réussit - failure # Si le build échoue # ============================================ # VOLUMES TEMPORAIRES # ============================================ # Ces volumes sont créés temporairement pour chaque pipeline # Ils permettent de partager des données entre les étapes volumes: # Volume pour les node_modules de la racine # Persiste entre les étapes pour éviter de réinstaller - name: node_modules_root temp: {} # Volume temporaire (supprimé à la fin du pipeline) # Volume pour les node_modules de radar-app # Persiste entre les étapes pour éviter de réinstaller - name: node_modules_radar_app temp: {} # Volume pour accéder au socket Docker du serveur # Nécessaire pour que les conteneurs puissent utiliser Docker - name: dockersock host: path: /var/run/docker.sock # Chemin du socket Docker sur le serveur