Nastavenie CD cez gitlab

Razmýšľal som raz o automatizácii nasadenia svojho projektu. gitlab.com poskytuje všetky nástroje na to, a samozrejme som sa rozhodol využiť to, podrobne som si to pozrel a napísal malý skript na nasadenie. V článku zdieľam svoje skúsenosti s komunitou.

TL;DR

  1. Nastaviť VPS: vypnúť root, prihlásenie cez heslo, nainštalovať dockerd, nastaviť ufw
  2. Vygenerovať certifikáty pre server a klienta docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Povoliť správu dockerd cez tcp socket: odstrániť voľbu -H fd:// z konfigurácie dockera.
  3. Прописать пути до сертификатов в docker.json
  4. Zaznamenať do premenných gitlab v nastaveniach CI/CD obsah certifikátov. Napísať skript .gitlab-ci.yml pre nasadenie.

Všetky príklady budem ukazovať na distribúcii Debian.

Počiatočné nastavenie VPS

Takže ste si kúpili inštanciu napríklad na DO, prvé, čo musíte urobiť, je chrániť svoj server pred agresívnym vonkajším svetom. Nebudem nič dokazovať ani tvrdiť, len ukážem log /var/log/messages svojho virtuálneho servera:

ScreenshotNastavenie CD cez gitlab

Po prvé, nainštalujme firewall ufw:

apt-get update && apt-get install ufw

Povolíme predvolenú politiku: blokujeme všetky prichádzajúce spojenia, povoľujeme všetky odchádzajúce spojenia:

ufw default deny incoming
ufw default allow outgoing

Dôležité: nezabudneme povoliť spojenie cez ssh:

ufw allow OpenSSH

Všeobecná syntax je takáto: Povoľte spojenie cez port: ufw allow 12345, kde 12345 je číslo portu alebo názov služby. Zakázať: ufw deny 12345

Povoľujeme firewall:

ufw enable

Odhlásime sa zo session a znovu sa prihlásime cez ssh.

Pridajte používateľa, priradte mu heslo a pridajte ho do skupiny sudo.

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

Ďalej v pláne nasleduje vypnúť prihlásenie cez heslo. Na to skopírujte svoj ssh-kľúč na server:

ssh-copy-id root@10.101.10.28

ip servera by mal byť váš. Teraz skúste prihlásiť pod práve vytvoreným používateľom, heslo už nie je potrebné. Potom v nastaveniach konfigurácie zmeňte nasledovné:

sudo nano /etc/ssh/sshd_config

vypneme prihlásenie cez heslo:

PasswordAuthentication no

Reštartujeme daemon sshd:

sudo systemctl reload sshd

Teraz, ak sa pokúsite vy alebo niekto iný prihlásiť cez používateľa root, nič mu nevyjde.

Ďalej nainštalujeme dockerd, tu už nebudem opisovať proces, pretože sa mohol už zmeniť, choďte na oficiálnu stránku a prejdite krokmi inštalácie docker na vašej virtuálke: https://docs.docker.com/install/linux/docker-ce/debian/

Generovanie certifikátov

Na to, aby ste mohli na diaľku spravovať démon dockera, potrebujete šifrované TLS spojenie. K tomu je potrebné mať certifikát a kľúč, ktoré je potrebné vygenerovať a preniesť na váš vzdialený stroj. Postupujte podľa krokov uvedených v dokumentácii na oficiálnej stránke dockera: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Všetky vygenerované súbory *.pem pre server, konkrétne ca.pem, server.pem, key.pem, je potrebné umiestniť do adresára /etc/docker na serveri.

Nastavenie dockerd

V spúšťacom skripte démona dockera odstráňte možnosť -H df://, táto možnosť určuje, na ktorom hostiteľovi je možné spravovať démona dockera.

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

Následne je potrebné vytvoriť konfiguračný súbor, ak ešte neexistuje, a zapísať možnosti:

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

Povolíme pripojenia na porte 2376:

sudo ufw allow 2376

Reštartujeme dockerd s novými nastaveniami:

sudo systemctl daemon-reload && sudo systemctl restart docker

Skontrolujeme:

sudo systemctl status docker

Ak je všetko „zelené“, považujeme to za úspešné nastavenie dockera na serveri.

Nastavenie kontinuálneho dodávania na gitlabe

Aby mohol pracovník gitlabu vykonávať príkazy na vzdialenom hoste dockera, je potrebné určiť, ako a kde uchovávať certifikáty a kľúč pre šifrované spojenie s dockerd. Problém som vyriešil jednoducho tak, že som ich zapísal do premenných v nastaveniach gitlabu:

Názov spoileruNastavenie CD cez gitlab

Jednoducho výstupujte obsah certifikátov a kľúča cez cat: cat ca.pem. Skopírujte a vložte do hodnôt premenných.

Napíšeme skript na nasadenie cez gitlab. Používaný bude obraz docker-in-docker (dind).

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # prepíšeme entrypoint, aby fungoval v 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 # skript nasadenia tu

Obsah skriptu nasadenia s komentármi:

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

Hlavný problém bol v tom, aby som „vytiahol“ z premenných gitlab CI/CD obsah certifikátov v normálnej forme. Nevedel som pochopiť, prečo nefungovalo spojenie s vzdialeným hostiteľom. Na hostiteľovi som skontroloval denník sudo journalctl -u docker, tam bola chyba pri handshake. Rozhodol som sa pozrieť, čo sa vlastne nachádza v premenných, na to sa dá pozrieť takto cat -A $DOCKER_CERT_PATH/key.pem. Chybu som odstránil pridaním odstránenia znaku návratu tr -d ‘r’.

Ďalej do skriptu môžete pridať post-release úlohy podľa vlastného uváženia. Aktuálnu verziu si môžete pozrieť v mojom repozitári https://gitlab.com/isqad/gitlab-ci-cd

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster