CD über GitLab einrichten

Ich dachte einmal darüber nach, wie ich die Bereitstellung meines Projekts automatisieren kann. gitlab.com stellt dafür alle nötigen Werkzeuge zur Verfügung, und ich habe mich entschlossen, sie zu nutzen, indem ich mich einarbeitete und ein kleines Bereitstellungsskript schrieb. In diesem Artikel teile ich meine Erfahrungen mit der Community.

TL;DR

  1. VPS einrichten: Root deaktivieren, Passwortanmeldung abschalten, dockerd installieren, ufw konfigurieren
  2. Zertifikate für Server und Client generieren docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktivieren Sie die Verwaltung von dockerd über einen TCP-Socket: Entfernen Sie die Option -H fd:// aus der Docker-Konfiguration.
  3. Прописать пути до сертификатов в docker.json
  4. Fügen Sie die Zertifikat-Inhalte in die GitLab-Variablen in den CI/CD-Einstellungen ein. Schreiben Sie ein .gitlab-ci.yml-Skript für die Bereitstellung.

Alle Beispiele werde ich auf der Distribution Debian zeigen.

Erstkonfiguration des VPS

Sie haben zum Beispiel einen Instance bei DOgekauft. Das erste, was Sie tun müssen, ist, Ihren Server vor der aggressiven Außenwelt zu schützen. Ich werde nichts beweisen oder behaupten, sondern einfach die Protokolldatei /var/log/messages meines virtuellen Servers zeigen:

ScreenshotCD über GitLab einrichten

Als Erstes installieren wir die Firewall ufw:

apt-get update && apt-get install ufw

Wir aktivieren die Standardrichtlinie: Alle eingehenden Verbindungen blockieren, alle ausgehenden Verbindungen erlauben:

ufw default deny incoming
ufw default allow outgoing

Wichtig: Vergessen Sie nicht, die SSH-Verbindung zu erlauben:

ufw allow OpenSSH

Die allgemeine Syntax lautet: Erlauben Sie eine Verbindung über den Port: ufw allow 12345, wobei 12345 die Portnummer oder den Dienstnamen ist. Verbieten: ufw deny 12345

Aktivieren Sie die Firewall:

ufw enable

Verlassen Sie die Sitzung und melden Sie sich erneut über SSH an.

Fügen Sie einen Benutzer hinzu, setzen Sie ein Passwort und fügen Sie ihn zur Gruppe sudo hinzu.

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

Im nächsten Schritt sollten Sie die Anmeldung per Passwort deaktivieren. Kopieren Sie dazu Ihren SSH-Schlüssel auf den Server:

ssh-copy-id root@10.101.10.28

Die IP des Servers sollte Ihre eigene sein. Versuchen Sie nun, sich mit dem zuvor erstellten Benutzer anzumelden, ein Passwort ist nicht mehr erforderlich. Änderungen in der Konfigurationsdatei vornehmen:

sudo nano /etc/ssh/sshd_config

deaktivieren Sie die Anmeldung per Passwort:

PasswordAuthentication no

Starten Sie den SSH-Dienst neu:

sudo systemctl reload sshd

Jetzt wird niemand, auch nicht Sie, sich über den Benutzer root anmelden können.

Installieren Sie nun dockerd; diesen Prozess werde ich nicht näher beschreiben, da sich möglicherweise alles geändert hat. Besuchen Sie die offizielle Webseite und folgen Sie den Schritten zur Installation von Docker auf Ihrer virtuellen Maschine: https://docs.docker.com/install/linux/docker-ce/debian/

Zertifikate generieren

Für die remote Verwaltung des Docker-Daemons ist eine verschlüsselte TLS-Verbindung erforderlich. Dazu benötigen Sie ein Zertifikat und einen Schlüssel, die generiert und auf Ihre entfernte Maschine übertragen werden müssen. Folgen Sie den Anweisungen auf der offiziellen Docker-Website. https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alle generierten *.pem-Dateien für den Server, nämlich ca.pem, server.pem, key.pem, müssen in das Verzeichnis /etc/docker auf dem Server verschoben werden.

Konfiguration von dockerd

Im Startskript des Docker-Daemons entfernen wir die Option -H df://, diese Option gibt an, auf welchem Host der Docker-Daemon verwaltet werden kann.

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

Erstellen Sie eine Konfigurationsdatei, falls diese noch nicht existiert, und fügen Sie die Optionen hinzu:

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

Erlauben Sie Verbindungen über den Port 2376:

sudo ufw allow 2376

Starten Sie dockerd mit den neuen Einstellungen neu:

sudo systemctl daemon-reload && sudo systemctl restart docker

Überprüfen Sie den Status:

sudo systemctl status docker

Wenn alles "grün" ist, haben wir Docker erfolgreich auf dem Server konfiguriert.

Einrichtung der Continuous Delivery auf GitLab

Um einen GitLab-Worker in der Lage zu versetzen, Befehle auf einem Remote-Docker-Host auszuführen, muss man entscheiden, wie und wo man die Zertifikate und den Schlüssel für die verschlüsselte Verbindung mit dockerd speichert. Ich habe dieses Problem gelöst, indem ich die Variablen in den GitLab-Einstellungen festgelegt habe:

SpoilerüberschriftCD über GitLab einrichten

Geben Sie einfach den Inhalt der Zertifikate und des Schlüssels mit cat aus: cat ca.pem. Kopieren und fügen Sie in die Werte der Variablen ein.

Lassen Sie uns ein Skript für die Bereitstellung über GitLab schreiben. Wir werden das docker-in-docker (dind) Image verwenden.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # Ändern Sie den entrypoint, damit es in dind funktioniert
  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 # Bereitstellungsskript hier

Inhalt des Bereitstellungsskripts mit 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

Das Hauptproblem bestand darin, die Inhalte der Zertifikate aus den GitLab CI/CD-Variablen in einem nutzbaren Format "herauszuziehen". Ich konnte nicht nachvollziehen, warum die Verbindung zum Remote-Host nicht funktionierte. Auf dem Host habe ich das Protokoll mit sudo journalctl -u docker überprüft und dort einen Fehler beim Handshake festgestellt. Ich habe mich entschieden, zu prüfen, was überhaupt in den Variablen gespeichert ist. Dazu kann man folgendes verwenden: cat -A $DOCKER_CERT_PATH/key.pem. Ich habe den Fehler behoben, indem ich das Entfernen des Wagenrücklaufzeichens tr -d ‘r’ hinzugefügt habe.

Im nächsten Schritt können Sie nach Belieben Post-Release-Tasks in das Skript einfügen. Die funktionierende Version können Sie in meinem Repository einsehen. https://gitlab.com/isqad/gitlab-ci-cd

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster