Introdução
Fieldlight Studio agora precisa de um pacote completo de fotos: três fotografias pequenas, uma folha de contato, legendas e uma galeria que funcione após o download. Um agente do Jenkins pode preparar as fotografias; outro tem a ferramenta de empacotamento fornecida. Escolher ambos os agentes corretamente não faz seus workspaces compartilharem arquivos.
Você observará esse problema de arquivo ausente, adicionará uma transferência temporária real dentro de uma execução do Pipeline e reterá o ZIP resultante para uso independente. Este laboratório começa com seus próprios originais, agentes conectados e um job ainda não executado; ele não usa arquivos nem builds do laboratório anterior.
Os pré-requisitos são os rótulos de agentes, a alocação por estágio, a opção de largura, os artefatos nativos, a configuração de fingerprint e a limpeza do workspace ensinados em Escolha o agente de fotos, além da navegação básica no Jenkins. Não é necessário programar em Java nem instalar agentes. Ambos os agentes são contêineres separados, com sistemas de arquivos independentes na mesma VM de treinamento, e compartilham o kernel dela. Fieldlight e suas fotografias de estudo geradas por IA não retratam nenhum cliente ou evento real. A duração é uma estimativa do autor, e não um tempo medido com iniciantes.
Observe os workspaces separados
Nesta etapa, você acompanhará o trabalho do agente de imagens ao agente de empacotamento e observará por que uma preparação bem-sucedida não produz uma entrega utilizável. Comece em Photo Desk.
Examine os três originais de Garden Stories: lavanda, um caminho de jardim e um regador. Abra cada imagem e volte com a ação Back do navegador. O painel diz No completed collection yet. Esses originais devem permanecer inalterados. A entrega desejada usa prévias com exatamente 320 pixels de largura, preservando sua proporção.
Mude para Jenkins e abra build-photo-pack. Selecione Configure → Pipeline. Leia o Script preparado. O agent none no nível superior permite que cada estágio aloque seu próprio agente capaz. Prepare photos solicita photo-imaging e executa /opt/fieldlight/prepare-photos --width 320; Pack collection solicita photo-packing e executa /opt/fieldlight/pack-photos.
Cada estágio começa com deleteDir() e tem sua própria limpeza post { always { deleteDir() } }. Um workspace é um diretório que pertence ao agente alocado de um job. Embora ambos os estágios usem o mesmo nome de job, seus diretórios ficam em sistemas de arquivos de contêineres separados. Eles não são dois nomes para um diretório compartilhado. Os originais somente para leitura ficam fora do workspace do job, em /opt/fieldlight/originals no agente de imagens.
O programa de imagens grava seis arquivos relativos ao seu workspace atual:
prepared/
images/
garden-01.png
garden-02.png
garden-03.png
contact-sheet.png
captions.csv
preparation.json
As três prévias têm 320 × 213 pixels. A folha de contato as mostra juntas; o CSV relaciona cada nome de arquivo à sua legenda e às suas dimensões; o JSON identifica a coleção, a largura solicitada e os hashes das imagens originais. A ferramenta de empacotamento fornecida consome esses arquivos reais de seu próprio workspace. Ela não busca arquivos ausentes no outro agente nem no Photo Desk.
Volte à página do job sem editar o script e selecione Build Now uma vez. Abra o novo build numerado em Build History e depois Console Output. Aguarde a FAILURE esperada. Primeiro, image-studio informa 3 previews at 320 pixels wide. Após sua limpeza, pack-studio executa o comando de empacotamento e informa Missing prepared/preparation.json in this agent's workspace. A limpeza final também é executada.
Essa é uma falha de localização de arquivo, e não um original corrompido ou um programa ausente. O estágio de preparação foi concluído, mas não houve transferência. Copiar arquivos manualmente, compartilhar uma montagem, remover a limpeza ou colocar ambos os estágios no agente de imagens contornaria a lição sem entregar o fluxo pretendido com dois agentes. Mantenha ambas as alocações de estágios e ambas as seções de limpeza.
Se o build ainda estiver em execução ou na fila, aguarde seu estado final antes de verificar. Se uma edição acidental causou outro erro, restaure o script original a partir da configuração mostrada abaixo, salve e execute-o uma vez para observar essa falha esperada de arquivo ausente:
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() }
}
}
}
}
Mantenha a execução com falha e seu console. Mude para Photo Desk e atualize a página: ela ainda deve dizer que não há coleção concluída. Os três originais completos continuam disponíveis. A próxima etapa transferirá apenas a pequena saída preparada e depois criará um arquivo compactado retido.
Transfira as fotos e retenha o pacote
Nesta etapa, você transferirá os seis arquivos preparados dentro da mesma execução do Pipeline, arquivará o ZIP concluído e o examinará de forma independente. Comece em Jenkins, volte a build-photo-pack e selecione Configure → Pipeline.
stash salva um pequeno conjunto selecionado de arquivos para uso posterior na mesma execução do Pipeline. Dê a ele um nome e um padrão includes. Aqui, prepared/** inclui os arquivos da pasta preparada e os arquivos aninhados de images/. Os caminhos relativos são preservados, portanto restaurar o stash cria prepared/ no workspace de destino. Armazene no stash apenas esses pequenos derivados, e não os originais, o runtime Java ou os diretórios de ferramentas.
unstash restaura esse conjunto nomeado no workspace do agente atual. Seu nome deve corresponder ao stash anterior. Coloque-o depois do deleteDir() inicial do estágio de destino e antes do comando de empacotamento. Coloque o stash depois do processamento e antes da limpeza do estágio de imagens. Caso contrário, os arquivos ainda não existem, já foram removidos ou são removidos imediatamente após a restauração.
Um stash é uma transferência temporária, e não um arquivo compactado para download: normalmente, o Jenkins o descarta depois que essa execução termina. Já archiveArtifacts retém o ZIP final com seu build. Manter ambas as operações torna a transferência temporária e a entrega utilizável posteriormente.
Clique dentro de Script, selecione tudo com Ctrl+A no Windows/Linux ou Command+A no macOS e substitua por esta versão completa:
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() }
}
}
}
}
As duas novas linhas são o stash nomeado e o unstash correspondente. Os comandos de imagens e empacotamento fornecidos, os agentes corretos, o limite de preservação dos arquivos originais e a limpeza permanecem. A configuração archiveArtifacts retém photo-pack.zip e registra sua fingerprint nativa de arquivo; a fingerprint rastreia a identidade do arquivo, e não a aprovação do cliente ou uma assinatura digital.
Selecione Save e depois Build Now. Aguarde a nova execução terminar com SUCCESS. Abra seu Console Output e leia a sequência: image-studio prepara as fotos de 320 pixels, o Jenkins informa Stashed 6 file(s) e o workspace de imagens é limpo. Depois, pack-studio restaura o stash, a ferramenta de empacotamento informa Packed 9 collection files into photo-pack.zip e o Jenkins arquiva e registra a fingerprint do ZIP antes de limpar o workspace de empacotamento.
Se o console disser No such saved stash, compare os dois nomes de stash e sua ordem, restaure o script completo, salve e execute novamente. Se ainda informar um arquivo preparado ausente, confira se o padrão includes é prepared/** e se unstash vem depois da limpeza de destino. Cada novo build inicia uma nova transferência; o stash de um build anterior não é um substituto. Para um erro de sintaxe do Groovy, restaure o script completo e preserve suas chaves, aspas e vírgulas. Mantenha todas as execuções com falha e bem-sucedidas; erros comuns não exigem reinicializar a VM.
Na página do build bem-sucedido, selecione o artefato photo-pack.zip e salve-o. Extraia o ZIP inteiro para uma nova pasta no seu próprio computador. Não abra apenas o arquivo HTML dentro de um visualizador de arquivos compactados: os arquivos vizinhos também devem ser extraídos. A pasta deve conter:
index.html
styles.css
delivery.txt
captions.csv
preparation.json
contact-sheet.png
images/
garden-01.png
garden-02.png
garden-03.png
Abra o index.html extraído em um navegador. A galeria Fieldlight Studio deve exibir as três fotografias corretas de jardim e suas legendas. Abra cada fotografia e volte usando Back do navegador. Selecione Open contact sheet para ver a visão geral real das três fotos e use Back do navegador para voltar à galeria. Na pasta extraída, abra captions.csv, preparation.json e delivery.txt em um editor de texto; os links da galeria apontam para esses mesmos arquivos, e os nomes de arquivos no CSV devem apontar para os arquivos reais de images/, cada prévia deve ter 320 × 213 pixels e o JSON deve identificar garden com largura 320. As notas devem identificar esse job real do Jenkins, o build e o agente de empacotamento.

A galeria completa inclui as três fotos de jardim, um link para a folha de contato e links para os arquivos reais de legendas, detalhes de imagens e entrega. Mantenha seus arquivos vizinhos juntos ao abrir sua cópia extraída.
Mantenha a pasta extraída completa reunida. Abra-a em uma nova janela privada do navegador sem usar o Photo Desk: todas as imagens, os estilos e os links de arquivos ainda devem funcionar a partir dos arquivos locais. A galeria não usa fontes remotas nem imagens online como alternativa. Uma imagem local quebrada significa que um arquivo real da entrega está ausente ou fora do lugar; extraia o ZIP original inteiro para uma nova pasta em vez de copiar os arquivos ausentes do site de origem.
Mude para Photo Desk, atualize a página e selecione Open prepared collection. Essa visualização lê os arquivos do seu arquivo compactado nativo real. Examine suas fotos e seus anexos, volte com a ação Back do navegador e selecione Download complete ZIP. Seus bytes devem corresponder ao artefato do Jenkins que você baixou. Volte ao painel e confirme que os três originais completos permanecem inalterados.
Por fim, mude para Jenkins. Reabra o build bem-sucedido e confirme que seu artefato ainda pode ser baixado após a limpeza. Preserve a execução inicial com arquivo ausente, todo o histórico, os originais, as ferramentas, as conexões dos nós e os rótulos de capacidade. Se fizer outra edição no script, salve e conclua um novo build bem-sucedido antes de verificar. Agora você tem uma transferência real entre dois agentes e uma entrega completa retida.
Resumo
Você observou workspaces independentes do Jenkins e depois transferiu apenas a saída de fotos necessária com um stash nomeado e um unstash correspondente dentro de uma execução. O agente de empacotamento criou uma galeria local completa, e a retenção nativa de artefatos a manteve utilizável após a limpeza dos workspaces de ambos os estágios. O desafio independente altera a coleção e a largura, reutilizando os mesmos mecanismos ensinados.



