Configurazione di CD via gitlab

Una volta aghju pensatu à automatizà a implementazione di u mo prughjettu. gitlab.com furnisce gentilmente tutti l'arnesi per questu, è di sicuru aghju decisu di prufittà di questu, scuprite è scrive un picculu script di implementazione. In questu articulu, sparte a mo sperienza cù a cumunità.

TL; DR

  1. Configurate VPS: disattivate a root, accede cù password, installate dockerd, cunfigurà ufw
  2. Generate certificati per u servitore è u cliente docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Abilita u cuntrollu di dockerd via tcp socket: sguassate l'opzione -H fd:// da a cunfigurazione docker.
  3. Registrate i percorsi per i certificati in docker.json
  4. Registrate in variabili gitlab in i paràmetri CI/CD cù u cuntenutu di i certificati. Scrivite un script .gitlab-ci.yml per a implementazione.

Mostraraghju tutti l'esempii nantu à a distribuzione Debian.

Configurazione iniziale di VPS

Allora avete compru un esempiu per esempiu à DO, U primu cosa chì avete bisognu di fà hè di prutezzione di u vostru servitore da u mondu aggressivu fora. Ùn pruveraghju micca nè affirmaraghju nunda, vi mustraraghju solu u log /var/log/messages di u mo servitore virtuale:

ScreenshotConfigurazione di CD via gitlab

Prima, installate u firewall ufw:

apt-get update && apt-get install ufw

Abilitemu a pulitica predeterminata: bluccà tutte e cunnessione entranti, permette tutte e cunnessione in uscita:

ufw default deny incoming
ufw default allow outgoing

Impurtante: ùn vi scurdate di permette a cunnessione via ssh:

ufw allow OpenSSH

A sintassi generale hè a siguenti: Permette una cunnessione per portu: ufw allow 12345, induve 12345 hè u numeru di portu o u nome di u serviziu. Nega: ufw deny 12345

Accende u firewall:

ufw enable

Esce da a sessione è accede di novu via ssh.

Aghjunghjite un utilizatore, assignalu una password, è aghjunghje à u gruppu sudo.

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

Dopu, secondu u pianu, duvete disattivà u login di password. per fà questu, copiate a vostra chjave ssh à u servitore:

ssh-copy-id [email protected]

L'ip di u servitore deve esse u vostru. Avà pruvate à accede cù l'utilizatore chì avete creatu prima; ùn avete più bisognu di inserisce una password. Dopu, in i paràmetri di cunfigurazione, cambia i seguenti:

sudo nano /etc/ssh/sshd_config

disattivà u login di password:

PasswordAuthentication no

Riavvia u daemon sshd:

sudo systemctl reload sshd

Avà s'è tù o qualcunu altru prova à login cum'è l'utilizatore root, ùn hà micca travagliatu.

In seguitu, installate dockerd, ùn descriveraghju micca u prucessu quì, postu chì tuttu pò esse cambiatu, seguite u ligame à u situ ufficiale è seguite i passi di stallà docker in a vostra macchina virtuale: https://docs.docker.com/install/linux/docker-ce/debian/

Generazione di certificati

Per cuntrullà u daemon docker remotamente, una cunnessione TLS criptata hè necessaria. Per fà questu, avete bisognu di avè un certificatu è una chjave, chì deve esse generata è trasferita à a vostra macchina remota. Segui i passi indicati in l'istruzzioni nantu à u situ web ufficiale di docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tutti i schedarii *.pem generati per u servitore, vale à dì ca.pem, server.pem, key.pem, deve esse posti in u /etc/docker directory in u servitore.

Configurazione di dockerd

In u script di lanciamentu di docker daemon, sguassate l'opzione -H df://, sta opzione determina nantu à quale host u daemon docker pò esse cuntrullatu.

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

Dopu, duvete creà un schedariu di paràmetri, s'ellu ùn esiste micca, è specificà l'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
}

Permettemu e cunnessione à u portu 2376:

sudo ufw allow 2376

Riavvia dockerd cù e novi paràmetri:

sudo systemctl daemon-reload && sudo systemctl restart docker

Cuntrollamu:

sudo systemctl status docker

Se tuttu hè "verde", allora cunsideremu chì avemu cunfiguratu bè docker in u servitore.

Configurazione di a spedizione cuntinuu nantu à gitlab

Per u travagliu di Gitalaba per esse capace di eseguisce cumandamenti in un host Docker remoto, hè necessariu di decide cumu è induve guardà i certificati è a chjave per una cunnessione criptata cù Dockerd. Aghju risoltu stu prublema aghjustendu i seguenti à e variàbili in i paràmetri di gitlbab:

titre spoilerConfigurazione di CD via gitlab

Basta à fà u cuntenutu di i certificati è chjave via cat: cat ca.pem. Copia è incollà in i valori variabili.

Scrivemu un script per a implementazione via GitLab. L'imagine docker-in-docker (dind) serà usata.

.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 # скрипт деплоя тут

Cuntenutu di u script di implementazione cù cumenti:

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

U prublema principali era di "tirà" u cuntenutu di i certificati in una forma normale da e variabili gitlab CI / CD. Ùn aghju micca pussutu capisce perchè a cunnessione à l'ospitu remota ùn era micca travagliatu. Nantu à l'ospitu aghju guardatu u log sudo journalctl -u docker, ci hè statu un errore durante a stretta di mano. Aghju decisu di vede ciò chì hè generalmente almacenatu in variàbili; per fà questu, pudete vede cusì: cat -A $DOCKER_CERT_PATH/key.pem. Aghju superatu l'errore aghjunghjendu a rimuzione di u caratteru di carru tr -d 'r'.

In seguitu, pudete aghjunghje i travaglii post-liberazione à u script à a vostra discrezione. Pudete vede a versione di travagliu in u mo repository https://gitlab.com/isqad/gitlab-ci-cd

Source: www.habr.com

Add a comment