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.
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 pantalla
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:
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.
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:
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 spoiler
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).
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