CI / CD-Verkettung und Docker-Automatisierung

Ich habe meine ersten Seiten Ende der 90er Jahre geschrieben. Dann war es sehr einfach, sie in einen funktionierenden Zustand zu bringen. Auf einem gemeinsam genutzten Hosting gab es einen Apache-Server. Sie konnten sich über FTP bei diesem Server anmelden und so etwas in die Browserzeile schreiben ftp://ftp.example.com. Dann war es notwendig, einen Namen und ein Passwort einzugeben und Dateien auf den Server hochzuladen. Es gab andere Zeiten, damals war alles einfacher als heute. In den letzten zwei Jahrzehnten hat sich viel verändert. Die Standorte sind komplexer geworden und müssen vor der Freigabe in die Produktion zusammengebaut werden. Ein einzelner Server ist zu einer Vielzahl von Servern geworden, die hinter Load Balancern arbeiten, und die Verwendung von Versionskontrollsystemen ist an der Tagesordnung.





Für mein persönliches Projekt hatte ich eine spezielle Konfiguration. Und ich wusste, dass ich die Fähigkeit brauchte, eine Site in der Produktion bereitzustellen und nur eine Aktion auszuführen: Code in einen Zweig masterauf GitHub schreiben . Außerdem wusste ich, dass ich zur Sicherstellung des Betriebs meiner kleinen Webanwendung keinen großen Kubernetes-Cluster verwalten, keine Docker Swarm-Technologie verwenden oder einen Serverpark mit Pods, Agenten und allen möglichen anderen Schwierigkeiten unterhalten wollte. Um das Ziel zu erreichen, die Arbeit so weit wie möglich zu vereinfachen, musste ich mich mit CI / CD vertraut machen.

Wenn Sie ein kleines Projekt haben (in unserem Fall handelt es sich um ein Node.js-Projekt) und möchten Sie wissen, wie Sie die Bereitstellung dieses Projekts automatisieren können, und gleichzeitig sicherstellen, dass die im Repository gespeicherten Daten genau übereinstimmen Was in der Produktion funktioniert, könnte Sie interessieren.

Voraussetzungen


Vom Leser dieses Artikels wird erwartet, dass er über Grundkenntnisse im Befehlszeilenbereich und im Schreiben von Bash-Skripten verfügt. Außerdem benötigt er Travis CI- und Docker Hub- Konten .

Tore


Ich werde nicht sagen, dass dieser Artikel bedingungslos als "Trainingshandbuch" bezeichnet werden kann. Es ist eher ein Dokument, in dem ich über das, was ich gelernt habe, spreche und den Prozess des Testens und Bereitstellens von Code in der Produktion beschreibe, der zu mir passt und in einem automatisierten Durchgang durchgeführt wird.

So endete mein Workflow.

Mit Ausnahme des Codes, der an einen Zweig des Repositorys gesendet wird, werden die masterfolgenden Aktionen ausgeführt:

  • Erstellen Sie das Projekt auf Travis CI.
  • Alle Unit-, Integrations- und End-to-End-Tests werden durchgeführt.

Nur für den Code, der in masterdie folgenden gilt:

  • Alles was oben gesagt wurde, plus ...
  • Erstellen Sie das Docker-Image basierend auf dem aktuellen Code, den Einstellungen und der Umgebung.
  • Platzieren eines Bildes auf dem Docker Hub.
  • Verbindung zum Produktionsserver.
  • Hochladen des Images vom Docker Hub auf den Server.
  • Stoppen Sie den aktuellen Container und starten Sie einen neuen basierend auf dem neuen Image.

Wenn Sie absolut nichts über Docker, über Bilder und Container wissen, machen Sie sich keine Sorgen. Ich werde dir alles darüber erzählen.

Was ist eine CI / CD?


Die Abkürzung CI / CD steht für "Continuous Integration / Continuous Deployment" - "Continuous Integration / Continuous Deployment".

▍ Kontinuierliche Integration


Die kontinuierliche Integration ist ein Prozess, bei dem Entwickler Commits für das Haupt-Repository des Projektquellcodes vornehmen (normalerweise für einen Zweig master). Gleichzeitig wird die Qualität des Codes durch automatisierte Tests sichergestellt.

▍ Kontinuierliche Bereitstellung


Kontinuierliche Bereitstellung ist die häufige automatisierte Bereitstellung von Code in der Produktion. Der zweite Teil der Abkürzung CI / CD wird manchmal als "kontinuierliche Lieferung" ("kontinuierliche Lieferung") offenbart. Dies ist im Allgemeinen dasselbe wie "kontinuierliche Bereitstellung", aber "kontinuierliche Bereitstellung" erfordert die manuelle Bestätigung von Änderungen, bevor der Projektbereitstellungsprozess gestartet wird.

Arbeitsbeginn


Die Anwendung, mit der ich alles gemeistert habe, heißt TakeNote . Dies ist das Webprojekt, an dem ich arbeite, um Notizen zu machen. Zuerst habe ich versucht, ein JAMStack- Projekt oder nur eine Frontend-Anwendung ohne Server zu erstellen, um die von Netlify angebotenen Standard-Hosting- und Bereitstellungsfunktionen zu nutzen . Als die Komplexität der Anwendung zunahm, musste ich ihren Serverteil erstellen, was bedeutete, dass ich meine eigene Strategie für die automatisierte Integration und die automatisierte Bereitstellung des Projekts entwickeln musste.

In meinem Fall ist die Anwendung ein Express-Server, der in der Node.js-Umgebung ausgeführt wird, eine einseitige React-Anwendung bereitstellt und eine sichere Server-API unterstützt. Diese Architektur folgt der Strategie, die in diesem Full-Stack-Authentifizierungshandbuch beschrieben wird.

Ich habe mich mit einem Freund beraten, der ein Automatisierungsexperte ist, und ihn gefragt, was ich tun muss, damit es so funktioniert, wie ich es brauchte. Er gab mir eine Vorstellung davon, wie ein automatisierter Workflow aussehen sollte, wie im Abschnitt Ziele dieses Artikels beschrieben. Die Tatsache, dass ich mir solche Ziele gesetzt habe, bedeutete, dass ich herausfinden musste, wie man Docker benutzt.

Docker


Docker ist ein Tool, mit dem dank der Containerisierungstechnologie Anwendungen auf einfache Weise verteilt sowie in derselben Umgebung bereitgestellt und gestartet werden können, selbst wenn die Docker-Plattform selbst in verschiedenen Umgebungen funktioniert. Für den Anfang brauchte ich Docker Command Line Tools (CLI) zur Verfügung. Die Anweisungen zur Installation von Docker können nicht als sehr klar und verständlich bezeichnet werden. Sie können jedoch daraus lernen, dass Sie Docker Desktop (für Mac oder Windows) herunterladen müssen, um den ersten Schritt der Installation durchzuführen.

Docker Hub entspricht in etwa GitHub für Git-Repositorys oder der npm- Registrierungfür JavaScript-Pakete. Dies ist ein Online-Repository für Docker-Images. Es stellt eine Verbindung zu Docker Desktop her.

Um mit Docker zu beginnen, müssen Sie zwei Dinge tun:


Danach können Sie überprüfen, ob die Docker-CLI funktioniert, indem Sie den folgenden Befehl ausführen, um die Version von Docker zu überprüfen:

docker -v

Melden Sie sich als Nächstes beim Docker Hub an, indem Sie auf Anfrage Ihren Benutzernamen und Ihr Kennwort eingeben:

docker login

Um Docker verwenden zu können, müssen Sie die Konzepte von Bildern und Containern verstehen.

▍ Bilder


Ein Bild ist so etwas wie ein Plan, der Anweisungen zum Erstellen eines Containers enthält. Dies ist eine unveränderliche Momentaufnahme des Dateisystems und der Anwendungseinstellungen. Entwickler können Bilder problemlos freigeben.

#     
docker images

Dieser Befehl zeigt eine Tabelle mit der folgenden Überschrift an:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Als nächstes werden wir einige Beispiele für Befehle im gleichen Format betrachten - zuerst kommt ein Befehl mit einem Kommentar und dann ein Beispiel für die Ausgabe.

▍Container


Ein Container ist ein ausführbares Paket, das alles enthält, was Sie zum Ausführen einer Anwendung benötigen. Eine Anwendung mit diesem Ansatz funktioniert unabhängig von der Infrastruktur immer gleich: in einer isolierten Umgebung und in derselben Umgebung. Der Punkt ist, dass in verschiedenen Umgebungen Instanzen desselben Images gestartet werden.

#   
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

▍Tags


Ein Tag ist ein Hinweis auf eine bestimmte Version eines Bildes.

▍ Docker-Befehlsübersicht


Hier finden Sie eine Übersicht über einige häufig verwendete Docker-Befehle.
Mannschaft
Kontext
Handlung
Docker bauen
Bilden
Zusammenstellen eines Bildes aus Dockerfile
Docker-Tag
Bilden
Bildkennzeichnung
Docker-Bilder
Bilden
Bilder auflisten
Docker laufen
Container
Bildbasierter Container-Start
Docker drücken
Bilden
Senden eines Bildes an die Registrierung
Docker ziehen
Bilden
Bild aus der Registrierung herunterladen
Docker ps
Container
Listencontainer
Docker-System beschneiden
Bild / Container
Nicht verwendete Container und Bilder entfernen

▍ Docker-Datei


Ich weiß, wie man eine Produktionsanwendung lokal ausführt. Ich habe eine Webpack-Konfiguration, die zum Erstellen einer vorgefertigten React-Anwendung entwickelt wurde. Als nächstes habe ich einen Befehl, der einen Node.js-basierten Server am Port startet 5000. Es sieht aus wie das:

npm i         #  
npm run build #  React-
npm run start #  Node-

Es ist zu beachten, dass ich keine Beispielanwendung für dieses Material habe. Für Experimente ist hier jedoch jede einfache Knotenanwendung geeignet.

Um den Container verwenden zu können, müssen Sie Docker-Anweisungen geben. Dies erfolgt über eine Datei mit dem Namen Dockerfileim Stammverzeichnis des Projekts. Diese Datei scheint zunächst ziemlich dunkel zu sein.

Was es enthält, beschreibt jedoch nur mit speziellen Befehlen etwas Ähnliches wie das Einrichten einer Arbeitsumgebung. Hier sind einige dieser Befehle:

  • FROM - Dieser Befehl startet eine Datei. Es gibt das Grundbild an, auf dessen Grundlage der Container erstellt wird.
  • KOPIEREN - Kopieren Sie Dateien von einer lokalen Quelle in einen Container.
  • WORKDIR - Festlegen des Arbeitsverzeichnisses für die folgenden Befehle.
  • RUN - Befehle ausführen.
  • EXPOSE - Porteinstellungen.
  • ENTRYPOINT - Gibt den auszuführenden Befehl an.

Dockerfile könnte ungefähr so ​​aussehen:

#   
FROM node:12-alpine

#        app/
COPY . app/

#  app/    
WORKDIR app/

#   ( npm ci  npm i,     )
RUN npm ci --only-production

#   React-  
RUN npm run build

#   
EXPOSE 5000

#  Node-
ENTRYPOINT npm run start

Abhängig vom ausgewählten Basisimage müssen Sie möglicherweise zusätzliche Abhängigkeiten installieren. Tatsache ist, dass einige grundlegende Images (wie Node Alpine Linux) so konzipiert sind, dass sie so kompakt wie möglich sind. Infolgedessen verfügen sie möglicherweise nicht über einige der Programme, auf die Sie zählen.

▍ Container erstellen, markieren und starten


Die lokale Montage und der Start des Containers sind nach uns Dockerfilerecht einfach. Bevor Sie ein Image an den Docker Hub senden, müssen Sie es lokal testen.

▍ Montage


Zuerst müssen Sie das Bild erfassen, indem Sie einen Namen und optional ein Tag angeben (wenn das Tag nicht angegeben ist, weist das System dem Bild automatisch ein Tag zu latest).

#  
docker build -t <image>:<tag> .

Nachdem Sie diesen Befehl ausgeführt haben, können Sie beobachten, wie Docker das Image erstellt.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...  ...
Successfully built 123456789123
Successfully tagged <image>:<tag>

Die Montage kann einige Minuten dauern - alles hängt davon ab, wie viele Abhängigkeiten Sie haben. Nach Abschluss der Baugruppe können Sie den Befehl ausführen docker imagesund sich die Beschreibung Ihres neuen Abbilds ansehen.

REPOSITORY          TAG               IMAGE ID            CREATED              SIZE
<image>             latest            123456789123        About a minute ago   x.xxGB

▍Starten Sie


Das Bild wird erstellt. Und das bedeutet, dass es auf seiner Basis möglich ist, einen Container zu starten. Da ich auf die im Container ausgeführte Anwendung unter der Adresse zugreifen möchte, die localhost:5000ich 5000:5000im nächsten Befehl auf der linken Seite des Paares installiert habe 5000. Auf der rechten Seite befindet sich der Containerhafen.

#      5000    5000
docker run -p 5000:5000 <image>:<tag>

Nachdem der Container erstellt und gestartet wurde, können Sie mit dem Befehl docker psdie Informationen zu diesem Container anzeigen (oder mit dem Befehl docker ps -aInformationen zu allen Containern anzeigen, nicht nur zu funktionierenden).

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
987654321234        <image>             "/bin/sh -c 'npm run…"   6 seconds ago        Up 6 seconds                0.0.0.0:5000->5000/tcp   stoic_darwin

Wenn Sie jetzt zur Adresse gehen localhost:5000, sehen Sie die Seite der Arbeitsanwendung, die genauso aussieht wie die Seite der Anwendung, die in der Produktionsumgebung arbeitet.

▍ Tag-Zuweisung und Veröffentlichung


Um eines der erstellten Images auf dem Produktionsserver verwenden zu können, müssen wir dieses Image vom Docker Hub herunterladen können. Dies bedeutet, dass Sie zuerst ein Repository für das Projekt auf dem Docker Hub erstellen müssen. Danach steht uns ein Ort zur Verfügung, an dem Sie das Bild reparieren können. Das Image muss umbenannt werden, damit sein Name mit unserem Benutzernamen auf dem Docker Hub beginnt. Danach sollte der Name des Repositorys stehen. Am Ende des Namens kann ein beliebiges Tag stehen. Das Folgende ist ein Beispiel für die Benennung von Bildern mit diesem Schema.

Jetzt können Sie das Image unter einem neuen Namen erfassen und den Befehl ausführen docker push, um es an das Docker Hub-Repository zu senden.

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

#     , , :
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

Wenn alles gut geht, ist das Image auf dem Docker Hub verfügbar und kann problemlos auf den Server heruntergeladen oder an andere Entwickler übertragen werden.

Nächste Schritte


Bisher haben wir sichergestellt, dass die Anwendung in Form eines Docker-Containers lokal funktioniert. Wir haben den Container in den Docker Hub hochgeladen. All dies bedeutet, dass wir bereits sehr gute Fortschritte auf dem Weg zum Ziel gemacht haben. Jetzt müssen wir zwei weitere Fragen lösen:

  • Konfigurieren eines CI-Tools zum Testen und Bereitstellen von Code.
  • Richten Sie den Produktionsserver so ein, dass er unseren Code laden und ausführen kann.

In unserem Fall wird Travis CI als CI / CD-Lösung verwendet . Als Server - DitigalOcean .

Es ist zu beachten, dass Sie hier eine andere Kombination von Diensten verwenden können. Anstelle von Travis CI können Sie beispielsweise CircleCI- oder Github-Aktionen verwenden. Und statt DigitalOcean - AWS oder Linode.

Wir haben uns für Travis CI entschieden und in diesem Service habe ich bereits etwas konfiguriert. Deshalb werde ich jetzt kurz darüber sprechen, wie man es für die Arbeit vorbereitet.

Travis ci


Travis CI ist ein Tool zum Testen und Bereitstellen von Code. Ich möchte nicht auf die Feinheiten der Einrichtung von Travis CI eingehen, da jedes Projekt einzigartig ist und dies nicht viel Nutzen bringt. Aber ich werde Ihnen die Grundlagen erläutern, die Ihnen den Einstieg ermöglichen, wenn Sie sich für Travis CI entscheiden. Was auch immer Sie wählen - Travis CI, CircleCI, Jenkins oder etwas anderes, ähnliche Konfigurationsmethoden werden überall verwendet.

Um mit Travis CI zu arbeiten, besuchen Sie die Projektwebsiteund erstellen Sie ein Konto. Integrieren Sie dann Travis CI in Ihr GitHub-Konto. Während des System-Setups müssen Sie das Repository angeben, mit dem Sie automatisieren möchten, und den Zugriff darauf aktivieren. (Ich verwende GitHub, bin mir aber sicher, dass Travis CI in BitBucket, GitLab und andere ähnliche Dienste integriert werden kann.)

Jedes Mal, wenn Travis CI zur Arbeit genommen wird, wird ein Server gestartet, der die in der Konfigurationsdatei angegebenen Befehle ausführt, einschließlich der Bereitstellung der entsprechenden Repository-Zweige.

▍ Aufgabenlebenszyklus


Die Travis CI-Konfigurationsdatei, .travis.ymldie im Stammverzeichnis des Projekts aufgerufen und gespeichert wird, unterstützt das Konzept von Job- Lebenszyklus- Ereignissen . Diese Ereignisse werden in der Reihenfolge aufgelistet, in der sie auftreten:

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

▍Test


In der Konfigurationsdatei werde ich den lokalen Travis CI-Server konfigurieren. Als Sprache habe ich Knoten 12 ausgewählt und das System angewiesen, die für die Verwendung von Docker erforderlichen Abhängigkeiten zu installieren.

Alles, was in aufgeführt ist, .travis.ymlwird ausgeführt, wenn alle Pull-Anforderungen an alle Zweige des Repositorys ausgeführt werden, sofern nicht anders angegeben. Dies ist eine nützliche Funktion, da wir damit den gesamten Code testen können, der in das Repository gelangt. Auf diese Weise können Sie feststellen, ob der Code bereit ist, in den Zweig geschrieben zu werden, masterund ob er den Prozess des Erstellens des Projekts stört. In dieser globalen Konfiguration installiere ich alles lokal, starte den Webpack-Entwicklerserver im Hintergrund (dies ist eine Funktion meines Workflows) und führe die Tests aus.

Wenn Sie Symbole mit Informationen zur Codeabdeckung in Ihrem Repository anzeigen möchten, finden Sie hier kurze Anweisungen zur Verwendung von Jest, Travis CI und Overalls zum Sammeln und Anzeigen dieser Informationen.

Also hier ist der Inhalt der Datei .travis.yml:

#  
language: node_js

#   Node.js
node_js:
  - '12'

services:
  #    Docker
  - docker

install:
  #    
  - npm ci

before_script:
  #      
  - npm run dev &

script:
  #  
  - npm run test

Hier enden die Aktionen, die für alle Zweige des Repositorys und für Pull-Requests ausgeführt werden.

▍ Bereitstellung


Basierend auf der Annahme, dass alle automatisierten Tests erfolgreich abgeschlossen wurden, können wir den Code optional auf dem Produktionsserver bereitstellen. Da wir dies nur für Code aus einem Zweig tun möchten master, geben wir dem System in den Bereitstellungseinstellungen entsprechende Anweisungen. Bevor Sie versuchen, den Code in Ihrem Projekt zu verwenden, den wir später betrachten werden, möchte ich Sie warnen, dass Sie ein echtes Skript haben müssen, das für die Bereitstellung aufgerufen wird.

deploy:
  #  Docker-     Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

Das Bereitstellungsskript löst zwei Probleme:

  • Erstellen, markieren und senden Sie das Image mit dem CI-Tool an den Docker Hub (in unserem Fall Travis CI).
  • Laden Sie das Image auf den Server, stoppen Sie den alten Container und starten Sie den neuen (in unserem Fall läuft der Server auf der DigitalOcean-Plattform).

Zuerst müssen Sie den automatischen Prozess zum Zusammenstellen, Markieren und Senden des Images an den Docker Hub konfigurieren. All dies ist sehr ähnlich zu dem, was wir bereits manuell gemacht haben, außer dass wir hier eine Strategie benötigen, um Bildern eindeutige Tags zuzuweisen und die Anmeldung zu automatisieren. Ich hatte Probleme mit einigen Details des Bereitstellungsskripts, z. B. einer Tagging-Strategie, dem Anmelden, dem Codieren von SSH-Schlüsseln und dem Herstellen einer SSH-Verbindung. Aber zum Glück geht mein Freund sehr gut mit Bash um, ebenso wie mit vielen anderen Dingen. Er hat mir geholfen, dieses Drehbuch zu schreiben.

Der erste Teil des Skripts sendet also das Bild an den Docker Hub. Das ist ziemlich einfach. Das von mir verwendete Tagging-Schema beinhaltet das Kombinieren eines Git-Hash und eines Git-Tags, falls vorhanden. Dies ermöglicht die Erstellung eines eindeutigen Tags und vereinfacht die Identifizierung der Baugruppe, auf der es basiert. DOCKER_USERNAMEund DOCKER_PASSWORDsind Benutzerumgebungsvariablen, die über die Travis CI-Schnittstelle festgelegt werden können. Travis CI verarbeitet vertrauliche Daten automatisch, damit sie nicht in die falschen Hände geraten.

Hier ist der erste Teil des Skripts deploy.sh.

#!/bin/sh
set -e #     

IMAGE="<username>/<repository>"                             #  Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-  

#    
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest

#   Docker Hub   
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}

Was der zweite Teil des Skripts sein wird, hängt vollständig davon ab, welchen Host Sie verwenden und wie die Verbindung dazu organisiert ist. In meinem Fall werden Doctl- Befehle verwendet, um eine Verbindung zum Server herzustellen , da ich Digital Ocean verwende . Bei der Arbeit mit Aws wird ein Dienstprogramm verwendet awsund so weiter.

Das Einrichten des Servers war nicht besonders schwierig. Also habe ich ein Tröpfchen basierend auf dem Basisbild eingerichtet. Es ist zu beachten, dass das von mir ausgewählte System eine einmalige manuelle Installation von Docker und einen einmaligen manuellen Start von Docker erfordert. Ich habe Ubuntu 18.04 verwendet, um Docker zu installieren. Wenn Sie also Ubuntu verwenden, um dasselbe zu tun, können Sie einfach dieser einfachen Anleitung folgen .

Ich spreche hier nicht über bestimmte Befehle für den Dienst, da dieser Aspekt in verschiedenen Fällen sehr unterschiedlich sein kann. Ich werde nur einen allgemeinen Aktionsplan geben, der ausgeführt wird, nachdem eine Verbindung über SSH mit dem Server hergestellt wurde, auf dem das Projekt bereitgestellt wird:

  • Sie müssen den aktuell ausgeführten Container finden und stoppen.
  • Anschließend müssen Sie im Hintergrund einen neuen Container starten.
  • Sie müssen den lokalen Server-Port auf einen Wert festlegen. Auf 80diese Weise können Sie die Site unter der Adresse des Formulars eingeben example.com, ohne den Port anzugeben, und nicht die Adresse wie verwenden example.com:5000.
  • Und schließlich müssen Sie alle alten Container und Bilder entfernen.

Hier ist die Fortsetzung des Skripts.

#  ID  
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)

#   ,  ,  
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f

Einige Dinge zu beachten


Wenn Sie über Travis CI über SSH eine Verbindung zum Server herstellen, wird möglicherweise eine Warnung angezeigt, die die Fortsetzung der Installation nicht zulässt, da das System auf die Antwort des Benutzers wartet.

The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?

Ich habe gelernt, dass der String-Schlüssel in base64 codiert werden kann, um ihn in einer Form zu speichern, in der es bequem und zuverlässig ist, damit zu arbeiten. In der Installationsphase können Sie den öffentlichen Schlüssel dekodieren und in eine Datei schreiben known_hosts, um den oben genannten Fehler zu beheben.

echo <public key> | base64 #  < ,   base64>

In der Praxis kann dieser Befehl folgendermaßen aussehen:

echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== you@example.com" | base64

Und hier ist, was es herausgibt - eine base64-codierte Zeichenfolge:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Hier ist das oben erwähnte Team

install:
  - echo <  ,   base64> | base64 -d >> $HOME/.ssh/known_hosts

Der gleiche Ansatz kann beim Herstellen einer Verbindung mit einem privaten Schlüssel verwendet werden, da Sie möglicherweise einen privaten Schlüssel benötigen, um auf den Server zuzugreifen. Wenn Sie mit einem Schlüssel arbeiten, müssen Sie nur dessen sicheren Speicher in der Travis CI-Umgebungsvariablen sicherstellen, damit er nirgendwo angezeigt wird.

Eine andere Sache, auf die Sie achten sollten, ist, dass Sie möglicherweise das gesamte Bereitstellungsskript ausführen müssen, das beispielsweise als einzelne Zeile dargestellt wird doctl. Dies kann zusätzlichen Aufwand erfordern.

doctl compute ssh <droplet> --ssh-command "    && "

TLS / SSL und Lastausgleich


Nachdem ich alles getan hatte, was oben besprochen wurde, war das letzte Problem, das vor mir auftrat, dass der Server kein SSL hatte. Da ich den Node.js-Server verwende, muss ich ziemlich basteln , damit die Reverse-Proxys Nginx und Let's Encrypt funktionieren .

Ich hatte wirklich keine Lust, all diese SSL-Einstellungen manuell vorzunehmen, also habe ich einfach einen Load Balancer erstellt und Informationen darüber in DNS aufgezeichnet. Im Fall von DigitalOcean ist das Erstellen eines sich selbst erneuernden selbstsignierten Zertifikats auf einem Load Balancer beispielsweise ein einfaches, kostenloses und schnelles Verfahren. Dieser Ansatz hat einen zusätzlichen Vorteil, der es bei Bedarf sehr einfach macht, SSL auf einer Vielzahl von Servern zu konfigurieren, auf denen ein Load Balancer ausgeführt wird. Dadurch können die Server selbst überhaupt nicht an SSL denken, sondern den Port wie gewohnt verwenden 80. Das Einrichten von SSL auf einem Load Balancer ist daher viel einfacher und bequemer als alternative SSL-Konfigurationsmethoden.

Jetzt können Sie auf dem Server alle Ports schließen, die eingehende Verbindungen akzeptieren - mit Ausnahme des Ports, 80der für die Kommunikation mit dem Load Balancer verwendet wird, und des Ports 22für SSH. Infolgedessen schlägt ein Versuch, mit Ausnahme dieser beiden Ports direkt auf den Server an einem beliebigen Port zuzugreifen, fehl.

Zusammenfassung


Nachdem ich alles getan hatte, was in diesem Material beschrieben wurde, hatte ich keine Angst mehr vor der Docker-Plattform oder dem Konzept automatisierter CI / CD-Ketten. Ich konnte eine kontinuierliche Integrationskette einrichten, in der der Code getestet wird, bevor er in Produktion geht, und der Code automatisch auf dem Server bereitgestellt wird. All dies ist für mich noch relativ neu, und ich bin sicher, dass es Möglichkeiten gibt, meinen automatisierten Workflow zu verbessern und effizienter zu gestalten. Wenn Sie Ideen zu diesem Thema haben, lassen Sie es mich wissen. Ich hoffe, dieser Artikel hat Ihnen in Ihren Angelegenheiten geholfen. Ich möchte glauben, dass Sie nach dem Lesen genauso viel gelernt haben wie ich, während ich alles herausgefunden habe, was ich darüber erzählt habe.

PS Auf unserem Marktplatz gibt es ein BildDocker , der mit einem Klick installiert wird. Sie können den Betrieb von Containern auf VPS überprüfen . Alle Neukunden erhalten 3 Tage kostenlos zum Testen.

Liebe Leser! Verwenden Sie CI / CD-Technologien in Ihren Projekten?


All Articles