GitLab CI: Automatizando Deploy via SSH com Scripts no Servidor
Como criar uma job para se conectar com seu servidor e automatizar processos na hora do Deploy.
Recentemente, precisei configurar um processo de deploy automatizado para um projeto na empresa onde trabalho. A ideia era simples: Ao fazer push na branch main, o GitLab CI deverá acessar o servidor via SSH e atualizar a aplicação, tudo isso com menos intervenção manual possível. Neste artigo, vou mostrar como criei uma prova de conceito(POC) para essa abordagem.
Configuração no Servidor
Nesse caso criei um servidor pela Digital Ocean, mas outros CSP como AWS e Azure servem. Para os próximos passos, vamos considerar que o servidor já tenha sido provisionado.
1. Configurando chaves de acesso remoto
Vamos criar um par de chaves para nos conectarmos à instância via SSH de forma segura com o comando:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
Nossas chaves pública e privada foram criadas com sucesso, podendo ver elas com o comando:
ls -a ~/.ssh/
2. Convertendo a chave privada
Ao final do passo anterior, nossas chaves foram geradas, mas precisamos converter o formato da chave privada de OpenSSH para seu formato mais antigo(PEM), pois atualmente o Gitlab não aceita chaves em seus novos formatos. Use o comando abaixo para fazer a conversão.
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa3. Copiando chave pública no authorized_keys
Para que possamos nos conectar usando as chaves, precisamos adicionar a chave pública no arquivo de chaves autorizadas (authorized_keys), localizado na pasta .ssh/ do usuário. Primeiro, exiba o valor da chave no terminal com a e depois a copie.
cat ~/.ssh/id_rsa.pub
Após ter copiado, acesse (ou crie caso não exista) o arquivo authorized_keys com o comando sudo nano ~/.ssh/authorized_keys, cole o conteúdo da chave nele e salve o arquivo com Ctrl + X seguido de y e Enter.
Important
Após essas configurações, você já deverá conseguir se conectar ao servidor via SSH sem a necessidade de digitar senhas — apenas utilizando a chave privada como argumento. Caso enfrente algum problema, talvez seja necessário ajustar algumas diretivas no arquivo /etc/ssh/sshd_config. Não entrarei em detalhes aqui para não fugir do foco, mas uma consulta rápida a um agente de IA pode te ajudar com isso.
4. Anotando valores
Precisamos anotar 3 coisas estando no servidor para usarmos dentro Gitlab, sendo elas: A chave privada, o ip público o servidor (123.456.12 por exemplo) e o usuário (no nosso caso o root). Para ver sua chave privada, use o comando:
cat ~/.ssh/id_rsa
5. Criar chaves para acessar projeto no gitlab
Você precisa fazer esse passo apenas se seu projeto for privado, assim o servidor poderá se conectar à ele e buscar as mudanças. Caso não seja, pode pular essa etapa.
ssh-keygen -t rsa -b 4096 -C "deploy@servidor" -f ~/.ssh/gitlab
Após criar as chaves, não precisamos alterar o formato da chave privada, apenas copiar a chave pública. Use o comando para exibir o conteúdo da chave, logo em seguida a copie:
cat ~/.ssh/gitlab.pubConfigurando o projeto no GitLab
Agora, vamos precisar de um projeto no gitlab para que a partir dele o Deploy aconteça. Caso você ainda não tenha, crie um antes de começarmos.
1. Importando arquivos base do projeto
Eu criei um projeto base no Gitlab, onde a partir dele você possa seguir esse tutorial. Clique aqui para ver o projeto. Copie 2 arquivos do projeto, o index.html e o .gitlab-ci.yml, com isso já podemos trabalhar.
2. Configurando projeto no Gitlab
Agora, precisamos configurar 2 coisas: As variáveis que nossa pipeline utilizará para se conectar ao servidor; Um token de acesso para o servidor conseguir acessar o repositório (apenas se o seu projeto for privado).
Acesse settings > CI/CD e selecioe Variables:

Adicione essas 3 variáveis, usando como valor aqueles itens que copiamos do servidor (ip do servidor, nome do usuário e chave privada).

3. Adicionando Deploy Keys
Important
Você precisará fazer esse passo apenas se seu projeto for privado.
Acesse settings > Repository > Deploy Keys:

Agora, vamos precisar da chave públilca que criamos no 5º passo. Se você a copiou, cole em Key.

Se seu servidor precisar subir mudanças no repositório, habilite a opção “Grant write permissions to this key” e adicione a chave.
Finalizando o lado do servidor
Agora que já criamos o nosso projeto no gitlab e configuramos eles, vamos voltar ao servidor e configurar o repositório.
1. Testando conexão com gitlab
Rode o comando abaixo:
ssh -T git@gitlab.com
2. Puxando projeto pela primeira vez
Agora, fazer o clone do projeto para o servidor, assim das próximas vezes, a pipeline ‘encontrará’ o diretório no servidor, e o fluxo de deploy acontecerá corretamente.
Important
No exemplo que trouxe, o .gitlab-ci.yml espera que o diretório do projeto no servidor esteja no seguinte caminho: /var/www/gitlab-ci-connect-server, pois para testar de forma rápida, eu configurei o nginx no servidor e configurei o mesmo para ‘fornecer’ meu projeto. Não trouxe essa configuração para não sairmos do foco, o importante é fazer o clone do projeto dentro do servidor no mesmo caminho que a pipeline espera, caso contrário ela não encontrará o .git e não vai funcionar.
No meu caso, o comando foi (dentro da pasta /var/www/):
git clone git@gitlab.com:ViniciusCassemira/gitlab-ci-connect-server.gitDepois desse tutorial, basta executar sua pipeline dentro do Gitlab, que ela deverá conseguir se conectar ao servidor e atualizar o código local do mesmo. Trouxe um exemplo bem simples, mas essa lógica pode ser aplicada a projetos reais e complexos, o que facilita algumas etapas na hora do Deploy de sua aplicação.
Gostou do conteúdo? Posso melhorar esse tutorial? Entrem e contato comigo, vamos conversar! Essa foi minha vez escrevendo esse tipo de conteúdo e espero trazer mais tópicos como esse :)