Skip to content

Instantly share code, notes, and snippets.

@jefersonalmeida
Last active August 27, 2021 15:49
Show Gist options
  • Save jefersonalmeida/f4ff4456db878fd9756bf22303f2cd3d to your computer and use it in GitHub Desktop.
Save jefersonalmeida/f4ff4456db878fd9756bf22303f2cd3d to your computer and use it in GitHub Desktop.
Deploy automatizado - GIT Hooks

Deploy automatizado - GIT Hooks

Aqui estão as etapas simples necessárias para criar uma implantação do repositório GIT local para um servidor.

Pré-requisitos

  1. Saiba como usar GIT, Terminal, etc.
  2. Prepare uma cópia local de trabalho
  3. Tenha acesso SSH ao seu servidor usando chave private/public

Tarefas

  1. Crie uma pasta para implantar no servidor de produção (ou seja, sua pasta www | htdocs | pubic_html | public)
  2. Inclua um repositório 'bare' (vazio) no servidor de produção
  3. Adicione o script de hooks/post-receive ao repositório bare (e torne-o executável)
  4. Adicione o repositório remoto localizado no servidor de produção ao seu repositório local
  5. Envie para o servidor de produção e relaxe.

1. Prepare uma cópia local de trabalho

Suponhamos que estamos trabalhando no master - mas você pode trabalhar em qualquer branch.

2. Crie uma pasta para implantar (caso não exista)

ssh no seu servidor de produção:

$ ssh [email protected]
$ mkdir ~/public

3. Inclua um repositório bare no servidor de produção

Agora criamos um repositório "bare" - um que não contém os arquivos da cópia de trabalho. Basicamente, é o conteúdo da pasta do repositório .git em uma cópia de trabalho normal. Nomeie como quiser, você também pode omitir a parte .git de project.git ou deixá-la para criar o repositório em uma pasta vazia existente:

$ git init --bare ~/project.git

4. Adicione o script hooks/post-receive

Esse script é executado quando o envio da máquina local é concluído e move os arquivos no lugar. Ele reside em project.git/hooks/ e é chamado de 'post-receive'. Você pode usar o vim para editá-lo e criá-lo. O script verifica se a ramificação correta foi enviada por push (não implementando uma ramificação de desenvolvimento, por exemplo). Você pode baixar um exemplo de script post-receive abaixo. Além disso, não esqueça de adicionar permissões de execução ao referido script;

chmod +x post-receive

5. Adicionar repositório remoto localmente

Agora, adicionamos esse repositório simples ao seu sistema local como um repositório remoto. Onde "production" é o nome que você deseja atribuir ao repositório remoto. Isso também é chamado de "staging" ou "live" ou "test" etc., se você deseja implantar em um sistema diferente ou em vários sistemas.

$ cd ~/path/to/working-copy/
$ git remote add production [email protected]:project.git

Verifique se "project.git" corresponde ao nome que você deu na etapa 3. Se você estiver usando o Tower ou um aplicativo semelhante, verá os recém-adicionados remotamente na barra lateral em "Remotes" ou liste seus repositórios remotos.

$ git remote -v

6. Enviar para o servidor de produção

Agora você pode enviar a ramificação principal para o servidor de produção:

$ git push production master

Se você estiver usando a torre, poderá arrastar e soltar a ramificação principal no novo reposotório remoto de produção. É isso aí. Tem dúvidas, melhorias?

#!/bin/bash
TARGET="/home/user/public"
GIT_DIR="/home/user/project.git"
BRANCH="master"
while read oldrev newrev ref
do
# apenas verificar o master (ou qualquer ramo que você gostaria de implantar)
if [ "$ref" = "refs/heads/$BRANCH" ];
then
echo "Ref $ref recebido. Fazendo deploy do branch ${BRANCH} na produção..."
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
else
echo "Ref $ref recebido. Não fazer nada: apenas a ramificação ${BRANCH} pode ser implantada neste servidor."
fi
done
@jefersonalmeida
Copy link
Author

Se você está procurando fazer implantação no mesmo servidor, mas com branch diferente (production/sandbox)

#!/bin/bash
while read oldrev newrev ref
do
    # apenas verificar o master (ou qualquer ramo que você gostaria de implantar)
    if [[ $ref = refs/heads/master ]];
    then
        echo "Ref master recebido. Fazendo deploy do branch na produção..."
        git --work-tree=/home/user/public --git-dir=/home/user/project.git checkout -f master
    else
        if [[ $ref = refs/heads/sandbox ]];
        then
                echo "Ref develop recebido. Fazendo deploy do branch na produção..."
                git --work-tree=/home/user/sandbox --git-dir=/home/user/project.git checkout -f sandbox
        else
                echo "Ref $ref recebido. Não fazer nada."
        fi
    fi
done

@jefersonalmeida
Copy link
Author

jefersonalmeida commented May 23, 2020

Um exemplo que utilizo para aplicações Laravel (que pode ser utilizado praticamente para qualquer outros, só mudar os comandos necessários):

#!/bin/bash
TARGET="/home/user/app"
GIT_DIR="/home/admin/app.git"
BRANCH="master"

while read oldrev newrev ref
do
        # apenas verificar o master (ou qualquer ramo que você gostaria de implantar)
        if [ "$ref" = "refs/heads/$BRANCH" ];
        then
                echo "Ref $ref recebido. Fazendo deploy do branch ${BRANCH} na produção..."
                git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
                echo "Entrando na pasta $TARGET..."
                cd $TARGET
                echo "Marcando pastas para escrita..."
                chmod -R 777 storage/ bootstrap/cache/
                echo "Instalando dependências via composer..."
                composer install  --no-dev --no-interaction --prefer-dist --optimize-autoloader
                echo "Limpando cache da aplicação..."
                php artisan route:clear
                php artisan config:clear
                php artisan cache:clear
                echo "Configurando cache da aplicação..."
                php artisan route:cache
                php artisan config:cache
                echo "Criando link do storage..."
                php artisan storage:link
                echo "Restartando jobs/queues..."
                php artisan queue:restart
        else
                echo "Ref $ref recebido. Não fazer nada: apenas a ramificação ${BRANCH} pode ser implantada neste servidor."
        fi
done

echo "Script criado por [email protected] ;)"

@jefersonalmeida
Copy link
Author

Um exemplo que utilizo para aplicações Angular (que pode ser utilizado praticamente para qualquer outros, só mudar os comandos necessários):

#!/bin/bash
PRE_TARGET="/home/admin/tmp"
TARGET="/home/admin/public_html"
GIT_DIR="/home/admin/app.git"
BRANCH="master"

while read oldrev newrev ref
do
        # apenas verificar o master (ou qualquer ramo que você gostaria de implantar)
        if [ "$ref" = "refs/heads/$BRANCH" ];
        then
                echo "Limpando e recriando pasta $PRE_TARGET..."
                rm -Rf $PRE_TARGET
                mkdir $PRE_TARGET
                echo "Ref $ref recebido. Fazendo deploy do branch ${BRANCH} na produção..."
                git --work-tree=$PRE_TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
                echo "Entrando na pasta $PRE_TARGET..."
                cd $PRE_TARGET
                echo "Habilitando -s extglob..."
                shopt -s extglob
                echo "Instalando dependências via npm..."
                npm install
                echo "Criando build da aplicação..."
                npm run build
                echo "Limpando a pasta $TARGET..."
                rm -Rf $TARGET/*
                echo "Copiando build para a pasta $TARGET"
                cp -Rf $PRE_TARGET/dist/* $TARGET
                echo "Entrando na pasta $TARGET..."
                cd $TARGET/
                echo "Removendo arquivos da pasta $PRE_TARGET..."
                rm -Rf $PRE_TARGET

        else
                echo "Ref $ref recebido. Não fazer nada: apenas a ramificação ${BRANCH} pode ser implantada neste servidor."
        fi
done

echo "Script criado por [email protected] ;)"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment