はじめに
Fieldlight Studio には、共有したい庭の写真が 3 枚あります。元の写真は準備できていますが、大きな原本は手早く確認するには不便です。用意された画像ツールを使い、小さなプレビューとコンタクトシートを作成します。コンタクトシートは、コレクション全体をひと目で見渡せる 1 枚の画像です。
ツールは、接続済みの Jenkins エージェントのうち 1 つにインストールされています。最初の仕事は、実際にその作業を実行できるエージェントを選ぶことです。その後、さらに小さなサイズでの納品要求に対応し、成功した両バージョンを保存して、元の写真を保護します。
前提知識は、Jenkins のページ操作と、短い Declarative Pipeline を見て理解できることです。Java のプログラミング、写真編集コマンド、Docker の管理、エージェントのインストールは必要ありません。プログラムとエージェントの接続は準備済みです。2 つのエージェントは、1 台の練習用 VM 上の別々のコンテナーです。ファイルシステムは独立していますが、カーネルは共有しています。クラウドのマシン群ではありません。Fieldlight は架空のスタジオで、写真は AI で生成した学習用素材です。所要時間は著者による見積もりで、初心者による実測値ではありません。
作業に合ったエージェントを選ぶ
このステップでは、元の写真を確認し、想定されたツール不足による失敗を観察してから、画像処理ができるエージェントに作業を割り当てます。Photo Desk から始めてください。
Garden Stories コレクションには、ラベンダー、庭の小道、じょうろが写っています。各写真を開いて原本全体を確認し、ブラウザーの Back 操作でデスクに戻ってください。ラベンダーの写真で Download original を選び、比較用に保管します。元の写真は幅 1536 ピクセルで、変更してはいけません。デスクには最初、No completed collection yet と表示されています。
Jenkins に切り替えます。Jenkins のコントローラーはジョブ設定を保持し、ビルドを調整します。エージェントは、接続されてビルド作業を実行するプロセスです。ノードは、Jenkins に登録されたその設定項目です。エグゼキューターは、そのノード上で利用できる作業枠です。ここでは各エージェントにエグゼキューターが 1 つあるので、一度に 1 つの割り当てられた作業ブロックを実行できます。
ダッシュボードから 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 全体では 1 つのエージェントを予約しないことを意味します。ステージが自身のエージェントを選びます。 stage('Prepare photos')は作業に名前を付けます。そのagent { label 'photo-packing' }は、現在パッケージ作成の機能を要求しています。stepsには操作が入ります。shは、引用符で囲んだコマンドを、選択したエージェントのシェルで実行します。用意された/opt/fieldlight/prepare-photosプログラムはプレビューを作成します。--width 480は幅 480 ピクセルを要求し、元の縦横比を維持します。一重引用符は、そのコマンドを 1 つの Groovy 文字列にまとめます。deleteDir()は、このジョブに割り当てられたワークスペース、つまりビルドファイルを置く一時ディレクトリを消去します。最初の呼び出しは、空の状態から開始するためのものです。postセクションのalways呼び出しは、失敗時も含めてステージの後にワークスペースを消去します。/opt/fieldlight/originalsにある元の写真は削除しません。archiveArtifactsは、クリーンアップの前に一致するファイルを Jenkins に保存します。prepared/**の**は、入れ子のディレクトリ内のファイルも含みます。fingerprint: trueは、追跡用にファイルの識別情報を記録します。顧客の承認や署名ではありません。
スクリプトを編集せずにジョブページに戻ります。Build Now を 1 回選びます。Build History で新しい番号付きビルドを開き、Console Output を選んで、完了まで待ちます。この最初の失敗は想定どおりです。コンソールは pack-studio を示し、/opt/fieldlight/prepare-photos が not found と報告して、FAILURE で終了します。要求されたエージェントは接続されていますが、この役割のツールがありません。これは、オフラインのエージェントや条件に一致しないエージェントを、いつまでも待つ状態とは異なります。
preview-photos に戻り、Configure を選んで、もう一度 Pipeline を開きます。ステージのラベルだけを photo-packing から photo-imaging に変更します。全体をコピーできる版を使う場合は、Script の内側をクリックし、Windows/Linux では Ctrl+A、macOS では Command+A ですべて選択して、次の内容に置き換えます。
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 を選んで取り消し、ラベルを修正して再ビルドしてください。コマンドのつづり間違いは、コンソールにコマンドが見つからないと表示されます。別のツールをインストールするのではなく、用意されたパスを復元します。最初に失敗したビルドと、その後のすべての履歴を残してください。通常のミスは、スクリプトを修正して保存し、再ビルドすれば直せます。VM をリセットしないでください。
Photo Desk に切り替えて再読み込みします。Open prepared collection を選びます。3 枚の小さなプレビューには、元の写真と同じ庭の被写体が写っている必要があります。Open contact sheet で 3 枚をまとめて見て、ブラウザーの Back で戻ります。Caption table と Image details を開き、それぞれ Back で戻ります。captions.csv は、コンマで値を区切るプレーンテキストの表です。最初の行に列名があり、以降の各行が 1 枚の画像を説明します。各キャプションを images/ のファイルに関連付け、幅 480 と高さ 320 を記録します。preparation.json は garden と幅 480 を示します。
Jenkins に戻り、成功したビルドのページを開きます。Build Artifacts の下にある個別の PNG ファイル名リンクは、ブラウザーで画像を開きます。全体をダウンロードするには、Build Artifacts の見出しを選び、ファイル一覧ページで (all files in zip) を選んでください。480 ピクセル版用のフォルダーに archive.zip を保存し、ZIP 全体をそこに展開します。6 つのファイルは 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 で元の写真に戻ります。3 枚すべての原本全体を引き続き利用できることを確認してください。
顧客は今度は、正確に 320 pixels wide(幅 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/ ディレクトリ内のファイルを開きます。3 枚すべてのプレビュー画像が 320 × 213 ピクセルになっているはずです。高さ 213 ピクセルは、1536 × 1024 の原本の縦横比を保った結果を丸めた値です。コンタクトシートは、同じ順序で 3 つの被写体をすべて含みます。これは別の一覧画像であり、4 枚目の原本を縮小したものではありません。captions.csv では、各画像のファイル名、キャプション、寸法が一致する必要があります。preparation.json は garden と幅 320 を示す必要があります。
Photo Desk に切り替え、再読み込みして Open prepared collection を選びます。新しい 3 枚のプレビュー、コンタクトシート、両方のメタデータファイルを確認します。元の写真に戻り、フルサイズの内容が変わっていないことを確認してください。続いて Jenkins に切り替え、控えておいた以前の成功ビルド番号を開き、Build Artifacts → (all files in zip) から完全な ZIP をもう一度ダウンロードします。別の新しいフォルダーに展開してください。そのラベンダーのプレビューは、引き続き 480 × 320 ピクセルである必要があります。新しい版を作成しても、古いアーカイブが書き換わってはいけません。
ダウンロードした内容のサイズや被写体が想定と異なる場合は、ビルド番号と保存した幅のオプションを確認し、スクリプトを修正して新しいビルドを実行してください。元の写真、用意されたツール、接続済みのエージェント、機能ラベル、完全なビルド履歴を維持してください。エージェントのファイルシステム間でファイルをコピーしたり、クリーンアップを削除したり、別の実行のアーカイブで代用したりしてはいけません。最後は、保存したスクリプトで実際にビルドを成功させてください。利用できる小さな画像一式と、損なわれていない以前の版、変更のない原本がそろいました。
まとめ
実際の画像処理機能を Jenkins エージェントのラベルに対応させ、想定されたツール不足の失敗を読み取り、利用できるプレビューを作成しました。幅のオプションを変更することで、原本や以前のアーカイブを変えずに、小さなサイズの納品物を作成できました。Jenkins 標準のアーティファクトは、ワークスペースの消去後も残ります。次の独立した実習では、2 つの別々のワークスペースと、同じ実行内での一時的な受け渡しを使います。



