Desenvolvimento e bases de dados

Automatizar a implementação no cPanel com o ficheiro .cpanel.yml

Revisto a 8 min de leitura Git implementações

A interface de Git do cPanel não se limita a guardar os seus repositórios: também pode colocar as alterações em produção (fazer a implementação) executando as tarefas que definir no ficheiro .cpanel.yml.

Se procura um caso completo, passo a passo, veja implementação automática do GitHub para o cPanel com Laravel. Se preferir não o configurar manualmente, o Deploy+ faz isso a partir da área de cliente.

O ficheiro .cpanel.yml

É um ficheiro de texto em formato YAML com a lista de comandos que são executados em cada implementação: copiar ficheiros para a pasta pública, instalar dependências, limpar caches… qualquer coisa que possa fazer com um comando ou um script.

Crie-o na raiz do repositório, com esse nome exato (com o ponto à frente), e faça commit dele. A sua estrutura é esta:

---
deployment:
  tasks:
    - export DEPLOYPATH=/home/usuario/public_html/
    - /bin/cp index.html $DEPLOYPATH
    - /bin/cp style.css $DEPLOYPATH
  • As três primeiras linhas são fixas: ---, deployment: e, por baixo, tasks:.
  • Cada tarefa é uma linha que começa por - (hífen e espaço), com o mesmo avanço.
  • export DEPLOYPATH=... guarda a pasta de destino numa variável, para não a repetir em cada linha.
  • Os /bin/cp copiam index.html e style.css do repositório para a pasta pública. Assim, o site é atualizado com as alterações.

Substitua usuario pelo seu utilizador do cPanel. O cp substitui os ficheiros que já existam com esse nome no destino.

Copiar todo o site com rsync

Para não ir ficheiro a ficheiro, copie todo o conteúdo do repositório exceto o que não deve ser publicado:

---
deployment:
  tasks:
    - export DEPLOYPATH=/home/usuario/public_html/
    - /bin/rsync -a --exclude='.git' --exclude='.cpanel.yml' ./ $DEPLOYPATH

O rsync não apaga do destino os ficheiros que já não estejam no repositório. Pode acrescentar --delete para que o faça, mas só se essa pasta contiver unicamente o que vem do repositório: apagaria também imagens carregadas, caches ou o .htaccess se não estiverem nele.

Tarefas de uma aplicação PHP

Pode executar qualquer ferramenta com o seu caminho completo. Por exemplo, instalar dependências com o Composer e esvaziar a cache de uma aplicação Laravel:

---
deployment:
  tasks:
    - cd /home/usuario/repositories/proyecto && /usr/local/bin/php /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader
    - cd /home/usuario/repositories/proyecto && /usr/local/bin/php artisan config:cache

Use sempre caminhos absolutos: as tarefas não carregam a sua configuração de terminal. Se não souber onde está um programa, execute which php (ou o que for) por SSH.

Se as tarefas forem muitas ou dependerem umas das outras, coloque-as num script do repositório e chame apenas esse script a partir do .cpanel.yml:

---
deployment:
  tasks:
    - /bin/bash /home/usuario/repositories/proyecto/deploy.sh

Comece o script com set -e para que pare no primeiro comando que falhar.

Quando é executada a implementação

Push deployment: faz push para o repositório do cPanel

Se o seu repositório local tiver como remoto o repositório do cPanel, ao fazer git push o cPanel executa automaticamente as tarefas do .cpanel.yml. Para isso, o repositório do cPanel tem de ter um ramo ativo e não ter alterações por confirmar.

Para adicionar o repositório do cPanel como remoto, copie o Clone URL que aparece em Git™ Version Control > Manage e execute no seu equipamento:

git remote add cpanel ssh://usuario@tudominio.com/home/usuario/repositories/proyecto
git push cpanel main

Pull deployment: o código está no GitHub, GitLab ou outro remoto

Se o repositório do cPanel for um clone de um do GitHub, faça push para o GitHub como sempre e, depois, em Git™ Version Control > Manage > Pull or Deploy:

  1. Update from Remote descarrega as alterações.
  2. Deploy HEAD Commit executa as tarefas do .cpanel.yml.

Um push para o GitHub não avisa o cPanel por si só. Para que a implementação seja feita automaticamente em cada push, use um webhook do GitHub como se explica no caso prático com o GitHub, ou uma tarefa cron como a da secção seguinte.

Lançar a implementação com a API ou uma tarefa cron

Por SSH, este comando faz o mesmo que o botão Deploy HEAD Commit:

/usr/local/cpanel/bin/uapi VersionControlDeployment create repository_root=/home/usuario/repositories/proyecto

Substitua o caminho pelo do seu repositório. Se a resposta incluir status: 1, o cPanel pôs a implementação em marcha; o resultado de cada tarefa fica no ficheiro de log_path.

Para implementar periodicamente o que houver no GitHub, crie uma tarefa cron que primeiro descarregue as alterações e depois implemente:

cd /home/usuario/repositories/proyecto && /usr/bin/flock -n /home/usuario/.deploy.lock sh -c 'git pull -q && /usr/local/cpanel/bin/uapi VersionControlDeployment create repository_root=/home/usuario/repositories/proyecto' >/dev/null

O flock -n evita que sejam lançadas duas ao mesmo tempo se uma execução demorar mais do que o previsto. Não defina uma frequência muito alta: a cada 10 ou 15 minutos costuma bastar. Se só quiser implementar quando houver alterações, o webhook é a melhor opção.

Ver o que aconteceu numa implementação

Cada implementação deixa um registo em ~/.cpanel/logs/ com o nome vc_NUMERO_git_deploy.log. Aí aparece cada comando, a sua saída e o seu código de saída: Task completed with exit code 0 significa que correu bem; qualquer outro número indica o comando que falhou.

ls -t ~/.cpanel/logs/*git_deploy.log | head -1 | xargs cat

Se uma implementação não for executada ao fazer push, verifique em Git™ Version Control > Manage que o repositório tem um ramo ativo e que o .cpanel.yml está na raiz e confirmado com commit.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.