Nastavenie CD cez gitlab

Raz som premýšľal o automatizácii nasadenia môjho projektu. gitlab.com láskavo poskytuje všetky nástroje na to a ja som sa, samozrejme, rozhodol využiť to, prišiel som na to a napísal som malý skript nasadenia. V tomto článku zdieľam svoje skúsenosti s komunitou.

TL; DR

  1. Nastaviť VPS: zakázať root, prihlásiť sa heslom, nainštalovať dockerd, nakonfigurovať ufw
  2. Generujte certifikáty pre server a klienta docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Povoliť ovládanie dockerd cez tcp socket: odstráňte možnosť -H fd:// z konfigurácie dockeru.
  3. Zaregistrujte cesty k certifikátom v docker.json
  4. Zaregistrujte sa v premenných gitlabu v nastaveniach CI/CD s obsahom certifikátov. Napíšte skript .gitlab-ci.yml na nasadenie.

Všetky príklady ukážem na distribúcii Debian.

Počiatočné nastavenie VPS

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

screenshotNastavenie CD cez gitlab

Najprv nainštalujte ufw firewall:

apt-get update && apt-get install ufw

Povoľme predvolenú politiku: blokovať všetky prichádzajúce pripojenia, povoliť všetky odchádzajúce pripojenia:

ufw default deny incoming
ufw default allow outgoing

Dôležité: nezabudnite povoliť pripojenie cez ssh:

ufw allow OpenSSH

Všeobecná syntax je nasledovná: Povoliť pripojenie podľa portu: ufw povoliť 12345, kde 12345 je číslo portu alebo názov služby. Deny: ufw deny 12345

Zapnite firewall:

ufw enable

Ukončíme reláciu a znova sa prihlásime cez ssh.

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

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

Ďalej by ste podľa plánu mali zakázať prihlásenie heslom. Ak to chcete urobiť, skopírujte svoj kľúč ssh na server:

ssh-copy-id [email protected]

IP servera musí byť vaša. Teraz sa pokúste prihlásiť pomocou používateľa, ktorého ste vytvorili predtým; už nemusíte zadávať heslo. Ďalej v nastaveniach konfigurácie zmeňte nasledovné:

sudo nano /etc/ssh/sshd_config

zakázať prihlásenie heslom:

PasswordAuthentication no

Reštartujte démona sshd:

sudo systemctl reload sshd

Ak sa vy alebo niekto iný pokúsite prihlásiť ako root, nebude to fungovať.

Ďalej nainštalujte dockerd, nebudem tu popisovať proces, pretože všetko sa už dá zmeniť, kliknite na odkaz na oficiálnu webovú stránku a prejdite krokmi inštalácie docker na váš virtuálny počítač: https://docs.docker.com/install/linux/docker-ce/debian/

Generovanie certifikátov

Na vzdialené ovládanie démona dockeru je potrebné šifrované pripojenie TLS. Na to potrebujete certifikát a kľúč, ktorý je potrebné vygenerovať a preniesť na váš vzdialený počítač. Postupujte podľa krokov uvedených v pokynoch na oficiálnej webovej stránke docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Všetky vygenerované súbory *.pem pre server, menovite ca.pem, server.pem, key.pem, musia byť umiestnené v adresári /etc/docker na serveri.

Nastavenie dockerd

V skripte spustenia démona docker odstraňujeme možnosť -H df://, táto možnosť určuje, na ktorom hostiteľovi je možné ovládať démona docker.

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

Ďalej by ste mali vytvoriť súbor s nastaveniami, ak ešte neexistuje, a zadať 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
}

Povoľme pripojenia na porte 2376:

sudo ufw allow 2376

Reštartujeme dockerd s novými nastaveniami:

sudo systemctl daemon-reload && sudo systemctl restart docker

Skontrolujme to:

sudo systemctl status docker

Ak je všetko „zelené“, potom sa domnievame, že sme úspešne nakonfigurovali docker na serveri.

Nastavenie nepretržitého doručovania na gitlab

Aby mohol pracovník Gitalaby vykonávať príkazy na vzdialenom hostiteľovi Dockeru, je potrebné rozhodnúť, ako a kde uloží certifikáty a kľúč pre šifrované spojenie s Dockerdom. Tento problém som vyriešil jednoduchým pridaním nasledujúceho do premenných v nastaveniach gitlbab:

Názov spoileruNastavenie CD cez gitlab

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

Poďme napísať skript pre nasadenie cez GitLab. Použije sa obrázok 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 # скрипт деплоя тут

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ým problémom bolo „vytiahnuť“ obsah certifikátov v normálnej forme z premenných gitlab CI/CD. Nevedel som zistiť, prečo nefunguje pripojenie k vzdialenému hostiteľovi. Na hostiteľovi som si pozrel log sudo journalctl -u docker, pri handshake sa vyskytla chyba. Rozhodol som sa pozrieť na to, čo je vo všeobecnosti uložené v premenných; na to môžete vyzerať takto: cat -A $DOCKER_CERT_PATH/key.pem. Chybu som prekonal pridaním odstránenia znaku vozíka tr -d 'r'.

Ďalej môžete do skriptu pridať úlohy po vydaní podľa vlastného uváženia. Pracovnú verziu si môžete pozrieť v mojom úložisku https://gitlab.com/isqad/gitlab-ci-cd

Zdroj: hab.com

Pridať komentár