Transférer des photos entre agents

JenkinsBeginner
Pratiquer maintenant

Introduction

Fieldlight Studio a maintenant besoin d’un dossier photo complet : trois petites photographies, une planche-contact, des légendes et une galerie fonctionnant après téléchargement. Un agent Jenkins peut préparer les photographies ; un autre dispose de l’outil de création de paquet fourni. Choisir correctement les deux agents ne suffit pas à faire partager des fichiers entre leurs espaces de travail.

Vous observerez ce problème de fichier manquant, ajouterez un véritable transfert temporaire au sein d’une exécution du Pipeline et conserverez le ZIP obtenu pour l’utiliser indépendamment. Ce lab démarre avec ses propres originaux, agents connectés et job encore jamais exécuté ; il n’utilise ni fichiers ni builds du lab précédent.

Les prérequis sont les labels d’agent, l’allocation par étape, l’option de largeur, les artefacts natifs, le paramètre d’empreinte et le nettoyage de l’espace de travail enseignés dans Choisir l’agent photo, ainsi que la navigation de base dans Jenkins. Aucune programmation Java ni installation d’agent n’est requise. Les deux agents sont des conteneurs distincts avec des systèmes de fichiers indépendants sur la même machine virtuelle de formation et partagent son noyau. Fieldlight et ses photographies d’étude générées par IA ne représentent aucun client ou événement réel. La durée est une estimation de l’auteur, et non une mesure réalisée auprès de débutants.

Observer les espaces de travail distincts

Dans cette étape, vous suivrez le travail de l’agent d’image à l’agent de création de paquet et observerez pourquoi une préparation réussie ne produit pas une livraison utilisable. Commencez dans Photo Desk.

Examinez les trois originaux de Garden Stories : lavande, allée de jardin et arrosoir. Ouvrez chaque image et revenez avec l’action Back du navigateur. Le bureau indique No completed collection yet. Ces originaux doivent rester inchangés. La livraison souhaitée utilise des aperçus faisant exactement 320 pixels de large, en préservant leurs proportions.

Passez à Jenkins et ouvrez build-photo-pack. Choisissez Configure → Pipeline. Lisez le Script préparé. L’instruction agent none au niveau supérieur permet à chaque étape d’allouer son propre agent capable d’effectuer le travail. Prepare photos demande photo-imaging et exécute /opt/fieldlight/prepare-photos --width 320 ; Pack collection demande photo-packing et exécute /opt/fieldlight/pack-photos.

Chaque étape commence par deleteDir() et possède son propre nettoyage post { always { deleteDir() } }. Un espace de travail est un répertoire appartenant à l’agent alloué à un job. Bien que les deux étapes utilisent le même nom de job, leurs répertoires se trouvent sur des systèmes de fichiers de conteneurs distincts. Ce ne sont pas deux noms désignant un répertoire partagé. Les originaux en lecture seule se trouvent hors de l’espace de travail du job, sous /opt/fieldlight/originals sur l’agent d’image.

Le programme d’image écrit six fichiers relativement à son espace de travail actuel :

prepared/
  images/
    garden-01.png
    garden-02.png
    garden-03.png
  contact-sheet.png
  captions.csv
  preparation.json

Les trois aperçus mesurent 320 × 213 pixels. La planche-contact les montre ensemble ; le CSV relie chaque nom de fichier à sa légende et à ses dimensions ; le JSON identifie la collection, la largeur demandée et les empreintes de hachage des images originales. L’outil de création de paquet fourni utilise ces véritables fichiers depuis son propre espace de travail. Il ne récupère pas les fichiers manquants depuis l’autre agent ou depuis Photo Desk.

Revenez à la page du job sans modifier le script et choisissez une fois Build Now. Ouvrez le nouveau build numéroté dans Build History, puis Console Output. Attendez le résultat attendu FAILURE. D’abord, image-studio indique 3 previews at 320 pixels wide. Après son nettoyage, pack-studio exécute la commande de création de paquet et indique Missing prepared/preparation.json in this agent's workspace. Le nettoyage final est également exécuté.

Il s’agit d’un échec de localisation de fichier, et non d’un original défectueux ou d’un programme manquant. L’étape de préparation est terminée, mais il n’y a eu aucun transfert. Copier les fichiers manuellement, partager un montage, supprimer le nettoyage ou placer les deux étapes sur l’agent d’image contournerait la leçon sans fournir le processus à deux agents attendu. Laissez en place les deux allocations d’étape et les deux sections de nettoyage.

Si le build est encore en cours ou en attente, attendez son état final avant de vérifier. Si une modification accidentelle a causé une autre erreur, rétablissez le script d’origine depuis la configuration ci-dessous, enregistrez et exécutez-le une fois pour observer cet échec attendu de fichier manquant :

pipeline {
    agent none
    stages {
        stage('Prepare photos') {
            agent { label 'photo-imaging' }
            steps {
                deleteDir()
                sh '/opt/fieldlight/prepare-photos --width 320'
            }
            post {
                always { deleteDir() }
            }
        }
        stage('Pack collection') {
            agent { label 'photo-packing' }
            steps {
                deleteDir()
                sh '/opt/fieldlight/pack-photos'
                archiveArtifacts artifacts: 'photo-pack.zip', fingerprint: true
            }
            post {
                always { deleteDir() }
            }
        }
    }
}

Conservez l’exécution en échec et sa console. Passez à Photo Desk et actualisez la page : elle doit toujours indiquer qu’aucune collection n’est terminée. Les trois originaux complets restent disponibles. L’étape suivante transférera uniquement les petites images préparées et les fichiers associés, puis créera une archive conservée.

Transférer les photos et conserver le dossier

Dans cette étape, vous transférerez les six fichiers préparés au sein de la même exécution du Pipeline, archiverez le ZIP terminé et l’examinerez indépendamment. Commencez dans Jenkins, revenez à build-photo-pack, puis choisissez Configure → Pipeline.

stash enregistre un petit ensemble de fichiers sélectionnés pour une utilisation ultérieure dans la même exécution du Pipeline. Donnez-lui un nom et un motif includes. Ici, prepared/** inclut les fichiers du dossier préparé et les fichiers imbriqués dans images/. Les chemins relatifs sont préservés : restaurer le stash crée donc prepared/ dans l’espace de travail récepteur. Placez uniquement ces petits fichiers dérivés dans le stash, et non les originaux, l’environnement d’exécution Java ou les répertoires d’outils.

unstash restaure cet ensemble nommé dans l’espace de travail de l’agent actuel. Son nom doit correspondre au stash précédent. Placez-le après le deleteDir() initial de l’étape réceptrice et avant la commande de création de paquet. Placez le stash après le traitement et avant le nettoyage de l’étape d’image. Sinon, les fichiers n’existent pas encore, ont déjà été supprimés ou sont supprimés immédiatement après leur restauration.

Un stash est un transfert temporaire, et non une archive téléchargeable : normalement, Jenkins le supprime à la fin de cette exécution. archiveArtifacts conserve au contraire le ZIP final avec son build. Garder les deux opérations rend le transfert temporaire et la livraison utilisable ultérieurement.

Cliquez dans Script, sélectionnez tout avec Ctrl+A sous Windows/Linux ou Command+A sous macOS et remplacez le contenu par cette version complète :

pipeline {
    agent none
    stages {
        stage('Prepare photos') {
            agent { label 'photo-imaging' }
            steps {
                deleteDir()
                sh '/opt/fieldlight/prepare-photos --width 320'
                stash name: 'prepared-photos', includes: 'prepared/**'
            }
            post {
                always { deleteDir() }
            }
        }
        stage('Pack collection') {
            agent { label 'photo-packing' }
            steps {
                deleteDir()
                unstash 'prepared-photos'
                sh '/opt/fieldlight/pack-photos'
                archiveArtifacts artifacts: 'photo-pack.zip', fingerprint: true
            }
            post {
                always { deleteDir() }
            }
        }
    }
}

Les deux nouvelles lignes sont le stash nommé et le unstash correspondant. Les commandes d’image et de création de paquet fournies, les agents corrects, la limite protégeant les fichiers originaux et le nettoyage restent en place. Le paramètre archiveArtifacts conserve photo-pack.zip et enregistre son empreinte de fichier native ; l’empreinte suit l’identité du fichier, et non une approbation client ou une signature numérique.

Choisissez Save, puis Build Now. Attendez que la nouvelle exécution se termine par SUCCESS. Ouvrez Console Output et lisez la séquence : image-studio prépare les photos de 320 pixels, Jenkins indique Stashed 6 file(s) et l’espace de travail d’image est vidé. Puis pack-studio restaure le stash, l’outil de création de paquet indique Packed 9 collection files into photo-pack.zip et Jenkins archive le ZIP et enregistre son empreinte avant de vider l’espace de travail de création de paquet.

Si la console indique No such saved stash, comparez les deux noms de stash et leur ordre, rétablissez le script complet, enregistrez et relancez. Si elle signale encore un fichier préparé manquant, vérifiez que le motif includes est prepared/** et que unstash vient après le nettoyage récepteur. Chaque nouveau build démarre un nouveau transfert ; le stash d’un build précédent ne le remplace pas. En cas d’erreur de syntaxe Groovy, rétablissez le script complet et préservez ses accolades, guillemets et virgules. Conservez toutes les exécutions en échec et réussies ; les erreurs courantes ne nécessitent pas de réinitialiser la machine virtuelle.

Sur la page du build réussi, choisissez l’artefact photo-pack.zip et enregistrez-le. Extrayez le ZIP entier dans un nouveau dossier sur votre propre ordinateur. N’ouvrez pas uniquement le fichier HTML à l’intérieur d’un outil de consultation d’archives : les fichiers voisins doivent aussi être extraits. Le dossier doit contenir :

index.html
styles.css
delivery.txt
captions.csv
preparation.json
contact-sheet.png
images/
  garden-01.png
  garden-02.png
  garden-03.png

Ouvrez le fichier index.html extrait dans un navigateur. La galerie Fieldlight Studio doit afficher les trois bonnes photographies de jardin et leurs légendes. Ouvrez chaque photographie et revenez avec Back dans le navigateur. Choisissez Open contact sheet pour consulter la véritable vue d’ensemble des trois photos, puis utilisez Back dans le navigateur pour revenir à la galerie. Depuis le dossier extrait, ouvrez captions.csv, preparation.json et delivery.txt dans un éditeur de texte ; les liens de la galerie pointent vers ces mêmes fichiers, les noms de fichier du CSV doivent pointer vers les véritables fichiers images/, chaque aperçu doit mesurer 320 × 213 pixels et le JSON doit identifier garden avec la largeur 320. Les notes doivent identifier ce véritable job Jenkins, ce build et cet agent de création de paquet.

La galerie photo Fieldlight Studio terminée

La galerie complète comprend les trois photos de jardin, un lien vers la planche-contact et des liens vers les véritables fichiers de légendes, de détails d’image et de livraison. Gardez les fichiers voisins ensemble lorsque vous ouvrez votre copie extraite.

Gardez le dossier extrait complet ensemble. Ouvrez-le dans une nouvelle fenêtre de navigation privée sans utiliser Photo Desk : toutes les images, la mise en forme et les liens de fichiers doivent toujours fonctionner depuis les fichiers locaux. La galerie n’utilise aucune police distante ni image en ligne de secours. Une image locale manquante signifie qu’un véritable fichier de livraison est absent ou mal placé ; extrayez le ZIP d’origine entier dans un nouveau dossier plutôt que de copier les fichiers manquants depuis le site source.

Passez à Photo Desk, actualisez la page et choisissez Open prepared collection. Cette vue lit les fichiers de votre véritable archive native. Examinez ses photos et ses pièces jointes, puis revenez avec l’action Back du navigateur et choisissez Download complete ZIP. Ses octets doivent correspondre à l’artefact Jenkins téléchargé. Revenez au bureau et confirmez que les trois originaux complets restent inchangés.

Enfin, passez à Jenkins. Rouvrez le build réussi et confirmez que son artefact reste téléchargeable après le nettoyage. Préservez l’exécution initiale de fichier manquant, tout l’historique, les originaux, les outils, les connexions des nœuds et les labels de capacité. Si vous modifiez encore le script, enregistrez et terminez un nouveau build réussi avant de vérifier. Vous disposez maintenant d’un véritable transfert entre deux agents et d’une livraison complète conservée.

Résumé

Vous avez observé des espaces de travail Jenkins indépendants, puis transféré uniquement les fichiers photo nécessaires avec un stash nommé et un unstash correspondant au sein d’une même exécution. L’agent de création de paquet a produit une galerie locale complète, et la conservation native des artefacts l’a gardée utilisable après le nettoyage des espaces de travail des deux étapes. Le challenge indépendant change la collection et la largeur tout en réutilisant les mêmes mécanismes enseignés.