Configurando a entrega contínua no gitlab.com

Uma vez pensei em automatizar a implantação do meu projeto. O gitlab.com fornece todas as ferramentas para isso, e é claro que eu decidi usá-lo classificando e escrevendo um pequeno script de implantação. Neste artigo, compartilho minha experiência com a comunidade.

TL; DR


  1. Configurar o VPS: desabilite o root, faça login com senha, instale o dockerd, configure o ufw
  2. Gere certificados para o servidor e cliente docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Habilite o controle dockerd via soquete tcp: remova a opção -H fd: / / da configuração do docker.
  3. Registrar caminhos de certificado no docker.json
  4. Registre-se nas variáveis ​​do gitlab nas configurações de CI / CD com o conteúdo do certificado. Escreva um script .gitlab-ci.yml para a implantação.

Vou mostrar todos os exemplos no kit de distribuição Debian.

Configuração inicial do VPS


Então, como você comprou uma instância, por exemplo, no DO , a primeira coisa a fazer é proteger seu servidor do mundo externo agressivo. Não vou provar e reivindicar nada, apenas mostro o log / var / log / messages do meu servidor virtual:

Captura de tela
imagem

Primeiro, instale o firewall ufw:

apt-get update && apt-get install ufw 

Ative a política padrão: bloqueie todas as conexões de entrada, permita todas as conexões de saída:

 ufw default deny incoming ufw default allow outgoing 

Importante: não esqueça de permitir a conexão ssh:

 ufw allow OpenSSH 

A sintaxe geral é: Permitir uma conexão de porta: ufw allow 12345, em que 12345 é o número da porta ou o nome do serviço. Negar: ufw negar 12345

Ligue o firewall:

 ufw enable 

Saímos da sessão e efetuamos login novamente via ssh.

Adicione o usuário, atribua uma senha a ele e adicione-o ao grupo sudo.

 apt-get install sudo adduser scoty usermod -aG sudo scoty 

Em seguida, de acordo com o plano, você deve desativar a entrada de senha. Para fazer isso, copie sua chave ssh para o servidor:

 ssh-copy-id root@10.101.10.28 

O ip do servidor deve ser especificado. Tente agora fazer login com o usuário criado anteriormente, não é mais necessário digitar uma senha. Em seguida, nas definições de configuração, altere o seguinte:

 sudo nano /etc/ssh/sshd_config 

desativar entrada de senha:

 PasswordAuthentication no 

Reinicie o daemon sshd:

 sudo systemctl reload sshd 

Agora, se você ou outra pessoa tentar fazer login como root, não funcionará.

Em seguida, defina o dockerd, aqui não descreverei o processo, pois tudo já pode ser alterado, siga o link para o site oficial e siga as etapas para instalar o docker em sua máquina virtual: https://docs.docker.com/install/linux/docker- ce / debian /

Geração de certificado


Para gerenciar o daemon do docker remotamente, é necessária uma conexão TLS criptografada. Para fazer isso, você deve ter um certificado e uma chave, que devem ser gerados e transferidos para sua máquina remota. Siga as etapas fornecidas nas instruções no site oficial do docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Todos gerados * .pem arquivos para o servidor, ou seja, ca.pem, server.pem, key.pem devem ser colocados no diretório / etc / docker no servidor.

Configuração do Dockerd


No script para iniciar o daemon do docker, remova a opção -H df: //, essa opção responde qual host pode controlar o daemon do docker.

 # At /lib/systemd/system/docker.service [Service] Type=notify ExecStart=/usr/bin/dockerd 

Em seguida, crie um arquivo de configurações, se ainda não estiver lá, e prescreva as opções:

/etc/docker/daemon.json
 { "hosts": [ "unix:///var/run/docker.sock", "tcp://0.0.0.0:2376" ], "labels": [ "is-our-remote-engine=true" ], "tls": true, "tlscacert": "/etc/docker/ca.pem", "tlscert": "/etc/docker/server.pem", "tlskey": "/etc/docker/key.pem", "tlsverify": true } 


Vamos ativar as conexões na porta 2376:

 sudo ufw allow 2376 

Reinicie o dockerd com as novas configurações:

 sudo systemctl daemon-reload && sudo systemctl restart docker 

Verifique:

 sudo systemctl status docker 

Se tudo estiver verde, acreditamos que configuramos com êxito a janela de encaixe no servidor.

Configurando a entrega contínua no gitlab


Para que o trabalhador do gitalab possa executar comandos no host remoto do docker, é necessário determinar como e onde armazenar certificados e a chave para uma conexão criptografada com o dockerd. Eu resolvi esse problema simplesmente escrevendo-o em variáveis ​​nas configurações do gitlbab:

Título de spoiler
imagem

Simplesmente exiba o conteúdo dos certificados e da chave via cat: cat ca.pem . Copie e cole no valor das variáveis.

Vamos escrever o script para a implantação através do gitlab. A imagem docker-in-docker (dind) será usada.

.gitlab-ci.yml
 image: name: docker/compose:1.23.2 #  entrypoint ,    dind entrypoint: ["/bin/sh", "-c"] variables: DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 services: - docker:dind stages: - deploy deploy: stage: deploy script: - bin/deploy.sh #    


O conteúdo do script de implantação com comentários:

bin / deploy.sh
 #!/usr/bin/env sh #  ,   -  set -e # ,  ,   set -v # DOCKER_COMPOSE_FILE=docker-compose.yml #   DEPLOY_HOST=185.241.52.28 #    ,      - gitlab- DOCKER_CERT_PATH=/root/.docker # ,      docker info docker-compose version #   (    -  gitlab') mkdir $DOCKER_CERT_PATH #   ,         . echo "$CA_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/ca.pem echo "$CERT_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/cert.pem echo "$KEY_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/key.pem #       chmod 400 $DOCKER_CERT_PATH/ca.pem chmod 400 $DOCKER_CERT_PATH/cert.pem chmod 400 $DOCKER_CERT_PATH/key.pem #       docker-. ,   export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://$DEPLOY_HOST:2376 # ,     docker-compose \ -f $DOCKER_COMPOSE_FILE \ ps #   docker-,     ""  docker login -u $DOCKER_USER -p $DOCKER_PASSWORD docker-compose \ -f $DOCKER_COMPOSE_FILE \ pull app #   docker-compose \ -f $DOCKER_COMPOSE_FILE \ up -d app 


O principal problema era “extrair” o conteúdo dos certificados na forma normal das variáveis ​​CI / CD do gitlab. Não consegui entender por que a conexão com o host remoto não funcionou. No host, observei o log do docker do sudo journalctl -u, há um erro de handshake. Eu decidi olhar o que geralmente é armazenado nas variáveis, para isso você pode ver o gato -A $ DOCKER_CERT_PATH / key.pem. O erro foi solucionado adicionando a remoção do símbolo do carro tr -d '\ r'.

Além disso, no script, você pode adicionar tarefas pós-lançamento a seu critério. Você pode ver a versão de trabalho no meu repositório https://gitlab.com/isqad/gitlab-ci-cd

Source: https://habr.com/ru/post/pt449952/


All Articles