Como fazer o svn procurar se houver uma atualização uma vez por minuto e se houver alguma chamada de script?

3

Estou desenvolvendo um aplicativo de servidor. Eu tenho uma máquina remota com Debian que eu uso para teste. Atualmente eu atualizo o servidor manualmente quando cada nova versão do svn é lançada. É apenas um servidor de teste e o tráfego é gratuito para mim. Eu criei um script simples que baixa a revisão mais recente do svn ( HEAD ) e recompila o meu servidor.

Gostaria de saber se é possível criar um script .sh (compatível com o Debian) que um usuário normal (não SU) seria capaz de iniciar com algo como nohup ./superScript.sh >& /dev/null & e que, uma vez por minuto, procuraria algum SVN, find a versão atual e, se houve uma atualização, execute comandos como:

kill 'ps aux | grep -F 'ServerAPP' | grep -v -F 'grep' | awk '{ print $2 }'' 
./server_automated_net_setup.sh
cd server/install-dir/
export LD_LIBRARY_PATH=./:~/server/install-dir/lib_boost:~/server/install-dir/lib_openSSL
nohup ./ServerAPP >& /dev/null &

que mataria o aplicativo em execução no momento, executaria um script de atualização automática que já possuímos na home do usuário ( ~ ) e o executaria novamente.

É possível criar um script desse tipo e como faço isso?

    
por myWallJSON 19.01.2012 / 17:34

3 respostas

1

Bem, qualquer script pode ser escrito, mas a princípio penso sobre uma metodologia ligeiramente diferente de monitoramento e atualização (eu odeio todos os minutos se conecta ao repo)

  1. Enviar notificação do repo para o servidor em vez de puxar o repo do servidor, se você puder gerenciar o repositório (o gancho post-commit no repositório pode fazer quase tudo )
  2. No script de execução do servidor de eventos "commit happened", que
    • svn up código para cópia de trabalho local
    • svn export código do WC para algum local
    • ... execute todas as outras etapas

Se você não pode usar ganchos de repositório, adicione svn up | grep + some code no crontab do usuário.

O grep para svn up é necessário para diferenciar a atualização dos dados da atualização sem dados.

Atualização real (exemplo)

>svn up
Updating '.':
U    index.html
Updated to revision 9012.

Atualização vazia

>svn up
Updating '.':
At revision 9012.

Carta na frente da ação de exibição de objeto afetado

A  Added
D  Deleted
U  Updated
C  Conflict
G  Merged
E  Existed
R  Replaced
    
por 19.01.2012 / 19:04
0

Você pode combinar todos esses comandos em um arquivo .sh , assim:

#!/bin/bash
kill 'ps aux | grep -F 'ServerAPP' | grep -v -F 'grep' | awk '{ print $2 }'' 
/full/path/to/server_automated_net_setup.sh
export LD_LIBRARY_PATH=./:~/server/install-dir/lib_boost:~/server/install-dir/lib_openSSL
nohup /full/path/to/ServerAPP >& /dev/null &

Cole tudo no arquivo yourname.sh e torne executável:

chmod +x yourname.sh

Também é possível fazer check-out direto do script svn co url:// e você poderá automatizar todo o processo.

    
por 19.01.2012 / 18:31
0

Para responder à sua pergunta sobre um usuário normal, se o seu programa (assumindo um servidor baseado em rede) usar portas sem privilégios (acima de 1000), o usuário poderá executá-lo sem su / sudo.

Tome uma opinião diferente sobre isso.

if ./server_automated_net_setup.sh; then
    kill 'ps x --no-header --format=pid,cmd | awk '!/awk/&&/ServerAPP/{print $1}'' 2>&-
    cd $HOME/server/install-dir
    nohup env LD_LIBRARY_PATH=./:$HOME/server/install-dir/lib_boost:$HOME/server/install-dir/lib_openSSL ./ServerAPP >& /dev/null &
fi

Você precisaria alterar seu server_automated_net_setup.sh para retornar sucesso ( 0 ) se algo fosse atualizado e reconstruído e falha ( 1 ) se nada fosse alterado.

Em seguida, chame esse script do cron a cada período. Se você tiver todos os minutos, pode haver muita movimentação de disco entre a atualização e a reconstrução do software. Também não há nada que o impeça de chamar o script você mesmo.

Para o server_automated_net_setup.sh , faço algo próximo de:

wcdir=$HOME/source/myworkingcopy
if [ -n 'svn status -qu $wcdir | awk '/^........\*/'' ]; then
        gmake -C $wcdir svn-update rebuild deploy
    echo $?
else
    exit 1
fi

O gmake executaria o svn + update antes de uma compilação parcial e copiaria o artefato para o diretório de instalação (deploy).

    
por 20.01.2012 / 00:58