Implantando o arquivo .war no servidor de aplicativos java somente quando o arquivo terminar de ser carregado em uma caixa linux

2

Esse problema ocorre com bastante frequência durante o upload de um arquivo .war ou .ear, que é pouco mais que um arquivo .zip, para um servidor remoto e é implantado pelo servidor de aplicativos.

Geralmente, no estágio de desenvolvimento, um servidor de aplicativos está em 'hot deploy', o que significa que o próprio servidor de aplicativos está atento a alterações em um diretório específico, se reconhecer que um arquivo de aplicativo válido (.ear ou .war) foi descartado, então é descompactado e implementado como aplicativo java.

Acontece que enquanto o upload está em andamento, e isso geralmente é feito com ferramentas como ant ou maven diretamente do ambiente de desenvolvimento, o servidor de aplicativos inicia a implantação, para descobrir depois que é um arquivo zip corrompido porque o upload não foi terminou ainda.

A solução que encontrei é fazer o upload para um diretório externo e, em seguida, conectar-se ao ssh e mv o arquivo ao local "hot deploy".

Você tem alguma sugestão sobre como lidar com isso? Eu não sou um administrador de sistema, mas o que eu gostaria de ter é um tipo de script de shell (talvez executado no cron) que escute um diretório e quando um upload está chegando (via scp), espere até que ele termine e faça um mv para o diretório do servidor.

Quais variáveis eu tenho que levar em conta para criar esse script?

    
por Leonardo 20.06.2013 / 17:10

3 respostas

1

Se você quiser automatizá-lo no servidor de implantação, você pode ter um arquivo, digamos que "src.upload.complete.txt" seja carregado como o último arquivo depois de fazer o upload do seu .war.

configure um crontab verificando o arquivo "src.upload.complete.txt" a cada minuto, assim que ele for encontrado, ele moverá o arquivo .war para o diretório de implantação. Em seguida, também remove o arquivo "src.upload.complete.txt".

Eu não tive tempo para testar isso, mas poderia ser algo assim:

Para configurar um crontab para verificar cada minuto, adicione esta linha a /etc/crontab

* * * * * /path/to/bash/file.sh

seu file.sh deve ser parecido com isso.

#!/bin/bash

FILE_PATH = '/path/to/your/file'
if [ -f $FILE_PATH ]; 
then    
         mv /path/to/src.war /path/to/deploy.war    
         rm /path/to/src.upload.complete.txt 
fi
    
por 20.06.2013 / 17:31
0

E algo como:

scp my.war user@remote:/tmp && ssh user@remote 'mv /tmp/my.war /production/directory'
    
por 20.06.2013 / 17:15
0

Se você usar o rsync em vez do scp para atualizar o arquivo, ele deverá criar um arquivo temporário com um nome diferente e, quando a integridade estiver marcada, mova-o para o nome correto. Eu acho que é mais ou menos o comportamento que você precisa. Opções padrão devem fazer isso. Apenas substitua scp por rsync se você não estiver usando nenhuma opção em particular (veja man rsync para detalhes). rsync sourcefile user@dest:/dest/directory/

    
por 20.06.2013 / 20:36