Nastavení CD přes gitlab

Jednou jsem přemýšlel o automatizaci nasazení mého projektu. gitlab.com laskavě poskytuje všechny nástroje pro toto a samozřejmě jsem se rozhodl je použít tak, že jsem na to přišel a napsal malý skript pro nasazení. V tomto článku sdílím své zkušenosti s komunitou.

TL, DR

  1. Nastavit VPS: zakázat root, přihlášení pomocí hesla, nainstalovat dockerd, nakonfigurovat ufw
  2. Vygenerujte certifikáty pro server a klienta docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Povolit ovládání dockerd přes tcp socket: odeberte možnost -H fd:// z konfigurace dockeru.
  3. Nastavte cesty k certifikátům v docker.json
  4. Zaregistrujte se v proměnných gitlabu v nastavení CI / CD s obsahem certifikátů. Napište skript .gitlab-ci.yml pro nasazení.

Všechny příklady ukážu na distribuci Debian.

Počáteční nastavení VPS

Zde jste si koupili instanci například na DO, první věc, kterou musíte udělat, je chránit váš server před agresivním vnějším světem. Nebudu nic dokazovat ani tvrdit, pouze ukážu /var/log/messages log mého virtuálního serveru:

ScreenshotNastavení CD přes gitlab

Nejprve nainstalujte ufw firewall:

apt-get update && apt-get install ufw

Povolit výchozí zásadu: blokovat všechna příchozí připojení, povolit všechna odchozí připojení:

ufw default deny incoming
ufw default allow outgoing

Důležité: nezapomeňte povolit připojení přes ssh:

ufw allow OpenSSH

Obecná syntaxe je: Allow connection on port: ufw allow 12345, kde 12345 je číslo portu nebo název služby. Deny: ufw deny 12345

Zapněte firewall:

ufw enable

Ukončíme relaci a znovu se přihlásíme přes ssh.

Přidejte uživatele, přidělte mu heslo a přidejte ho do skupiny sudo.

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

Dále byste podle plánu měli zakázat přihlášení pomocí hesla. Chcete-li to provést, zkopírujte svůj klíč ssh na server:

ssh-copy-id [email protected]

IP serveru musí být vaše. Nyní se zkuste přihlásit pod dříve vytvořeným uživatelem, již nemusíte zadávat heslo. Dále v nastavení konfigurace změňte následující:

sudo nano /etc/ssh/sshd_config

zakázat přihlášení pomocí hesla:

PasswordAuthentication no

Restartujte démona sshd:

sudo systemctl reload sshd

Nyní, pokud se vy nebo někdo jiný pokusíte přihlásit jako root, selže.

Dále nainstalujeme dockerd, nebudu zde popisovat proces, protože vše lze již změnit, přejděte na odkaz na oficiální web a projděte si kroky instalace dockeru na váš virtuální počítač: https://docs.docker.com/install/linux/docker-ce/debian/

Generování certifikátu

Chcete-li ovládat démona dockeru vzdáleně, je vyžadováno šifrované připojení TLS. K tomu potřebujete certifikát a klíč, který musíte vygenerovat a přenést na váš vzdálený počítač. Postupujte podle pokynů uvedených v pokynech na oficiálních webových stránkách dockeru: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Všechny vygenerované soubory *.pem pro server, jmenovitě ca.pem, server.pem, key.pem, by měly být umístěny v adresáři /etc/docker na serveru.

nastavení dockeru

Ve spouštěcím skriptu démona dockeru odeberte volbu -H df://, tato volba říká, na kterém hostiteli lze démona dockeru ovládat.

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

Dále vytvořte soubor nastavení, pokud ještě neexistuje, a nastavte 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
}

Povolit připojení na portu 2376:

sudo ufw allow 2376

Restartujte dockerd s novým nastavením:

sudo systemctl daemon-reload && sudo systemctl restart docker

Šek:

sudo systemctl status docker

Pokud je vše zelené, máme za to, že jsme úspěšně nakonfigurovali docker na serveru.

Nastavení nepřetržitého doručování na gitlabu

Aby mohl pracovník gitalabu spouštět příkazy na vzdáleném hostiteli dockeru, musíte se rozhodnout, jak a kam uložíte certifikáty a klíč pro šifrované připojení k dockerd. Tento problém jsem vyřešil jednoduchým zápisem do proměnných v nastavení gitlbab:

spoiler titulekNastavení CD přes gitlab

Stačí vytisknout obsah certifikátů a klíče přes cat: cat ca.pem. Zkopírujte a vložte do hodnot proměnných.

Pojďme napsat skript pro nasazení přes gitlab. Použije se obrázek 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 nasazení s komentáři:

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émem bylo „vytáhnout“ obsah certifikátů v normální podobě z proměnných gitlab CI / CD. Nemohl jsem přijít na to, proč připojení ke vzdálenému hostiteli nefungovalo. Podíval jsem se na protokol sudo journalctl -u docker na hostiteli, došlo k chybě při handshake. Rozhodl jsem se podívat na to, co je obecně uloženo v proměnných, k tomu můžete vidět cat -A $DOCKER_CERT_PATH/key.pem. Chybu překonal přidáním odstranění znaku stříšky tr -d 'r'.

Dále můžete do skriptu přidat úlohy po vydání podle vlastního uvážení. Pracovní verzi si můžete prohlédnout v mém úložišti https://gitlab.com/isqad/gitlab-ci-cd

Zdroj: www.habr.com

Přidat komentář