Configuración de CD a través de gitlab

Una vez pensé en automatizar la implementación de mi proyecto. gitlab.com amablemente proporciona todas las herramientas para esto y, por supuesto, decidí usarlo resolviéndolo y escribiendo un pequeño script de implementación. En este artículo, comparto mi experiencia con la comunidad.

TL; DR

  1. Configurar VPS: deshabilitar root, iniciar sesión con contraseña, instalar dockerd, configurar ufw
  2. Generar certificados para servidor y cliente. docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Habilite el control de dockerd a través del socket tcp: elimine la opción -H fd:// de la configuración de docker.
  3. Establecer rutas a certificados en docker.json
  4. Registrarse en las variables de gitlab en la configuración de CI/CD con el contenido de los certificados. Escriba un script .gitlab-ci.yml para la implementación.

Mostraré todos los ejemplos en la distribución Debian.

Configuración inicial de VPS

Aquí compraste una instancia por ejemplo en DO, lo primero que debe hacer es proteger su servidor del mundo exterior agresivo. No probaré ni afirmaré nada, solo mostraré el registro /var/log/messages de mi servidor virtual:

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

Primero, instale el firewall ufw:

apt-get update && apt-get install ufw

Habilite la política predeterminada: bloquee todas las conexiones entrantes, permita todas las conexiones salientes:

ufw default deny incoming
ufw default allow outgoing

Importante: no olvides permitir la conexión vía ssh:

ufw allow OpenSSH

La sintaxis general es: Permitir conexión en el puerto: ufw allow 12345, donde 12345 es el número de puerto o el nombre del servicio. Denegar: ufw denegar 12345

Activar cortafuegos:

ufw enable

Salimos de la sesión y volvemos a iniciar sesión vía ssh.

Agregue un usuario, asígnele una contraseña y agréguelo al grupo sudo.

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

A continuación, de acuerdo con el plan, debe deshabilitar el inicio de sesión con contraseña. para hacer esto, copie su clave ssh al servidor:

ssh-copy-id [email protected]

La ip del servidor debe ser la tuya. Ahora intente iniciar sesión con el usuario creado anteriormente, ya no necesita ingresar una contraseña. A continuación, en los ajustes de configuración, cambie lo siguiente:

sudo nano /etc/ssh/sshd_config

deshabilitar el inicio de sesión con contraseña:

PasswordAuthentication no

Reinicie el demonio sshd:

sudo systemctl reload sshd

Ahora, si usted u otra persona intenta iniciar sesión como root, fallará.

A continuación, instalamos dockerd, no describiré el proceso aquí, ya que todo se puede cambiar, siga el enlace al sitio web oficial y siga los pasos para instalar docker en su máquina virtual: https://docs.docker.com/install/linux/docker-ce/debian/

Generación de certificados

Para controlar el demonio docker de forma remota, se requiere una conexión TLS cifrada. Para hacer esto, debe tener un certificado y una clave que debe generar y transferir a su máquina remota. Siga los pasos que se indican en las instrucciones del sitio web oficial de Docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Todos los archivos *.pem generados para el servidor, a saber, ca.pem, server.pem, key.pem, deben colocarse en el directorio /etc/docker del servidor.

configuración de la ventana acoplable

En la secuencia de comandos de inicio del demonio de la ventana acoplable, elimine la opción -H df://, esta opción indica en qué host se puede controlar el demonio de la ventana acoplable.

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

A continuación, cree un archivo de configuración si aún no existe y configure las opciones:

/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 conexiones en el puerto 2376:

sudo ufw allow 2376

Reinicie dockerd con la nueva configuración:

sudo systemctl daemon-reload && sudo systemctl restart docker

Cheque:

sudo systemctl status docker

Si todo está en verde, entonces consideramos que hemos configurado con éxito la ventana acoplable en el servidor.

Configurar la entrega continua en gitlab

Para que el trabajador de gitalab pueda ejecutar comandos en un host docker remoto, debe decidir cómo y dónde almacenar los certificados y una clave para una conexión cifrada a dockerd. Resolví este problema simplemente escribiendo en las variables en la configuración de gitlbab:

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

Simplemente envíe el contenido de los certificados y la clave a través de cat: cat ca.pem. Copie y pegue en valores de variables.

Escribamos un script para la implementación a través de gitlab. Se utilizará la imagen 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 # скрипт деплоя тут

El contenido del 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

El principal problema era "sacar" el contenido de los certificados en la forma normal de las variables CI/CD de gitlab. No pude entender por qué la conexión con el host remoto no funcionó. Miré el sudo journalctl -u docker log en el host, hay un error con el protocolo de enlace. Decidí mirar lo que generalmente se almacena en las variables, para esto puedes ver cat -A $DOCKER_CERT_PATH/key.pem. Se solucionó el error agregando la eliminación del carácter de intercalación tr -d 'r'.

Además, puede agregar tareas posteriores al lanzamiento al script a su discreción. Puedes consultar la versión de trabajo en mi repositorio. https://gitlab.com/isqad/gitlab-ci-cd

Fuente: habr.com

Añadir un comentario