Configurazione del CD tramite gitlab

Una volta ho pensato di automatizzare la distribuzione del mio progetto. gitlab.com fornisce gentilmente tutti gli strumenti per questo, e ovviamente ho deciso di usarlo capendolo e scrivendo un piccolo script di distribuzione. In questo articolo, condivido la mia esperienza con la comunità.

TL; DR

  1. Configura VPS: disabilita root, accesso con password, installa dockerd, configura ufw
  2. Genera certificati per server e client docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Abilita il controllo dockerd tramite socket tcp: rimuovi l'opzione -H fd:// dalla configurazione docker.
  3. Imposta i percorsi dei certificati in docker.json
  4. Registrati nelle variabili gitlab nelle impostazioni CI/CD con il contenuto dei certificati. Scrivi uno script .gitlab-ci.yml per la distribuzione.

Mostrerò tutti gli esempi sulla distribuzione Debian.

Configurazione iniziale del VPS

Qui hai acquistato un'istanza ad esempio su DO, la prima cosa da fare è proteggere il tuo server dall'aggressivo mondo esterno. Non dimostrerò o affermerò nulla, mostrerò solo il registro /var/log/messages del mio server virtuale:

ScreenshotConfigurazione del CD tramite gitlab

Innanzitutto, installa il firewall ufw:

apt-get update && apt-get install ufw

Abilita il criterio predefinito: blocca tutte le connessioni in entrata, consenti tutte le connessioni in uscita:

ufw default deny incoming
ufw default allow outgoing

Importante: non dimenticare di consentire la connessione tramite ssh:

ufw allow OpenSSH

La sintassi generale è: Consenti connessione sulla porta: ufw consenti 12345, dove 12345 è il numero di porta o il nome del servizio. Nega: ufw nega 12345

Attiva firewall:

ufw enable

Usciamo dalla sessione e accediamo nuovamente tramite ssh.

Aggiungi un utente, assegnagli una password e aggiungilo al gruppo sudo.

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

Successivamente, secondo il piano, dovresti disabilitare l'accesso con password. per fare ciò, copia la tua chiave ssh sul server:

ssh-copy-id [email protected]

L'ip del server deve essere il tuo. Ora prova ad accedere con l'utente creato in precedenza, non è più necessario inserire una password. Successivamente, nelle impostazioni di configurazione, modificare quanto segue:

sudo nano /etc/ssh/sshd_config

disabilita accesso con password:

PasswordAuthentication no

Riavvia il demone sshd:

sudo systemctl reload sshd

Ora se tu o qualcun altro provate ad accedere come root, fallirà.

Successivamente, installiamo dockerd, non descriverò qui il processo, poiché tutto può già essere modificato, segui il collegamento al sito Web ufficiale e segui i passaggi per l'installazione di docker sulla tua macchina virtuale: https://docs.docker.com/install/linux/docker-ce/debian/

Generazione del certificato

Per controllare il demone docker da remoto, è necessaria una connessione TLS crittografata. Per fare ciò, è necessario disporre di un certificato e di una chiave da generare e trasferire sul computer remoto. Segui i passaggi indicati nelle istruzioni sul sito web ufficiale di docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tutti i file *.pem generati per il server, vale a dire ca.pem, server.pem, key.pem, devono essere inseriti nella directory /etc/docker sul server.

configurazione della finestra mobile

Nello script di avvio del daemon docker, rimuovere l'opzione -H df://, questa opzione indica su quale host può essere controllato il daemon docker.

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

Successivamente, crea un file delle impostazioni se non esiste già e imposta le opzioni:

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

Consenti connessioni sulla porta 2376:

sudo ufw allow 2376

Riavvia dockerd con nuove impostazioni:

sudo systemctl daemon-reload && sudo systemctl restart docker

Dai un'occhiata:

sudo systemctl status docker

Se tutto è verde, consideriamo di aver configurato correttamente la finestra mobile sul server.

Impostazione della consegna continua su gitlab

Affinché il lavoratore gitalab sia in grado di eseguire comandi su un host docker remoto, è necessario decidere come e dove archiviare i certificati e una chiave per una connessione crittografata a dockerd. Ho risolto questo problema semplicemente scrivendo alle variabili nelle impostazioni di gitlbab:

titolo spoilerConfigurazione del CD tramite gitlab

Basta emettere il contenuto dei certificati e della chiave tramite cat: cat ca.pem. Copia e incolla nei valori delle variabili.

Scriviamo uno script per la distribuzione tramite gitlab. Verrà utilizzata l'immagine 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 # скрипт деплоя тут

Il contenuto dello script di distribuzione con i commenti:

bin/distribuire.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

Il problema principale era quello di "tirare fuori" il contenuto dei certificati nella forma normale dalle variabili CI/CD di gitlab. Non riuscivo a capire perché la connessione all'host remoto non funzionasse. Ho guardato il sudo journalctl -u docker log sull'host, c'è un errore con l'handshake. Ho deciso di guardare cosa è generalmente memorizzato nelle variabili, per questo puoi vedere cat -A $DOCKER_CERT_PATH/key.pem. L'errore è stato risolto aggiungendo la rimozione del carattere di accento circonflesso tr -d 'r'.

Inoltre, puoi aggiungere attività post-rilascio allo script a tua discrezione. Puoi controllare la versione funzionante nel mio repository https://gitlab.com/isqad/gitlab-ci-cd

Fonte: habr.com

Aggiungi un commento