Введение
Fieldlight Studio хочет поделиться тремя фотографиями сада. Оригиналы готовы, но большие исходные изображения неудобны для быстрого просмотра. Вы воспользуетесь подготовленным инструментом обработки изображений, чтобы создать уменьшенные изображения для просмотра и контактный лист — одно изображение, позволяющее сразу увидеть всю коллекцию.
Инструмент установлен на одном подключённом агенте Jenkins. Ваша первая задача — выбрать агента, который действительно может выполнить работу. Затем вы выполните требование о меньшем размере изображений для передачи, сохраните обе успешные версии и оставите исходные фотографии нетронутыми.
Необходимы навыки навигации по страницам Jenkins и умение распознать короткий Declarative Pipeline. Программирование на Java, команды фоторедактирования, администрирование Docker и установка агентов не требуются. Предоставленные программы и подключения агентов подготовлены. Два агента — отдельные контейнеры на одной учебной виртуальной машине: их файловые системы независимы, но ядро общее. Это не облачный парк машин. Fieldlight — вымышленная студия, а фотографии — учебные материалы, созданные ИИ. Продолжительность — авторская оценка, а не измеренное время для начинающих.
Подберите агента для работы
На этом шаге вы изучите оригиналы, увидите ожидаемую ошибку отсутствующего инструмента и назначите работу агенту с возможностью обработки изображений. Начните в Photo Desk.
Коллекция Garden Stories показывает лаванду, садовую дорожку и лейку. Откройте каждую фотографию, изучите полный оригинал и действием браузера Back вернитесь к Photo Desk. Выберите Download original для фотографии лаванды и сохраните её для сравнения. Ширина оригиналов — 1536 пикселей; они должны остаться без изменений. Изначально Photo Desk сообщает No completed collection yet.
Переключитесь в Jenkins. Контроллер Jenkins хранит конфигурацию заданий и координирует сборки. Агент — подключённый процесс, выполняющий работу сборки. Узел — его настроенная запись в Jenkins. Исполнитель — одно доступное место для работы на этом узле. Здесь у каждого агента один исполнитель, поэтому в каждый момент он может выполнять один выделенный блок работы.
На главной панели выберите Manage Jenkins, затем Nodes. По очереди изучите image-studio и pack-studio. Оба подключены. Их метки возможностей — photo-imaging и photo-packing; у обоих также есть linux. Метка — условие планирования, а не установщик ПО. Инструмент обработки изображений есть только на image-studio; инструмент упаковки — только на pack-studio. Это действительно отдельные процессы агентов и контейнеры.
Вернитесь к главной панели через логотип Jenkins в левом верхнем углу, затем откройте preview-photos. Выберите Configure, затем раздел Pipeline. Редактор Script содержит подготовленное задание. Прочитайте его структуру до любых изменений:
agent noneв начале означает, что весь Pipeline не резервирует одного агента. Этап выбирает собственного агента.stage('Prepare photos')задаёт название работы. Сейчас егоagent { label 'photo-packing' }запрашивает возможность упаковки.stepsсодержит операции.shвыполняет команду в кавычках в оболочке выбранного агента. Предоставленная программа/opt/fieldlight/prepare-photosсоздаёт уменьшенные изображения;--width 480запрашивает ширину 480 пикселей и сохраняет исходное соотношение сторон. Одинарные кавычки сохраняют эту команду как одну строку Groovy.deleteDir()очищает выделенный рабочий каталог этого задания — временный каталог файлов его сборки. Первый вызов обеспечивает чистое начало. В секцииpostвызовalwaysочищает рабочий каталог после этапа, в том числе после ошибки. Оригиналы в/opt/fieldlight/originalsон не удаляет.archiveArtifactsсохраняет подходящие файлы в Jenkins до очистки. Вprepared/**символы**включают файлы во вложенных каталогах.fingerprint: trueфиксирует идентичность файлов для отслеживания; это не согласование клиента и не подпись.
Вернитесь на страницу задания, не редактируя скрипт. Один раз выберите Build Now. Откройте новую сборку с номером в Build History, затем выберите Console Output. Дождитесь завершения. Эта первая ошибка ожидаема: консоль указывает pack-studio, затем сообщает, что /opt/fieldlight/prepare-photos not found, и заканчивает с FAILURE. Запрошенный агент подключён, но у него нет инструмента для этой роли. Это отличается от бесконечного ожидания агента, который отключён или не соответствует условию.
Вернитесь в preview-photos, выберите Configure и снова откройте Pipeline. Измените только метку этапа с photo-packing на photo-imaging. Чтобы вставить полный готовый вариант, щёлкните внутри Script, выделите всё через Ctrl+A в Windows/Linux или Command+A в macOS и замените содержимое следующим:
pipeline {
agent none
stages {
stage('Prepare photos') {
agent { label 'photo-imaging' }
steps {
deleteDir()
sh '/opt/fieldlight/prepare-photos --width 480'
archiveArtifacts artifacts: 'prepared/**', fingerprint: true
}
post {
always { deleteDir() }
}
}
}
}
Сохраните команду инструмента, оригиналы, архивирование и оба вызова очистки. Выберите Save, затем Build Now. Откройте Console Output новой сборки и дождитесь Finished: SUCCESS. Вывод должен назвать image-studio, сообщить 3 previews at 480 pixels wide, затем показать Archiving artifacts, Recording fingerprints и заключительный deleteDir. Это свидетельство реальной работы на подходящем агенте, а не просто переименованное сообщение.
Если появилась синтаксическая ошибка Groovy, вернитесь в Configure, восстановите полный скрипт выше, сохраните и запустите новую сборку. Если опечатка в метке оставила сборку в очереди, отмените этот элемент очереди его значком отмены, выберите Yes в диалоговом окне подтверждения, исправьте метку и снова выполните сборку. Опечатка в команде отображается в консоли как отсутствующая команда; восстановите предоставленный путь вместо установки другого инструмента. Сохраните исходную неуспешную сборку и всю последующую историю. Обычные ошибки исправляются новым сохранённым скриптом и сборкой; не сбрасывайте виртуальную машину.
Переключитесь в Photo Desk и обновите страницу. Выберите Open prepared collection. Три уменьшенных изображения должны показывать те же садовые сюжеты, что и оригиналы. Выберите Open contact sheet, чтобы увидеть все три вместе; вернитесь действием браузера Back. Откройте Caption table и Image details, возвращаясь через Back после каждого. captions.csv — обычная текстовая таблица значений, разделённых запятыми: первая строка задаёт названия столбцов, каждая следующая описывает одно изображение. Она связывает каждую подпись с её файлом в images/ и указывает ширину 480 и высоту 320; preparation.json указывает garden и ширину 480.
Вернитесь в Jenkins и откройте страницу успешной сборки. В Build Artifacts ссылки с именами отдельных PNG открывают изображения в браузере. Для полного скачивания выберите заголовок Build Artifacts, затем (all files in zip) на странице просмотра файлов. Сохраните archive.zip в папку для версии шириной 480 пикселей и распакуйте туда весь ZIP. Его шесть файлов находятся в archive/prepared/, включая подкаталог images/. Откройте archive/prepared/images/garden-01.png и archive/prepared/contact-sheet.png в браузере или программе просмотра изображений и прочитайте archive/prepared/captions.csv в текстовом редакторе. Их видимое содержимое должно соответствовать коллекции. Размер уменьшенной лаванды — 480 × 320 пикселей, а скачанный оригинал остаётся 1536 × 1024. Сохраните номер этой успешной сборки и полную распакованную папку для следующего шага. Эти сохранённые файлы остаются доступными после очистки рабочего каталога.

Подготовленная коллекция показывает те же лаванду, садовую дорожку и лейку, что и оригиналы. Используйте контактный лист и ссылки на файлы, чтобы изучить фактически сохранённый результат.
Передайте набор изображений меньшего размера
На этом шаге вы выполните запрос на ширину 320 пикселей и сохраните предыдущий набор шириной 480 пикселей для сравнения. Начните в Photo Desk и вернитесь к оригиналам через Back to originals. Убедитесь, что все три полных оригинала остаются доступны.
Теперь клиенту нужны уменьшенные изображения шириной ровно 320 пикселей. Предоставленная программа принимает это требование через существующую опцию --width; программу обработки изображений вы не редактируете и не заменяете. Переключитесь в Jenkins, вернитесь в preview-photos и выберите Configure → Pipeline. Замените --width 480 на --width 320 в команде sh. Теперь полный скрипт должен выглядеть так:
pipeline {
agent none
stages {
stage('Prepare photos') {
agent { label 'photo-imaging' }
steps {
deleteDir()
sh '/opt/fieldlight/prepare-photos --width 320'
archiveArtifacts artifacts: 'prepared/**', fingerprint: true
}
post {
always { deleteDir() }
}
}
}
}
Выберите Save, затем Build Now. Дождитесь завершения новой сборки с SUCCESS. В Console Output убедитесь, что работу выполнил image-studio, программа сообщила 320 pixels wide, а архивирование и очистка выполнились. Если консоль всё ещё сообщает 480, проверьте, что вы сохранили изменённый скрипт и открыли новую сборку, а не предыдущую.
На странице этой сборки выберите Build Artifacts, затем (all files in zip). Сохраните и полностью распакуйте этот новый archive.zip в другую папку, отдельно от версии шириной 480 пикселей. Откройте файлы в его каталоге archive/prepared/. Теперь все три уменьшенных изображения должны иметь размер 320 × 213 пикселей. Высота 213 пикселей — округлённый результат сохранения соотношения сторон оригинала 1536 × 1024. Контактный лист по-прежнему содержит все три сюжета в том же порядке; это отдельный обзор, а не четвёртый уменьшенный оригинал. В captions.csv имя файла, подпись и размеры каждого изображения должны соответствовать друг другу. preparation.json должен указывать garden и ширину 320.
Переключитесь в Photo Desk, обновите страницу и выберите Open prepared collection. Изучите все три новых уменьшенных изображения, контактный лист и оба файла метаданных. Вернитесь к оригиналам и убедитесь, что их полноразмерное содержимое не изменилось. Затем переключитесь в Jenkins, откройте предыдущую успешную сборку с записанным вами номером и снова скачайте её полный ZIP через Build Artifacts → (all files in zip). Распакуйте его в ещё одну новую папку: размер уменьшенной лаванды по-прежнему должен быть 480 × 320 пикселей. Создание новой версии не должно переписывать старый архив.
Если у скачанного файла неожиданный размер или сюжет, проверьте номер сборки и сохранённую опцию ширины, затем исправьте скрипт и запустите новую сборку. Сохраните исходные фотографии, предоставленные инструменты, подключённых агентов, метки возможностей и полную историю сборок. Не копируйте файлы между файловыми системами агентов, не удаляйте очистку и не подменяйте архив архивом другого запуска. Завершите работу с сохранённым скриптом, который действительно успешно выполнил сборку. У вас есть пригодный для использования набор меньшего размера, нетронутая предыдущая версия и неизменённые оригиналы.
Резюме
Вы сопоставили реальную возможность обработки изображений с меткой агента Jenkins, разобрали ожидаемую ошибку отсутствующего инструмента и создали пригодные для использования уменьшенные изображения. Изменение параметра ширины дало меньшую версию для передачи без изменения оригиналов или предыдущего архива. Встроенные артефакты Jenkins сохранились после очистки рабочего каталога; следующая независимая лабораторная работа использует два отдельных рабочих каталога и временную передачу в рамках одного запуска.



