Implantação automatizada de sites (git + ftp dentro)

Existem v√°rias maneiras de automatizar a implanta√ß√£o de um site (p√°ginas GitHub com Jekyll, Maven, Git commit hooks, …). Infelizmente, algumas configura√ß√Ķes (na maioria das vezes baratas) n√£o permitem intera√ß√£o f√°cil de controle de origem no lado do servidor (hospedagem mutualizada).

Minha solução atual é combinar um Jenkins local, um branch remoto do Git e lftp.

Meu controle de origem Git cont√©m duas ramifica√ß√Ķes principais mastere prod. O primeiro (padr√£o) √© usado para tarefas comuns de desenvolvimento e o outro s√≥ √© modificado quando uma atualiza√ß√£o do site na Internet deve ser feita.

Meu trabalho do Jenkins apenas pesquisa na prodramificação e invoca o script a seguir para sincronizar o estado do site e as fontes atuais.

#!/bin/bash

# retrieve the absolute path of this script in a portable manner
BASE_DIR
=$(cd $(dirname "$0") && pwd)

ftp_host
="ftp.your.conf.com"
remote_dir
="/ftp/remote/directory"
local_dir
=$BASE_DIR; # we consider here that the web site sources are sibling of this script

# user specific parameters must be set in calling environment to allow several ftp users to use it and to avoid password storage
if [[ -z "${ftp_user}" ]]; then
echo
"'ftp_user' must be set"
exit 1;
fi

if [[ -z "${ftp_password}" ]]; then
echo
"'ftp_password' must be set"
exit 1;
fi

# if you use composer, ensures the Jenkins workspace contains up to date dependencies
pushd $BASE_DIR

composer update
|| exit $?
popd


# use lftp to synchronize the source with the FTP server for only modified files.
lftp
-c "
#debug;

open ftp://${ftp_user}:${ftp_password}@${ftp_host}

lcd ${local_dir};

cd ${remote_dir};

mirror --only-newer

--ignore-time

--reverse

--parallel=5

--verbose

--exclude .git/

--exclude .gitignore

--exclude-glob composer.*

--exclude-glob *.sh"
|| exit $?

As partes importantes são o lftppróprio comando e seus comandos especiais --only-newercombinados com --ignore-time. A --reverseopção diz lftppara fazer upload de arquivos em vez de baixá-los.

Por padrão, o upload não atualiza o carimbo de data / hora do arquivo, portanto --only-newer, não funciona conforme o esperado, você terá que dizer lftppara ignorar o tempo para obter o comportamento esperado.

Isso atualizar√° apenas os arquivos modificados (compara√ß√£o por tamanho, portanto, n√£o 100% de certeza …) no servidor FTP remoto.

Existem v√°rias desvantagens em compara√ß√£o com outras solu√ß√Ķes (melhores?), Sem possibilidade de revers√£o, sem atomicidade, crit√©rio de atualiza√ß√£o de arquivo n√£o seguro etc. Mas para configura√ß√Ķes baratas, isso ajuda muito a automatizar o processo de implanta√ß√£o de um site. A √ļnica a√ß√£o manual √© enviar por push as altera√ß√Ķes desejadas no branch remoto do produto.