Deploy automático do SVN

Estou iniciando um novo projeto e aproveitei para mudar do CVS para o Subversion. 

Uma das coisas que achei interessante é o esquema de “hooks“. É um conceito parecido com “triggers” de bancos de dados. Você pode programar alguns scripts para serem executados em momentos específicos do ciclo gerenciado pelo SVN. As opções são:

post-commit.tmpl
post-lock.tmpl
post-revprop-change.tmpl
post-unlock.tmpl
pre-commit.tmpl
pre-lock.tmpl
pre-revprop-change.tmpl
pre-unlock.tmpl
start-commit.tmpl

Os nomes são auto-explicativos. Por exemplo, o script post-lock vai ser executado sempre após algum usuário ter feito o lock de um arquivo.

Estes arquivos estão armazenados no diretório hooks do repositório do projeto.

O que eu fiz foi alterar o post-commit.tmpl

É preciso remover a extensão do nome e dar permissão de execução no arquivo, então:

cp post-commit.tmpl post-commit
chmod +x post-commit

O conteúdo do arquivo ficou assim:

REPOS="$1"
REV="$2"
PROD="/var/www/html"
#pega todas as alteracoes
svnlook changed $REPOS --revision $REV >> /tmp/lixo_$REV
#pega cada alteracao e salva
for i in `cat /tmp/lixo_$REV|cut -c 5-1024` ; do
  svnlook cat $REPOS $i > $PROD/$i
done
#apagar arquivo
rm /tmp/lixo_$REV
Desta forma cada vez que um programador faz o commit do fonte ele é automaticamente salvo no htdocs, onde fica acessível para a equipe de testes. 
Lógico que esse script pode ser melhorado e isso está sendo executado em um servidor de desenvolvimento e não o de produção. Além disso eu comecei a usar o SVN somente agora, por isso, se alguém encontrar um problema ou erro na lógica me avisem :-)
Bookmark and Share

5 Responses to “Deploy automático do SVN”


  1. 1Elton

    ola!!

    teria como vc me explicar como obrigar em td commit dado, ter obrigatoriamente uma mensagem?

  2. 2elm

    Boa pergunta!
    Não sei :-)
    Mas vou pesquisar

  3. 3Rodrigo

    legal,
    eu estou usando o svn também e estava dando deploy no braço. Agora ficou mais fácil.

  4. 4Pedro Costa

    Legal.. mas comigo não deu certo.
    simplesmente quando faço o commit, não atualiza no htdocs.

  5. 5Micael

    Olá Amigo,

    Andei lendo muito sobre hooks e a forma que voce demonstra foi a que mais cheguei perto.

    Coloquei ela desta forma:

    PROD=”/teste”
    #pega todas as alteracoes
    svnlook changed $REPOS –revision $REV >> /tmp/lixo_$REV
    #pega cada alteracao e salva
    for i in `cat /tmp/lixo_$REV|cut -c 5-1024` ; do
    svnlook cat $REPOS $i > $PROD/$i
    done
    #apagar arquivo
    rm /tmp/lixo_$REV

    quando executo o comando para debugar o hook, recebo o seguinte retorno:

    administrador@angra:/srv/svn/avanz/hooks$ sudo env – ./post-commit /srv/svn/avanz/
    svnlook: missing argument: –revision
    Type ’svnlook help’ for usage.

    Voce pode me dar uma ajudinha? Valeu aih brother

Leave a Reply