CD beállítása Gitlabon keresztül

Egyszer gondolkodtam azon, hogy automatizáljam a projektem telepítését. A gitlab.com kedvesen megad ehhez minden eszközt, és természetesen úgy döntöttem, kihasználom, kitalálom és megírok egy kis telepítési szkriptet. Ebben a cikkben megosztom tapasztalataimat a közösséggel.

TL, DR

  1. VPS beállítása: a root letiltása, jelszóval való bejelentkezés, a dockerd telepítése, az ufw konfigurálása
  2. Tanúsítványokat generál a szerver és az ügyfél számára docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Dockerd vezérlés engedélyezése tcp socketen keresztül: távolítsa el a -H fd:// opciót a docker konfigurációból.
  3. Regisztrálja a tanúsítványok elérési útját a docker.json fájlban
  4. Regisztráljon a gitlab változókban a CI/CD beállításokban a tanúsítványok tartalmával. Írjon egy .gitlab-ci.yml szkriptet a telepítéshez.

Megmutatom az összes példát a Debian disztribúcióról.

A VPS kezdeti beállítása

Tehát vásárolt egy példányt például a címen DO, az első dolog, amit meg kell tennie, hogy megvédje szerverét az agresszív külvilágtól. Nem bizonyítok és nem állítok semmit, csak megmutatom a virtuális szerverem /var/log/messages naplóját:

screenshotCD beállítása Gitlabon keresztül

Először telepítse az ufw tűzfalat:

apt-get update && apt-get install ufw

Engedélyezzük az alapértelmezett házirendet: minden bejövő kapcsolat letiltása, minden kimenő kapcsolat engedélyezése:

ufw default deny incoming
ufw default allow outgoing

Fontos: ne felejtse el engedélyezni az ssh-n keresztüli kapcsolatot:

ufw allow OpenSSH

Az általános szintaxis a következő: Kapcsolódás engedélyezése portonként: ufw allow 12345, ahol 12345 a portszám vagy a szolgáltatás neve. Deny: ufw deny 12345

Kapcsolja be a tűzfalat:

ufw enable

Kilépünk a munkamenetből, és újra bejelentkezünk ssh-n keresztül.

Adjon hozzá egy felhasználót, rendeljen hozzá egy jelszót, és adja hozzá a sudo csoporthoz.

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

Ezután a terv szerint le kell tiltania a jelszavas bejelentkezést. ehhez másolja az ssh kulcsot a szerverre:

ssh-copy-id [email protected]

A szerver ip-jének a tiédnek kell lennie. Most próbáljon meg bejelentkezni a korábban létrehozott felhasználóval; többé nem kell jelszót megadnia. Ezután a konfigurációs beállításokban módosítsa a következőket:

sudo nano /etc/ssh/sshd_config

jelszavas bejelentkezés letiltása:

PasswordAuthentication no

Indítsa újra az sshd démont:

sudo systemctl reload sshd

Ha Ön vagy valaki más root felhasználóként próbál bejelentkezni, az nem fog működni.

Ezután telepítse a dockerd-t, itt nem írom le a folyamatot, mivel már mindent meg lehet változtatni, kövesse a hivatalos webhelyre mutató hivatkozást, és kövesse a docker virtuális gépre történő telepítésének lépéseit: https://docs.docker.com/install/linux/docker-ce/debian/

Tanúsítványok generálása

A docker démon távoli vezérléséhez titkosított TLS-kapcsolat szükséges. Ehhez rendelkeznie kell egy tanúsítvánnyal és egy kulccsal, amelyeket le kell generálni és át kell vinni a távoli gépre. Kövesse a docker hivatalos webhelyén található utasításokban megadott lépéseket: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl A kiszolgálóhoz létrehozott összes *.pem fájlt, nevezetesen a ca.pem, server.pem, key.pem, a kiszolgáló /etc/docker könyvtárába kell helyezni.

Dockerd beállítása

A docker démon indító szkriptjében eltávolítjuk a -H df:// opciót, ez az opció határozza meg, hogy a docker démon melyik gazdagépen vezérelhető.

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

Ezután hozzon létre egy beállításfájlt, ha még nem létezik, és adja meg a beállításokat:

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

Engedélyezzük a kapcsolatokat a 2376-os porton:

sudo ufw allow 2376

Indítsuk újra a dockert az új beállításokkal:

sudo systemctl daemon-reload && sudo systemctl restart docker

Nézzük meg:

sudo systemctl status docker

Ha minden „zöld”, akkor úgy véljük, hogy sikeresen konfiguráltuk a dockert a szerveren.

Folyamatos kézbesítés beállítása a gitlab-on

Ahhoz, hogy a Gitalaba dolgozó parancsokat tudjon végrehajtani egy távoli Docker-gazdagépen, el kell döntenie, hogyan és hol tárolja a tanúsítványokat és a Dockerddel való titkosított kapcsolat kulcsát. Ezt a problémát úgy oldottam meg, hogy egyszerűen hozzáadtam a következőket a változókhoz a gitlbab beállításaiban:

Spoiler címCD beállítása Gitlabon keresztül

Csak adja ki a tanúsítványok tartalmát és a kulcsot a cat-on keresztül: cat ca.pem. Másolja és illessze be a változó értékekbe.

Írjunk egy szkriptet a GitLabon keresztüli telepítéshez. A docker-in-docker (dind) kép kerül felhasználásra.

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

A telepítési szkript tartalma megjegyzésekkel:

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

A fő probléma az volt, hogy a gitlab CI/CD változóiból normál formában „kihúzzuk” a tanúsítványok tartalmát. Nem tudtam rájönni, miért nem működik a kapcsolat a távoli gazdagéppel. A gazdagépen megnéztem a log sudo journalctl -u dockert, hiba történt a kézfogás közben. Úgy döntöttem, hogy megnézem, mi van általában a változókban tárolva; ehhez a következőképpen nézhet ki: cat -A $DOCKER_CERT_PATH/key.pem. Kiküszöböltem a hibát a tr -d 'r' kocsikarakter eltávolításával.

Ezután saját belátása szerint hozzáadhat kiadás utáni feladatokat a szkripthez. A működő verziót megtekintheti a tárhelyemben https://gitlab.com/isqad/gitlab-ci-cd

Forrás: will.com

Hozzászólás