Einführung
Fieldlight Studio benötigt jetzt ein vollständiges Fotopaket: drei kleine Fotografien, einen Kontaktbogen, Bildunterschriften und eine Galerie, die nach dem Herunterladen funktioniert. Ein Jenkins-Agent kann die Fotografien vorbereiten; ein anderer verfügt über das bereitgestellte Verpackungswerkzeug. Die richtige Auswahl beider Agenten führt nicht dazu, dass ihre Arbeitsverzeichnisse Dateien gemeinsam nutzen.
Du beobachtest dieses Problem fehlender Dateien, ergänzt eine tatsächliche temporäre Übergabe innerhalb eines Pipeline-Durchlaufs und bewahrst die entstandene ZIP-Datei zur unabhängigen Nutzung auf. Dieses Lab beginnt mit eigenen Originalen, verbundenen Agenten und einem noch nicht ausgeführten Job; es verwendet keine Dateien oder Builds aus dem vorherigen Lab.
Vorausgesetzt werden die Agentenlabels, die Stage-Zuweisung, die Breitenoption, systemeigene Artefakte, die Fingerprint-Einstellung und die Workspace-Bereinigung aus Wähle den Foto-Agenten aus sowie grundlegende Jenkins-Navigation. Java-Programmierung oder die Installation von Agenten sind nicht erforderlich. Beide Agenten sind separate Container mit unabhängigen Dateisystemen auf derselben Übungs-VM und teilen sich deren Kernel. Fieldlight und seine KI-generierten Lernfotografien stellen keinen realen Kunden oder Anlass dar. Die Dauer ist eine Schätzung des Autors, keine mit Anfängern gemessene Zeit.
Beobachte die getrennten Arbeitsverzeichnisse
In diesem Schritt verfolgst du die Arbeit vom Bildagenten zum Verpackungsagenten und beobachtest, warum eine erfolgreiche Vorbereitung noch keine nutzbare Auslieferung ergibt. Beginne in Photo Desk.
Untersuche die drei Originale von Garden Stories: Lavendel, einen Gartenweg und eine Gießkanne. Öffne jedes Bild und kehre mit der Browseraktion Back zurück. Der Desk zeigt No completed collection yet. Diese Originale müssen unverändert bleiben. Die gewünschte Auslieferung verwendet Vorschaubilder mit einer Breite von genau 320 Pixeln, wobei ihr Seitenverhältnis erhalten bleibt.
Wechsle zu Jenkins und öffne build-photo-pack. Wähle Configure → Pipeline. Lies das vorbereitete Script. Das übergeordnete agent none lässt jede Stage ihren eigenen geeigneten Agenten zuweisen. Prepare photos fordert photo-imaging an und führt /opt/fieldlight/prepare-photos --width 320 aus; Pack collection fordert photo-packing an und führt /opt/fieldlight/pack-photos aus.
Jede Stage beginnt mit deleteDir() und hat ihre eigene Bereinigung post { always { deleteDir() } }. Ein Workspace ist ein Verzeichnis, das zum zugewiesenen Agenten eines Jobs gehört. Obwohl beide Stages denselben Jobnamen verwenden, befinden sich ihre Verzeichnisse auf getrennten Containerdateisystemen. Es sind nicht zwei Namen für ein gemeinsames Verzeichnis. Die schreibgeschützten Originale liegen außerhalb des Jobarbeitsverzeichnisses unter /opt/fieldlight/originals auf dem Bildagenten.
Das Bildprogramm schreibt sechs Dateien relativ zu seinem aktuellen Arbeitsverzeichnis:
prepared/
images/
garden-01.png
garden-02.png
garden-03.png
contact-sheet.png
captions.csv
preparation.json
Die drei Vorschaubilder haben 320 × 213 Pixel. Der Kontaktbogen zeigt sie gemeinsam; die CSV-Datei ordnet jedem Dateinamen seine Bildunterschrift und Abmessungen zu; die JSON-Datei bezeichnet die Sammlung, die angeforderte Breite und die Hashes der Originalbilder. Das bereitgestellte Verpackungswerkzeug verarbeitet diese tatsächlichen Dateien aus seinem eigenen Arbeitsverzeichnis. Es holt keine fehlenden Dateien vom anderen Agenten oder vom Photo Desk.
Kehre zur Jobseite zurück, ohne das Skript zu bearbeiten, und wähle einmal Build Now. Öffne den neuen nummerierten Build in Build History und dann Console Output. Warte auf das erwartete FAILURE. Zuerst meldet image-studio 3 previews at 320 pixels wide. Nach seiner Bereinigung führt pack-studio den Verpackungsbefehl aus und meldet Missing prepared/preparation.json in this agent's workspace. Die abschließende Bereinigung wird ebenfalls ausgeführt.
Dies ist ein Fehler beim Dateiort, kein beschädigtes Original und kein fehlendes Programm. Die Vorbereitungsstage wurde abgeschlossen, doch es gab keine Übergabe. Dateien manuell zu kopieren, eine gemeinsame Einhängung zu verwenden, die Bereinigung zu entfernen oder beide Stages auf dem Bildagenten auszuführen, würde die Lernaufgabe umgehen, ohne den vorgesehenen Ablauf mit zwei Agenten zu liefern. Behalte beide Stage-Zuweisungen und beide Bereinigungsabschnitte bei.
Falls der Build noch läuft oder in der Warteschlange steht, warte vor der Prüfung auf seinen endgültigen Zustand. Falls eine versehentliche Bearbeitung einen anderen Fehler verursacht hat, stelle das ursprüngliche Skript aus der unten gezeigten Konfiguration wieder her, speichere und führe es einmal aus, um diesen erwarteten Fehler wegen einer fehlenden Datei zu beobachten:
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() }
}
}
}
}
Behalte den fehlgeschlagenen Durchlauf und seine Konsole bei. Wechsle zu Photo Desk und lade die Seite neu: Sie muss weiterhin angeben, dass es keine abgeschlossene Sammlung gibt. Die drei vollständigen Originale bleiben verfügbar. Der nächste Schritt überträgt nur die kleine vorbereitete Ausgabe und erstellt dann ein aufbewahrtes Archiv.
Übergib die Fotos und bewahre das Paket auf
In diesem Schritt überträgst du die sechs vorbereiteten Dateien innerhalb desselben Pipeline-Durchlaufs, archivierst die fertige ZIP-Datei und untersuchst sie unabhängig. Beginne in Jenkins, kehre zu build-photo-pack zurück und wähle dann Configure → Pipeline.
stash speichert eine kleine ausgewählte Dateimenge zur späteren Verwendung im selben Pipeline-Durchlauf. Gib ihr einen Namen und ein Muster für includes. Hier schließt prepared/** die Dateien des vorbereiteten Ordners und die verschachtelten Dateien unter images/ ein. Relative Pfade bleiben erhalten, sodass die Wiederherstellung des Stash prepared/ im empfangenden Arbeitsverzeichnis erstellt. Übertrage mit Stash nur diese kleinen abgeleiteten Dateien, nicht die Originale, die Java-Laufzeit oder Werkzeugverzeichnisse.
unstash stellt diese benannte Dateimenge im Arbeitsverzeichnis des aktuellen Agenten wieder her. Sein Name muss mit dem früheren Stash übereinstimmen. Platziere es nach dem anfänglichen deleteDir() der empfangenden Stage und vor dem Verpackungsbefehl. Platziere den Stash nach der Verarbeitung und vor der Bereinigung der Bildstage. Andernfalls existieren die Dateien entweder noch nicht, wurden bereits entfernt oder werden unmittelbar nach der Wiederherstellung entfernt.
Ein Stash ist eine temporäre Übertragung, kein Downloadarchiv: Normalerweise verwirft Jenkins ihn nach dem Ende dieses Durchlaufs. archiveArtifacts bewahrt dagegen die endgültige ZIP-Datei bei ihrem Build auf. Durch Beibehalten beider Operationen bleibt die Übergabe temporär und die Auslieferung später nutzbar.
Klicke in Script, markiere alles mit Ctrl+A unter Windows/Linux oder Command+A unter macOS und ersetze es durch diese vollständige Fassung:
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() }
}
}
}
}
Die beiden neuen Zeilen sind der benannte stash und der passende unstash. Die bereitgestellten Bild- und Verpackungsbefehle, die richtigen Agenten, die Abgrenzung der Originaldateien und die Bereinigung bleiben erhalten. Die Einstellung archiveArtifacts bewahrt photo-pack.zip auf und erfasst seinen systemeigenen Dateifingerprint; der Fingerprint verfolgt die Dateiidentität, nicht eine Kundenfreigabe oder digitale Signatur.
Wähle Save und dann Build Now. Warte, bis der neue Durchlauf mit SUCCESS abgeschlossen ist. Öffne seine Console Output und lies die Abfolge: image-studio bereitet die 320-Pixel-Fotos vor, Jenkins meldet Stashed 6 file(s) und das Bildarbeitsverzeichnis wird geleert. Anschließend stellt pack-studio den Stash wieder her, das Verpackungswerkzeug meldet Packed 9 collection files into photo-pack.zip und Jenkins archiviert die ZIP-Datei und erfasst ihren Fingerprint, bevor es das Verpackungsarbeitsverzeichnis leert.
Falls die Konsole No such saved stash meldet, vergleiche die beiden Stash-Namen und ihre Reihenfolge, stelle das vollständige Skript wieder her, speichere und führe es erneut aus. Falls sie weiterhin eine fehlende vorbereitete Datei meldet, prüfe, ob das Muster für includes auf prepared/** gesetzt ist und unstash nach der empfangenden Bereinigung steht. Jeder neue Build beginnt eine neue Übertragung; der Stash eines früheren Builds ist kein Ersatz. Stelle bei einem Groovy-Syntaxfehler das vollständige Skript wieder her und behalte seine geschweiften Klammern, Anführungszeichen und Kommas bei. Behalte alle fehlgeschlagenen und erfolgreichen Durchläufe bei; gewöhnliche Fehler erfordern kein Zurücksetzen der VM.
Wähle auf der Seite des erfolgreichen Builds das Artefakt photo-pack.zip und speichere es. Entpacke die gesamte ZIP-Datei in einen neuen Ordner auf deinem eigenen Computer. Öffne nicht nur die HTML-Datei in einem Archivbetrachter: Auch die benachbarten Dateien müssen entpackt werden. Der Ordner sollte Folgendes enthalten:
index.html
styles.css
delivery.txt
captions.csv
preparation.json
contact-sheet.png
images/
garden-01.png
garden-02.png
garden-03.png
Öffne die entpackte index.html in einem Browser. Die Galerie Fieldlight Studio sollte alle drei korrekten Gartenfotografien und ihre Bildunterschriften anzeigen. Öffne jede Fotografie und kehre mit der Browseraktion Back zurück. Wähle Open contact sheet, um die tatsächliche Übersicht der drei Fotos zu sehen, und kehre dann mit der Browseraktion Back zur Galerie zurück. Öffne aus dem entpackten Ordner captions.csv, preparation.json und delivery.txt in einem Texteditor; die Galerielinks verweisen auf dieselben Dateien. Die CSV-Dateinamen müssen auf die tatsächlichen Dateien unter images/ verweisen, jedes Vorschaubild muss 320 × 213 Pixel haben und die JSON-Datei muss garden mit der Breite 320 angeben. Die Hinweise sollten diesen tatsächlichen Jenkins-Job, Build und Verpackungsagenten bezeichnen.

Die vollständige Galerie umfasst die drei Gartenfotos, einen Kontaktbogenlink und Links zu den tatsächlichen Dateien für Bildunterschriften, Bilddetails und Auslieferung. Halte ihre benachbarten Dateien zusammen, wenn du deine entpackte Kopie öffnest.
Behalte den vollständig entpackten Ordner zusammen. Öffne ihn in einem neuen privaten Browserfenster, ohne Photo Desk zu verwenden: Alle Bilder, die Gestaltung und die Dateilinks sollten weiterhin aus lokalen Dateien funktionieren. Die Galerie verwendet keine entfernten Schriftarten oder einen Online-Bildersatz bei fehlenden Dateien. Ein defektes lokales Bild bedeutet, dass eine tatsächliche Auslieferungsdatei fehlt oder falsch abgelegt ist; entpacke die gesamte ursprüngliche ZIP-Datei in einen neuen Ordner, statt fehlende Dateien von der Quellwebsite zu kopieren.
Wechsle zu Photo Desk, lade die Seite neu und wähle Open prepared collection. Diese Ansicht liest die Dateien aus deinem tatsächlichen systemeigenen Archiv. Untersuche ihre Fotos und Anhänge, kehre dann mit der Browseraktion Back zurück und wähle Download complete ZIP. Ihre Bytes sollten mit dem heruntergeladenen Jenkins-Artefakt übereinstimmen. Kehre zum Desk zurück und prüfe, ob alle drei vollständigen Originale unverändert bleiben.
Wechsle abschließend zu Jenkins. Öffne den erfolgreichen Build erneut und prüfe, ob sein Artefakt nach der Bereinigung weiterhin heruntergeladen werden kann. Erhalte den anfänglichen Durchlauf mit fehlender Datei, den gesamten Verlauf, die Originale, Werkzeuge, Node-Verbindungen und Fähigkeitslabels. Falls du das Skript erneut bearbeitest, speichere und schließe vor der Prüfung einen neuen erfolgreichen Build ab. Du hast jetzt eine tatsächliche Übergabe zwischen zwei Agenten und eine vollständige aufbewahrte Auslieferung.
Zusammenfassung
Du hast unabhängige Jenkins-Arbeitsverzeichnisse beobachtet und anschließend nur die benötigte Fotoausgabe mit einem benannten Stash und passendem Unstash innerhalb eines Durchlaufs übertragen. Der Verpackungsagent hat eine vollständige lokale Galerie erstellt, und die systemeigene Artefaktaufbewahrung hat sie nutzbar gehalten, nachdem beide Stage-Arbeitsverzeichnisse geleert worden waren. Die unabhängige Challenge ändert Sammlung und Breite und verwendet dabei dieselben erlernten Mechanismen.



