Configuración de CD a través de gitlab

Unha vez pensei en automatizar o despregamento do meu proxecto. gitlab.com ofrece amablemente todas as ferramentas para iso e, por suposto, decidín usalo descubrindoo e escribindo un pequeno script de implementación. Neste artigo, comparto a miña experiencia coa comunidade.

TL, RD

  1. Configurar VPS: desactivar root, iniciar sesión con contrasinal, instalar dockerd, configurar ufw
  2. Xerar certificados para servidor e cliente docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Activa o control dockerd a través do socket tcp: elimina a opción -H fd:// da configuración docker.
  3. Establece camiños aos certificados en docker.json
  4. Rexístrese nas variables de gitlab na configuración de CI/CD co contido dos certificados. Escriba un script .gitlab-ci.yml para a súa implantación.

Mostrarei todos os exemplos sobre a distribución Debian.

Configuración inicial de VPS

Aquí compraches unha instancia, por exemplo DO, o primeiro que hai que facer é protexer o teu servidor do agresivo mundo exterior. Non vou demostrar nin afirmar nada, só mostrarei o rexistro /var/log/messages do meu servidor virtual:

Captura de pantallaConfiguración de CD a través de gitlab

Primeiro, instala o firewall ufw:

apt-get update && apt-get install ufw

Activa a política predeterminada: bloquea todas as conexións entrantes, permite todas as conexións saíntes:

ufw default deny incoming
ufw default allow outgoing

Importante: non esquezas permitir a conexión a través de ssh:

ufw allow OpenSSH

A sintaxe xeral é: Permitir conexión no porto: ufw allow 12345, onde 12345 é o número de porto ou o nome do servizo. Denegar: ufw denegar 12345

Activa o firewall:

ufw enable

Saímos da sesión e iniciamos sesión de novo a través de ssh.

Engade un usuario, asígnelle un contrasinal e engádeo ao grupo sudo.

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

A continuación, segundo o plan, debes desactivar o inicio de sesión con contrasinal. para iso, copie a súa chave ssh no servidor:

ssh-copy-id [email protected]

A ip do servidor debe ser túa. Agora tenta iniciar sesión co usuario creado anteriormente, xa non necesitas introducir un contrasinal. A continuación, na configuración de configuración, cambie o seguinte:

sudo nano /etc/ssh/sshd_config

desactivar o inicio de sesión con contrasinal:

PasswordAuthentication no

Reinicie o daemon sshd:

sudo systemctl reload sshd

Agora, se vostede ou outra persoa tentan iniciar sesión como root, fallará.

A continuación, instalamos dockerd, non vou describir o proceso aquí, xa que xa se pode cambiar todo, siga a ligazón ao sitio web oficial e siga os pasos para instalar docker na súa máquina virtual: https://docs.docker.com/install/linux/docker-ce/debian/

Xeración de certificados

Para controlar o daemon docker de forma remota, é necesaria unha conexión TLS cifrada. Para iso, necesitas ter un certificado e unha clave que necesitas xerar e transferir á túa máquina remota. Siga os pasos indicados nas instrucións do sitio web oficial docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Todos os ficheiros *.pem xerados para o servidor, é dicir, ca.pem, server.pem, key.pem, deben colocarse no directorio /etc/docker do servidor.

configuración docker

No script de inicio do daemon docker, elimine a opción -H df://, esta opción indica en que host se pode controlar o daemon docker.

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

A continuación, cree un ficheiro de configuración se aínda non existe e configure as opcións:

/etc/docker/docker.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
}

Permitir conexións no porto 2376:

sudo ufw allow 2376

Reinicie dockerd cunha nova configuración:

sudo systemctl daemon-reload && sudo systemctl restart docker

Comprobamos:

sudo systemctl status docker

Se todo é verde, consideramos que configuramos correctamente o docker no servidor.

Configurando a entrega continua en gitlab

Para que o traballador de gitalab poida executar comandos nun host docker remoto, cómpre decidir como e onde almacenar os certificados e unha clave para unha conexión cifrada a dockerd. Resolvín este problema simplemente escribindo nas variables na configuración de gitlbab:

título de spoilerConfiguración de CD a través de gitlab

Só ten que emitir o contido dos certificados e da clave a través de cat: cat ca.pem. Copia e pega en valores variables.

Escribamos un script para o despregue a través de gitlab. Usarase a imaxe docker-in-docker (dind).

.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 contido do script de implementación con comentarios:

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 foi "sacar" o contido dos certificados na forma normal das variables CI/CD de gitlab. Non puiden descubrir por que non funcionaba a conexión co host remoto. Mirei o rexistro sudo journalctl -u docker no host, hai un erro co apretón de mans. Decidín mirar o que xeralmente se almacena nas variables, para iso podes ver cat -A $DOCKER_CERT_PATH/key.pem. Superouse o erro engadindo a eliminación do carácter de intercalación tr -d 'r'.

Ademais, pode engadir tarefas posteriores ao lanzamento ao guión ao seu criterio. Podes consultar a versión de traballo no meu repositorio https://gitlab.com/isqad/gitlab-ci-cd

Fonte: www.habr.com

Engadir un comentario