Выберите агента для обработки фотографий

JenkinsBeginner
Практиковаться сейчас

Введение

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. Сохраните номер этой успешной сборки и полную распакованную папку для следующего шага. Эти сохранённые файлы остаются доступными после очистки рабочего каталога.

Подготовленные уменьшенные изображения сада в Photo Desk

Подготовленная коллекция показывает те же лаванду, садовую дорожку и лейку, что и оригиналы. Используйте контактный лист и ссылки на файлы, чтобы изучить фактически сохранённый результат.

Передайте набор изображений меньшего размера

На этом шаге вы выполните запрос на ширину 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 сохранились после очистки рабочего каталога; следующая независимая лабораторная работа использует два отдельных рабочих каталога и временную передачу в рамках одного запуска.