Configurar la entrega continua en gitlab.com

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 despu茅s de ordenar y escribir un peque帽o script de implementaci贸n. En este art铆culo, comparto mi experiencia con la comunidad.

TL; DR


  1. Configurar VPS: deshabilitar root, inicio de sesi贸n con contrase帽a, instalar dockerd, configurar ufw
  2. Genere certificados para el servidor y el cliente docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Habilite el control dockerd a trav茅s del socket tcp: elimine la opci贸n -H fd: / / desde la configuraci贸n de Docker.
  3. Registrar rutas de certificados en docker.json
  4. Reg铆strese en variables gitlab en configuraciones CI / CD con contenido de certificado. Escriba un script .gitlab-ci.yml para la implementaci贸n.

Mostrar茅 todos los ejemplos en el kit de distribuci贸n de Debian.

Configuraci贸n inicial de VPS


Entonces, compr贸 una instancia, por ejemplo, en DO , lo primero que debe hacer es proteger su servidor del agresivo mundo exterior. No probar茅 ni reclamar茅 nada, solo mostrar茅 los mensajes log / var / log / de mi servidor virtual:

Captura de pantalla
imagen

Primero, instale el firewall ufw:

apt-get update && apt-get install ufw 

Active 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 ssh:

 ufw allow OpenSSH 

La sintaxis general es: Permitir una conexi贸n de puerto: ufw allow 12345, donde 12345 es el n煤mero de puerto o el nombre del servicio. Negar: ufw negar 12345

Encienda el firewall:

 ufw enable 

Salimos de la sesi贸n e iniciamos sesi贸n nuevamente a trav茅s de ssh.

Agregue al 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 la entrada de contrase帽a. Para hacer esto, copie su clave ssh al servidor:

 ssh-copy-id root@10.101.10.28 

Su servidor ip debe ser especificado. Intente iniciar sesi贸n con el usuario creado anteriormente, ya no necesita ingresar una contrase帽a. A continuaci贸n, en la configuraci贸n, cambie lo siguiente:

 sudo nano /etc/ssh/sshd_config 

desactivar la entrada de contrase帽a:

 PasswordAuthentication no 

Reinicia el demonio sshd:

 sudo systemctl reload sshd 

Ahora, si usted u otra persona intenta iniciar sesi贸n como root, no funcionar谩.

A continuaci贸n, configure 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 administrar el docker daemon de forma remota, se requiere una conexi贸n TLS cifrada. Para hacer esto, debe tener un certificado y una clave, que se deben generar y transferir a su m谩quina remota. Siga los pasos que se dan 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 generados * .pem los archivos para el servidor, a saber, ca.pem, server.pem, key.pem deben colocarse en el directorio / etc / docker en el servidor.

Configuraci贸n de Dockerd


En la secuencia de comandos para iniciar el demonio docker, elimine la opci贸n -H df: //, esta opci贸n responde qu茅 host puede controlar el demonio docker.

 # 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 est谩 all铆, y prescriba opciones:

/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 } 


Habilitemos las conexiones en el puerto 2376:

 sudo ufw allow 2376 

Reinicie dockerd con la nueva configuraci贸n:

 sudo systemctl daemon-reload && sudo systemctl restart docker 

Comprobar:

 sudo systemctl status docker 

Si todo es verde, creemos que hemos configurado con 茅xito la ventana acoplable en el servidor.

Configuraci贸n de deleivery continuo en gitlab


Para que el trabajador de gitalab pueda ejecutar comandos en el host remoto de la ventana acoplable, es necesario determinar c贸mo y d贸nde almacenar los certificados y la clave para una conexi贸n cifrada con dockerd. Resolv铆 este problema simplemente escribi茅ndolo en variables en la configuraci贸n de gitlbab:

Encabezado de spoiler
imagen

Simplemente muestre el contenido de los certificados y la clave a trav茅s de cat: cat ca.pem . Copie y pegue en el valor de las variables.

Escribamos el script para la implementaci贸n a trav茅s de gitlab. Se usar谩 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 "extraer" el contenido de los certificados en forma normal de las variables de gitlab CI / CD. No pod铆a entender por qu茅 la conexi贸n al host remoto no funcionaba. En el host, mir茅 el registro de sudo journalctl -u docker, hay un error de apret贸n de manos. Decid铆 mirar lo que generalmente se almacena en las variables, para esto puede ver cat -A $ DOCKER_CERT_PATH / key.pem. El error se super贸 al agregar la eliminaci贸n del s铆mbolo de carro tr -d '\ r'.

Adem谩s en el script, puede agregar tareas posteriores al lanzamiento a su discreci贸n. Puede ver la versi贸n de trabajo en mi repositorio https://gitlab.com/isqad/gitlab-ci-cd

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


All Articles