Nastavení CD přes gitlab

Jednou jsem přemýšlel o automatizaci nasazení svého projektu. gitlab.com laskavě poskytuje všechny potřebné nástroje, a samozřejmě jsem se rozhodl využít, podíval jsem se na to a napsal malý skript pro nasazení. V tomto článku se s vámi podělím o své zkušenosti.

TL;DR

  1. Nastavení VPS: zakázat root, přístup přes heslo, nainstalovat dockerd, nastavit ufw
  2. Vygenerovat certifikáty pro server a klienta docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Povolit správu dockerd přes TCP socket: odstranit volbu -H fd:// z konfiguračního souboru Dockeru.
  3. Прописать пути до сертификатов в docker.json
  4. Zapsat do proměnných gitlab v nastavení CI/CD obsah certifikátů. Napsat skript .gitlab-ci.yml pro nasazení.

Všechny příklady budu ukazovat na distribuci Debian.

Počáteční nastavení VPS

Takže jste zakoupili instanci například na DO, první věcí, kterou je třeba udělat, je ochránit váš server před agresivním vnějším světem. Nechci nic tvrdit nebo dokazovat, jen ukážu log /var/log/messages svého virtuálního serveru:

Snímek obrazovkyNastavení CD přes gitlab

Nejprve nainstalujeme firewall ufw:

apt-get update && apt-get install ufw

Nastavíme výchozí politiku: blokujeme veškeré příchozí spojení, povolujeme veškerá odchozí spojení:

ufw default deny incoming
ufw default allow outgoing

Důležité: nezapomeňte povolit SSH spojení:

ufw allow OpenSSH

Obecná syntaxe je následující: povolit spojení na portu: ufw allow 12345, kde 12345 je číslo portu nebo název služby. Zakázat: ufw deny 12345

Povolujeme firewall:

ufw enable

Odhlaste se ze session a znovu se přihlaste přes SSH.

Přidejte uživatele, přiřaďte mu heslo a přidejte ho do skupiny sudo.

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

Dalším krokem je zakázat přihlašování pomocí hesla. K tomu zkopírujte svůj SSH klíč na server:

ssh-copy-id root@10.101.10.28

IP adresu serveru uveďte svou. Nyní se zkuste přihlásit pod dříve vytvořeným uživatelským účtem, heslo již zadávat nemusíte. Následně v konfiguračním souboru změníme následující:

sudo nano /etc/ssh/sshd_config

zakážeme přihlašování pomocí hesla:

PasswordAuthentication no

Restartujeme démon sshd:

sudo systemctl reload sshd

Nyní, pokud se pokusíte přihlásit uživatelským účtem root, nic se vám nepovede.

Nyní nainstalujeme dockerd, tento proces už popisovat nebudu, protože se to může už změnit, běžte na odkaz na oficiální stránku a projděte kroky instalace dockeru na vaší virtuální mašině: https://docs.docker.com/install/linux/docker-ce/debian/

Generování certifikátů

Pro vzdálené řízení Docker démona je potřeba šifrované TLS spojení. K tomu je nutné mít certifikát a klíč, které je třeba vygenerovat a přenést na vaši vzdálenou mašinu. Postupujte podle kroků uvedených v dokumentaci na oficiálním webu Docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Všechny vygenerované *.pem soubory pro server, konkrétně ca.pem, server.pem, key.pem, je třeba umístit do adresáře /etc/docker na serveru.

Nastavení dockerd

V spouštěcím skriptu Docker démona odstraňte možnost -H df://, tato možnost určuje, na kterém hostiteli je možné řídit Docker démona.

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

Dále je třeba vytvořit konfigurační soubor, pokud ještě neexistuje, a zapsat do něj 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 připojení na portu 2376:

sudo ufw allow 2376

Znovu spustíme dockerd s novými nastaveními:

sudo systemctl daemon-reload && sudo systemctl restart docker

Zkontrolujeme:

sudo systemctl status docker

Pokud je vše „zelené“, předpokládáme, že jsme úspěšně nastavili docker na serveru.

Nastavení continuous delivery na GitLab

Aby worker na GitLab mohl vykonávat příkazy na vzdáleném hostiteli Dockeru, je třeba určit, jak a kde uchovávat certifikáty a klíč pro šifrované spojení s dockerd. Tento problém jsem vyřešil jednoduše tím, že jsem je zapsal do proměnných v nastavení GitLabu:

Název spoileruNastavení CD přes gitlab

Jednoduše vylistujte obsah certifikátů a klíče pomocí příkazu cat: cat ca.pem, zkopírujte a vložte do hodnot proměnných.

Nyní vytvoříme skript pro nasazení přes GitLab. Budeme používat obraz Docker-in-Docker (dind).

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # přepíšeme entrypoint pro fungování 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 nasazení zde

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 „vytažení“ obsahu certifikátů z proměnných GitLab CI/CD ve správném formátu. Nemohl jsem pochopit, proč nefungovalo spojení se vzdáleným hostem. Na hostitelském systému jsem zkontroloval protokol pomocí sudo journalctl -u docker, tam byla chyba při handshake. Podíval jsem se, co je vlastně uloženo v proměnných, takto to lze zkontrolovat cat -A $DOCKER_CERT_PATH/key.pem. Chybu jsem vyřešil odstraněním znaku návratu tr -d ‘r’.

Dále do scénáře můžete přidat post-release úkoly podle svého uvážení. Pracovní verzi si můžete prohlédnout v mém repozitáři https://gitlab.com/isqad/gitlab-ci-cd

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster