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.