CD opsetzen iwwer gitlab

Ech hunn emol geduecht fir den Ofbau vu mengem Projet ze automatiséieren. gitlab.com bitt frëndlech all Tools fir dëst, an natierlech hunn ech decidéiert dovunner ze profitéieren, erauszefannen an e klengen Deployment Skript ze schreiwen. An dësem Artikel deelen ech meng Erfahrung mat der Gemeinschaft.

TL; DR

  1. VPS opsetzen: root auszeschalten, aloggen mat Passwuert, Dockerd installéieren, ufw konfiguréieren
  2. Generéiere Certificaten fir Server a Client docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktivéiert Dockerd Kontroll iwwer tcp Socket: läscht d'Optioun -H fd: // aus der Docker Config.
  3. Registréiert Weeër fir Certificaten an docker.json
  4. Registréiert Iech a gitlab Variablen an den CI / CD Astellunge mam Inhalt vun den Certificaten. Schreift e Skript .gitlab-ci.yml fir den Asaz.

Ech weisen all Beispiller op der Debian Verdeelung.

Éischt VPS Setup

Also hutt Dir eng Instanz zum Beispill bei DO, dat éischt wat Dir maache musst ass Äre Server virun der aggressiver Äussewelt ze schützen. Ech wäert näischt beweisen oder behaapten, ech weisen just de Log /var/log/Message vu mengem virtuelle Server:

ScreenshotCD opsetzen iwwer gitlab

Als éischt, installéiert d'ufw Firewall:

apt-get update && apt-get install ufw

Loosst eis d'Standardpolitik aktivéieren: blockéiert all erakommen Verbindungen, erlaabt all erausginn Verbindungen:

ufw default deny incoming
ufw default allow outgoing

Wichteg: Vergiesst net d'Verbindung iwwer ssh z'erméiglechen:

ufw allow OpenSSH

Déi allgemeng Syntax ass wéi follegt: Erlaabt eng Verbindung duerch Port: ufw erlaben 12345, wou 12345 d'Portnummer oder den Numm vum Service ass. Deny: ufw deny 12345

Maacht d'Firewall un:

ufw enable

Mir verloossen d'Sessioun an aloggen erëm iwwer ssh.

Füügt e Benotzer un, gitt him e Passwuert a füügt hien an d'Sudo-Grupp.

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

Als nächst, no dem Plang, sollt Dir de Passwuert Login deaktivéieren. Fir dëst ze maachen, kopéiert Ären ssh Schlëssel op de Server:

ssh-copy-id [email protected]

De Server IP muss ären sinn. Probéiert elo aloggen mat dem Benotzer deen Dir virdru erstallt hutt; Dir musst net méi e Passwuert aginn. Als nächst, an de Konfiguratiounsastellungen, ännert déi folgend:

sudo nano /etc/ssh/sshd_config

Passwuert Login auszeschalten:

PasswordAuthentication no

Restart den sshd Daemon:

sudo systemctl reload sshd

Elo wann Dir oder een aneren probéiert Iech als Root Benotzer unzemellen, funktionnéiert et net.

Als nächst, installéiert Dockerd, ech wäert de Prozess net hei beschreiwen, well alles ka scho geännert ginn, befollegt de Link op déi offiziell Websäit a gitt duerch d'Schrëtt fir Docker op Ärer virtueller Maschinn z'installéieren: https://docs.docker.com/install/linux/docker-ce/debian/

Generéiere Certificaten

Fir den Docker Daemon op afstand ze kontrolléieren, ass eng verschlësselte TLS Verbindung erfuerderlech. Fir dëst ze maachen, musst Dir e Certificat an e Schlëssel hunn, dee muss generéiert an op Är Fernmaschinn transferéiert ginn. Follegt d'Schrëtt an den Instruktiounen op der offizieller Docker Websäit: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl All generéiert *.pem Dateie fir de Server, nämlech ca.pem, server.pem, key.pem, mussen am /etc/docker Verzeichnis um Server gesat ginn.

Ariichten dockerd

Am Docker Daemon Start Skript, hu mir d'Optioun -H df:// ewechgeholl, dës Optioun bestëmmt op wéi engem Host den Docker Daemon kontrolléiert ka ginn.

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

Als nächst sollt Dir eng Astellungsdatei erstellen, wann et net scho gëtt, an d'Optiounen spezifizéieren:

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

Loosst eis Verbindungen um Hafen 2376 erlaben:

sudo ufw allow 2376

Loosst eis Dockerd mat den neien Astellungen nei starten:

sudo systemctl daemon-reload && sudo systemctl restart docker

Loosst eis kucken:

sudo systemctl status docker

Wann alles "gréng" ass, betruechte mir datt mir den Docker op de Server erfollegräich konfiguréiert hunn.

Kontinuéierlech Liwwerung op gitlab opsetzen

Fir datt de Gitalaba Aarbechter fäeg ass Kommandoen op engem Remote Docker Host auszeféieren, ass et néideg ze entscheeden wéi a wou d'Zertifikater an de Schlëssel fir eng verschlësselte Verbindung mat Dockerd späicheren. Ech hunn dëse Problem geléist andeems Dir einfach déi folgend Variabelen an de gitlbab Astellunge bäigefüügt:

Spoiler TitelCD opsetzen iwwer gitlab

Gitt just den Inhalt vun den Certificaten a Schlëssel iwwer Kaz eraus: cat ca.pem. Kopéiert a paste an d'Variabel Wäerter.

Loosst eis e Skript schreiwen fir z'installéieren iwwer GitLab. D'Docker-in-Docker (dind) Bild gëtt benotzt.

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

Inhalter vum Deployment Skript mat Kommentaren:

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

Den Haaptproblem war den Inhalt vun den Certificaten an enger normaler Form vun de gitlab CI / CD Variablen ze "zéien". Ech konnt net erausfannen firwat d'Verbindung mam Fernhost net funktionnéiert. Am Host hunn ech de Log sudo journalctl -u docker gekuckt, et gouf e Feeler beim Handshake. Ech hu beschloss ze kucken wat allgemeng a Variablen gespäichert ass; Fir dëst ze maachen, kënnt Dir esou ausgesinn: cat -A $DOCKER_CERT_PATH/key.pem. Ech hunn de Feeler iwwerwonne andeems ech d'Entfernung vum Kutsche Charakter tr -d 'r' derbäigesat hunn.

Als nächst kënnt Dir Post-Release Aufgaben un de Skript no Ärem Diskretioun addéieren. Dir kënnt d'Aarbechtsversioun a mengem Repository kucken https://gitlab.com/isqad/gitlab-ci-cd

Source: will.com

Setzt e Commentaire