Configuració de CD mitjançant gitlab

Una vegada vaig pensar a automatitzar el desplegament del meu projecte. gitlab.com ofereix amablement totes les eines per a això i, per descomptat, vaig decidir aprofitar-ho, esbrinant-ho i escrivint un petit script de desplegament. En aquest article comparteixo la meva experiència amb la comunitat.

TL; DR

  1. Configura VPS: desactiveu l'arrel, inicieu sessió amb contrasenya, instal·leu dockerd, configureu ufw
  2. Generar certificats per al servidor i el client docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Habiliteu el control dockerd mitjançant el sòcol tcp: elimineu l'opció -H fd:// de la configuració del docker.
  3. Registreu camins als certificats a docker.json
  4. Registreu-vos a les variables de gitlab a la configuració de CI/CD amb el contingut dels certificats. Escriviu un script .gitlab-ci.yml per al desplegament.

Mostraré tots els exemples de la distribució Debian.

Configuració inicial del VPS

Així que heu comprat una instància per exemple a DO, el primer que heu de fer és protegir el vostre servidor del món exterior agressiu. No demostraré ni afirmaré res, només mostraré el registre /var/log/messages del meu servidor virtual:

Captura de pantallaConfiguració de CD mitjançant gitlab

Primer, instal·leu el tallafoc ufw:

apt-get update && apt-get install ufw

Activem la política predeterminada: bloqueja totes les connexions entrants, permet totes les connexions sortints:

ufw default deny incoming
ufw default allow outgoing

Important: no oblideu permetre la connexió mitjançant ssh:

ufw allow OpenSSH

La sintaxi general és la següent: Permetre una connexió per port: ufw allow 12345, on 12345 és el número de port o el nom del servei. Denegar: ufw denegar 12345

Activa el tallafoc:

ufw enable

Sortim de la sessió i tornem a iniciar sessió mitjançant ssh.

Afegiu un usuari, assigneu-li una contrasenya i afegiu-lo al grup sudo.

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

A continuació, segons el pla, hauríeu de desactivar l'inici de sessió amb contrasenya. per fer-ho, copieu la vostra clau ssh al servidor:

ssh-copy-id [email protected]

La ip del servidor ha de ser teva. Ara proveu d'iniciar sessió amb l'usuari que vau crear anteriorment; ja no cal que introduïu una contrasenya. A continuació, a la configuració de configuració, canvieu el següent:

sudo nano /etc/ssh/sshd_config

desactivar l'inici de sessió amb contrasenya:

PasswordAuthentication no

Reinicieu el dimoni sshd:

sudo systemctl reload sshd

Ara, si vostè o algú altre intenteu iniciar sessió com a usuari root, no funcionarà.

A continuació, instal·leu dockerd, no descriuré el procés aquí, ja que ja es pot canviar tot, seguiu l'enllaç al lloc web oficial i seguiu els passos per instal·lar docker a la vostra màquina virtual: https://docs.docker.com/install/linux/docker-ce/debian/

Generació de certificats

Per controlar el dimoni Docker de forma remota, cal una connexió TLS xifrada. Per fer-ho, cal tenir un certificat i una clau, que s'han de generar i transferir a la seva màquina remota. Seguiu els passos que s'indiquen a les instruccions del lloc web oficial de Docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tots els fitxers *.pem generats per al servidor, és a dir, ca.pem, server.pem, key.pem, s'han de col·locar al directori /etc/docker del servidor.

Configuració de dockerd

A l'script de llançament del dimoni docker, eliminem l'opció -H df://, aquesta opció determina en quin host es pot controlar el dimoni docker.

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

A continuació, hauríeu de crear un fitxer de configuració, si encara no existeix, i especificar les opcions:

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

Permetem connexions al port 2376:

sudo ufw allow 2376

Reiniciem dockerd amb la nova configuració:

sudo systemctl daemon-reload && sudo systemctl restart docker

Comprovem:

sudo systemctl status docker

Si tot és "verd", considerem que hem configurat correctament Docker al servidor.

Configuració de l'enviament continu a gitlab

Perquè el treballador de Gitalaba pugui executar ordres en un host Docker remot, cal decidir com i on emmagatzemar els certificats i la clau per a una connexió xifrada amb Dockerd. Vaig resoldre aquest problema simplement afegint el següent a les variables de la configuració de gitlbab:

títol de l'spoilerConfiguració de CD mitjançant gitlab

Només heu de generar el contingut dels certificats i la clau mitjançant cat: cat ca.pem. Copieu i enganxeu als valors de la variable.

Escrivim un script per al desplegament mitjançant GitLab. S'utilitzarà la imatge 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 # скрипт деплоя тут

Contingut de l'script de desplegament amb comentaris:

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 problema principal va ser "treure" el contingut dels certificats de forma normal de les variables CI/CD de gitlab. No he pogut esbrinar per què la connexió amb l'amfitrió remot no funcionava. A l'amfitrió, vaig mirar el registre sudo journalctl -u docker, hi va haver un error durant l'encaixada de mans. Vaig decidir mirar què s'emmagatzema generalment a les variables; per fer-ho, podeu semblar així: cat -A $DOCKER_CERT_PATH/key.pem. Vaig superar l'error afegint l'eliminació del caràcter de carro tr -d 'r'.

A continuació, podeu afegir tasques posteriors al llançament a l'script segons el vostre criteri. Podeu veure la versió de treball al meu repositori https://gitlab.com/isqad/gitlab-ci-cd

Font: www.habr.com

Afegeix comentari