Konfigurieren der kontinuierlichen Lieferung auf gitlab.com

Einmal dachte ich darüber nach, die Bereitstellung meines Projekts zu automatisieren. gitlab.com stellt freundlicherweise alle Tools dafür zur Verfügung, und natürlich habe ich mich dazu entschlossen, ein kleines Bereitstellungsskript zu sortieren und zu schreiben. In diesem Artikel teile ich meine Erfahrungen mit der Community.

TL; DR


  1. VPS konfigurieren: root deaktivieren, Passwort anmelden, dockerd installieren, ufw konfigurieren
  2. Generieren Sie Zertifikate für Server- und Client- Dokumente. Docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktivieren Sie die Dockerd- Steuerung über den TCP-Socket: Entfernen Sie die Option -H fd: / / von Docker-Konfiguration.
  3. Registrieren Sie Zertifikatspfade in docker.json
  4. Registrieren Sie sich in gitlab-Variablen in CI / CD-Einstellungen mit Zertifikatinhalten. Schreiben Sie ein Skript .gitlab-ci.yml für die Bereitstellung.

Ich werde alle Beispiele auf dem Debian-Distributionskit zeigen.

Erstes VPS-Setup


Sie haben beispielsweise eine Instanz bei DO gekauft . Als Erstes müssen Sie Ihren Server vor der aggressiven Außenwelt schützen. Ich werde nichts beweisen und beanspruchen, sondern nur das Protokoll / var / log / messages meines virtuellen Servers anzeigen:

Screenshot
Bild

Installieren Sie zunächst die ufw-Firewall:

apt-get update && apt-get install ufw 

Aktivieren Sie die Standardrichtlinie: Blockieren Sie alle eingehenden Verbindungen, lassen Sie alle ausgehenden Verbindungen zu:

 ufw default deny incoming ufw default allow outgoing 

Wichtig: Vergessen Sie nicht, die SSH-Verbindung zuzulassen:

 ufw allow OpenSSH 

Die allgemeine Syntax lautet: Zulassen einer Portverbindung: ufw allow 12345, wobei 12345 die Portnummer oder der Name des Dienstes ist. Verweigern: ufw leugnen 12345

Schalten Sie die Firewall ein:

 ufw enable 

Wir verlassen die Sitzung und melden uns erneut über ssh an.

Fügen Sie den Benutzer hinzu, weisen Sie ihm ein Passwort zu und fügen Sie ihn der Sudo-Gruppe hinzu.

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

Als nächstes müssen Sie gemäß Plan die Passworteingabe deaktivieren. Kopieren Sie dazu Ihren SSH-Schlüssel auf den Server:

 ssh-copy-id root@10.101.10.28 

Ihre Server-IP muss angegeben werden. Versuchen Sie jetzt, sich unter dem zuvor erstellten Benutzer anzumelden. Sie müssen kein Passwort mehr eingeben. Ändern Sie als Nächstes in den Konfigurationseinstellungen Folgendes:

 sudo nano /etc/ssh/sshd_config 

Passworteingabe deaktivieren:

 PasswordAuthentication no 

Starten Sie den sshd-Daemon neu:

 sudo systemctl reload sshd 

Wenn Sie oder eine andere Person versuchen, sich als Root anzumelden, funktioniert dies nicht.

Als nächstes setzen Sie dockerd. Ich werde den Vorgang hier nicht beschreiben, da bereits alles geändert werden kann. Folgen Sie dem Link zur offiziellen Website und führen Sie die Schritte zur Installation von docker auf Ihrer virtuellen Maschine aus: https://docs.docker.com/install/linux/docker- ce / debian /

Zertifikatserstellung


Um den Docker-Daemon remote verwalten zu können, ist eine verschlüsselte TLS-Verbindung erforderlich. Dazu benötigen Sie ein Zertifikat und einen Schlüssel, die generiert und auf Ihren Remotecomputer übertragen werden müssen. Befolgen Sie die Schritte in den Anweisungen auf der offiziellen Docker-Website: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alle generiert * .pem Dateien für den Server, nämlich ca.pem, server.pem, key.pem, müssen im Verzeichnis / etc / docker auf dem Server abgelegt werden.

Dockerd-Setup


Entfernen Sie im Skript zum Starten des Docker-Dämons die Option -H df: //. Diese Option antwortet, welcher Host den Docker-Dämon steuern kann.

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

Erstellen Sie als Nächstes eine Einstellungsdatei, falls diese noch nicht vorhanden ist, und schreiben Sie Optionen vor:

/etc/docker/daemon.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 } 


Aktivieren Sie die Verbindungen an 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:

 sudo systemctl status docker 

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

Konfigurieren der kontinuierlichen Zustellung auf Gitlab


Damit der Gitalab-Worker Befehle auf dem Docker-Remote-Host ausführen kann, muss festgelegt werden, wie und wo Zertifikate und der Schlüssel für eine verschlüsselte Verbindung mit Dockerd gespeichert werden sollen. Ich habe dieses Problem gelöst, indem ich es einfach in Variablen in den gitlbab-Einstellungen geschrieben habe:

Spoiler Überschrift
Bild

Zeigen Sie einfach den Inhalt der Zertifikate und des Schlüssels über cat: cat ca.pem . Kopieren Sie den Wert der Variablen und fügen Sie ihn ein.

Schreiben wir das Skript für die Bereitstellung über gitlab. Das Docker-in-Docker-Bild (dind) wird verwendet.

.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 #    


Der 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, den Inhalt von Zertifikaten in normaler Form aus gitlab CI / CD-Variablen zu „extrahieren“. Ich konnte nicht verstehen, warum die Verbindung zum Remote-Host nicht funktionierte. Auf dem Host habe ich mir das Docker-Protokoll sudo journalctl -u angesehen, es liegt ein Handshake-Fehler vor. Ich habe mich entschlossen, mir anzusehen, was im Allgemeinen in Variablen gespeichert ist. Dazu sehen Sie cat -A $ DOCKER_CERT_PATH / key.pem. Der Fehler wurde behoben, indem das Wagensymbol tr -d '\ r' entfernt wurde.

Weiter im Skript können Sie nach eigenem Ermessen Aufgaben nach der Veröffentlichung hinzufügen. Sie können die Arbeitsversion in meinem Repository https://gitlab.com/isqad/gitlab-ci-cd sehen

Source: https://habr.com/ru/post/de449952/


All Articles