Chaînage CI / CD et automatisation Docker

J'ai écrit mes premiers sites à la fin des années 90. Ensuite, les mettre en condition de travail était très simple. Il y avait un serveur Apache sur certains hébergements partagés, vous pouvez vous connecter à ce serveur via FTP, en écrivant quelque chose comme ça dans la ligne du navigateur ftp://ftp.example.com. Il a ensuite fallu saisir un nom et un mot de passe et télécharger des fichiers sur le serveur. Il y a eu d'autres moments, tout était plus facile à l'époque que maintenant. Au cours des deux dernières décennies, tout a beaucoup changé. Les sites sont devenus plus complexes, ils doivent être assemblés avant d'être mis en production. Un seul serveur est devenu une pluralité de serveurs travaillant derrière des équilibreurs de charge; l'utilisation de systèmes de contrôle de version est devenue courante.





Pour mon projet personnel, j'avais une configuration spéciale. Et je savais que j'avais besoin de pouvoir déployer un site en production, en n'effectuant qu'une seule action: écrire du code dans une branche mastersur GitHub. De plus, je savais que pour assurer le fonctionnement de ma petite application Web, je ne voulais pas gérer un énorme cluster Kubernetes, ni utiliser la technologie Docker Swarm, ni maintenir un parc de serveurs avec des pods, des agents et toutes sortes d'autres difficultés. Afin d'atteindre l'objectif de simplifier le travail autant que possible, je devais me familiariser avec CI / CD.

Si vous avez un petit projet (dans notre cas, nous parlons d'un projet Node.js) et que vous souhaitez savoir comment automatiser le déploiement de ce projet, tout en vous assurant que ce qui est stocké dans le référentiel correspond exactement ce qui fonctionne en production, je pense que cet article pourrait vous intéresser.

Conditions préalables


Le lecteur de cet article devrait avoir une connaissance de base de la zone de ligne de commande et Ă©crire des scripts Bash. De plus, il aura besoin de comptes Travis CI et Docker Hub .

Buts


Je ne dirai pas que cet article peut être appelé sans condition un "manuel de formation". C'est plutôt un document dans lequel je parle de ce que j'ai appris et décris le processus de test et de déploiement de code en production qui me convient, réalisé en un seul passage automatisé.

C'est ainsi que mon workflow s'est terminé.

À l'exception du code envoyé à n'importe quelle branche du référentiel, les masteractions suivantes sont effectuées:

  • GĂ©nĂ©rez le projet sur Travis CI.
  • Tous les tests unitaires, d'intĂ©gration et de bout en bout sont effectuĂ©s.

Uniquement pour le code qui entre dans masterles cales suivantes:

  • Tout ce qui est dit plus haut, plus ...
  • CrĂ©ez l'image Docker en fonction du code, des paramètres et de l'environnement actuels.
  • Placement d'une image sur le Docker Hub.
  • Connexion au serveur de production.
  • TĂ©lĂ©chargement de l'image du Docker Hub vers le serveur.
  • ArrĂŞtez le conteneur actuel et dĂ©marrez-en un nouveau en fonction de la nouvelle image.

Si vous ne savez absolument rien de Docker, des images et des conteneurs - ne vous inquiétez pas. Je vais tout vous dire à ce sujet.

Qu'est-ce qu'un CI / CD?


L'abréviation CI / CD signifie "intégration continue / déploiement continu" - "intégration continue / déploiement continu".

▍ Intégration continue


L'intégration continue est un processus au cours duquel les développeurs effectuent des validations dans le référentiel principal du code source du projet (généralement dans une branche master). Dans le même temps, la qualité du code est assurée par la réalisation de tests automatisés.

â–Ť DĂ©ploiement continu


Le déploiement continu est le déploiement automatisé fréquent de code en production. La deuxième partie de l'abréviation CI / CD est parfois décrite comme "livraison continue" ("livraison continue"). Ceci, en général, est identique au «déploiement continu», mais la «livraison continue» implique la nécessité d'une confirmation manuelle des modifications avant de démarrer le processus de déploiement du projet.

DĂ©but des travaux


L'application sur laquelle je maîtrise tout s'appelle TakeNote . Il s'agit du projet Web sur lequel je travaille, conçu pour prendre des notes. Au début, j'ai essayé de créer un projet JAMStack , ou simplement une application frontale sans serveur, afin de profiter des capacités d' hébergement et de déploiement standard offertes par Netlify . Au fur et à mesure que la complexité de l'application augmentait, je devais créer sa partie serveur, ce qui signifiait que je devrais élaborer ma propre stratégie d'intégration automatisée et de déploiement automatisé du projet.

Dans mon cas, l'application est un serveur Express fonctionnant dans l'environnement Node.js, servant une application React d'une seule page et prenant en charge une API de serveur sécurisée. Cette architecture suit la stratégie trouvée dans ce guide d'authentification de pile complète.

J'ai consulté un ami qui est un expert en automatisation et lui ai demandé ce que je devais faire pour que cela fonctionne comme je le souhaitais. Il m'a donné une idée de ce à quoi devrait ressembler un flux de travail automatisé, décrit dans la section Objectifs de cet article. Le fait que je me sois fixé de tels objectifs signifiait que je devais comprendre comment utiliser Docker.

Docker


Docker est un outil qui, grâce à la technologie de conteneurisation, facilite la distribution des applications, ainsi que leur déploiement et leur lancement dans le même environnement, même si la plateforme Docker elle-même fonctionne dans des environnements différents. Pour commencer, j'avais besoin d'avoir des outils de ligne de commande (CLI) Docker à ma disposition. Les instructions d'installation de Docker ne peuvent pas être qualifiées de très claires et compréhensibles, mais vous pouvez en apprendre que pour effectuer la première étape de l'installation, vous devez télécharger Docker Desktop (pour Mac ou Windows).

Docker Hub est à peu près le même que GitHub pour les référentiels git ou le registre npmpour les packages JavaScript. Il s'agit d'un référentiel en ligne pour les images Docker. Il s'y connecte Docker Desktop.

Donc, pour commencer avec Docker, vous devez faire deux choses:


Après cela, vous pouvez vérifier que la CLI Docker fonctionne en exécutant la commande suivante pour vérifier la version de Docker:

docker -v

Ensuite, connectez-vous au Docker Hub en entrant, Ă  la demande, votre nom d'utilisateur et votre mot de passe:

docker login

Pour utiliser Docker, vous devez comprendre les concepts d'images et de conteneurs.

â–Ť Images


Une image est quelque chose comme un plan contenant des instructions pour la construction d'un conteneur. Il s'agit d'un instantané immuable du système de fichiers et des paramètres d'application. Les développeurs peuvent facilement partager des images.

#     
docker images

Cette commande affichera un tableau avec l'en-tĂŞte suivant:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Ensuite, nous allons considérer quelques exemples de commandes dans le même format - vient d'abord une commande avec un commentaire, puis un exemple de ce qu'elle peut produire.

â–ŤConteneurs


Un conteneur est un package exécutable qui contient tout ce dont vous avez besoin pour exécuter une application. Une application avec cette approche fonctionnera toujours de la même manière, quelle que soit l'infrastructure: dans un environnement isolé et dans le même environnement. Le fait est que dans des environnements différents, des instances de la même image sont lancées.

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

▍Étiquettes


Une balise est une indication d'une version spécifique d'une image.

▍ Résumé de la commande Docker


Voici un aperçu de certaines commandes Docker couramment utilisées.
Équipe
Le contexte
Acte
construction de docker
Forme
Assemblage d'une image Ă  partir de Dockerfile
tag docker
Forme
Marquage d'image
images de docker
Forme
Liste des images
docker run
RĂ©cipient
Lancement de conteneur basé sur l'image
docker push
Forme
Soumettre une image au registre
traction de docker
Forme
Télécharger l'image du registre
docker ps
RĂ©cipient
Conteneur de liste
système de docker prune
Image / conteneur
Suppression des conteneurs et des images inutilisés

â–Ť Dockerfile


Je sais comment exécuter une application de production localement. J'ai une configuration Webpack conçue pour créer une application React prête à l'emploi. Ensuite, j'ai une commande qui démarre un serveur basé sur Node.js sur le port 5000. Cela ressemble à ceci:

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

Il convient de noter que je n'ai pas d'exemple d'application pour ce matériel. Mais ici, pour les expériences, toute application Node simple convient.

Pour utiliser le conteneur, vous devez donner des instructions à Docker. Cela se fait via un fichier appelé Dockerfilesitué dans le répertoire racine du projet. Ce fichier, au premier abord, semble assez obscur.

Mais ce qu'il contient décrit uniquement, avec des commandes spéciales, quelque chose de similaire à la configuration d'un environnement de travail. Voici certaines de ces commandes:

  • FROM - Cette commande dĂ©marre le fichier. Il indique l'image de base sur la base de laquelle le conteneur est construit.
  • COPY - Copiez des fichiers d'une source locale vers un conteneur.
  • WORKDIR - DĂ©finition du rĂ©pertoire de travail pour les commandes suivantes.
  • RUN - ExĂ©cute les commandes.
  • EXPOSE - Paramètres du port.
  • ENTRYPOINT - SpĂ©cifie la commande Ă  exĂ©cuter.

Dockerfile pourrait ressembler Ă  ceci:

#   
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

Selon l'image de base sélectionnée, vous devrez peut-être installer des dépendances supplémentaires. Le fait est que certaines images de base (comme Node Alpine Linux) sont conçues pour les rendre aussi compactes que possible. Par conséquent, ils peuvent ne pas avoir certains des programmes sur lesquels vous comptez.

â–Ť Construire, Ă©tiqueter et lancer un conteneur


L'assemblage local et le lancement du conteneur sont, après nous Dockerfile, les tâches sont assez simples. Avant d'envoyer une image au Docker Hub, vous devez la tester localement.

â–Ť Assemblage


Vous devez d'abord collecter l' image en spécifiant un nom et, éventuellement, une balise (si la balise n'est pas spécifiée, le système attribuera automatiquement une balise à l'image latest).

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

Après avoir exécuté cette commande, vous pouvez observer comment Docker crée l'image.

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

L'assemblage peut prendre quelques minutes - tout dépend du nombre de dépendances dont vous disposez. Une fois l'assemblage terminé, vous pouvez exécuter la commande docker imageset consulter la description de votre nouvelle image.

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

â–ŤDĂ©marrer


L'image est créée. Et cela signifie que sur sa base, il est possible de lancer un conteneur. Étant donné que je veux pouvoir accéder à l'application en cours d'exécution dans le conteneur à l'adresse que localhost:5000j'ai 5000:5000installée sur le côté gauche de la paire dans la commande suivante 5000. Sur le côté droit se trouve le port à conteneurs.

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

Maintenant que le conteneur est créé et lancé, vous pouvez utiliser la commande docker pspour consulter les informations sur ce conteneur (ou vous pouvez utiliser la commande docker ps -aqui affiche des informations sur tous les conteneurs, pas seulement ceux qui fonctionnent).

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

Si vous allez Ă  l'adresse maintenant localhost:5000, vous pouvez voir la page de l'application de travail, qui ressemble exactement Ă  la page de l'application fonctionnant dans l'environnement de production.

â–Ť Affectation et publication des balises


Afin d'utiliser l'une des images créées sur le serveur de production, nous devons être en mesure de télécharger cette image à partir du Docker Hub. Cela signifie que vous devez d'abord créer un référentiel pour le projet sur le Docker Hub. Après cela, nous aurons à notre disposition un endroit où vous pourrez fixer l'image. L'image doit être renommée pour que son nom commence par notre nom d'utilisateur sur le Docker Hub. Après cela devrait être le nom du référentiel. À la fin du nom peut être n'importe quelle balise. Voici un exemple de dénomination d'images à l'aide de ce schéma.

Vous pouvez maintenant collecter l'image avec un nouveau nom et exécuter la commande docker pushpour l'envoyer au référentiel Docker Hub.

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

Si tout se passe bien, l'image sera disponible sur le Docker Hub et pourra être facilement téléchargée sur le serveur ou transférée à d'autres développeurs.

Prochaines Ă©tapes


À ce jour, nous nous sommes assurés que l'application, sous la forme d'un conteneur Docker, fonctionne localement. Nous avons téléchargé le conteneur sur le Docker Hub. Tout cela signifie que nous avons déjà fait de très bons progrès vers l'objectif. Maintenant, nous devons résoudre deux autres questions:

  • Configuration d'un outil CI pour tester et dĂ©ployer du code.
  • Configuration du serveur de production pour qu'il puisse charger et exĂ©cuter notre code.

Dans notre cas, Travis CI est utilisé comme solution CI / CD . En tant que serveur - DitigalOcean .

Il convient de noter qu'ici, vous pouvez utiliser une autre combinaison de services. Par exemple, au lieu de Travis CI, vous pouvez utiliser des actions CircleCI ou Github. Et au lieu de DigitalOcean - AWS ou Linode.

Nous avons décidé de travailler avec Travis CI, et dans ce service, j'ai déjà quelque chose de configuré. Par conséquent, je vais maintenant parler brièvement de la façon de le préparer au travail.

Travis ci


Travis CI est un outil de test et de déploiement de code. Je ne voudrais pas entrer dans les subtilités de la mise en place de Travis CI, car chaque projet est unique, et cela n'apportera pas beaucoup d'avantages. Mais je vais vous parler des bases qui vous permettront de commencer si vous décidez d'utiliser Travis CI. Quoi que vous choisissiez - Travis CI, CircleCI, Jenkins ou autre chose, des méthodes de configuration similaires seront utilisées partout.

Pour commencer à travailler avec Travis CI, rendez-vous sur le site du projetet créez un compte. Intégrez ensuite Travis CI à votre compte GitHub. Pendant la configuration du système, vous devrez spécifier le référentiel avec lequel vous souhaitez automatiser et autoriser l'accès à celui-ci. (J'utilise GitHub, mais je suis sûr que Travis CI peut s'intégrer avec BitBucket, GitLab et d'autres services similaires).

Chaque fois que Travis CI est mis au travail, un serveur est lancé qui exécute les commandes spécifiées dans le fichier de configuration, y compris le déploiement des branches de référentiel correspondantes.

▍ Cycle de vie des tâches


Le fichier de configuration Travis CI, appelé .travis.ymlet stocké dans le répertoire racine du projet, prend en charge le concept d' événements de cycle de vie de travail. Ces événements sont répertoriés dans l'ordre dans lequel ils se produisent:

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

â–ŤTesting


Dans le fichier de configuration, je vais configurer le serveur local Travis CI. Comme langue, j'ai choisi Node 12 et j'ai dit au système d'installer les dépendances nécessaires pour utiliser Docker.

Tout ce qui est répertorié dans .travis.ymlsera exécuté lorsque toutes les demandes d'extraction vers toutes les branches du référentiel seront exécutées, sauf indication contraire. Il s'agit d'une fonctionnalité utile, car elle signifie que nous pouvons tester tout le code entrant dans le référentiel. Cela vous permet de savoir si le code est prêt à être écrit dans la branche masteret s'il va perturber le processus de construction du projet. Dans cette configuration globale, j'installe tout localement, démarre le serveur de développement Webpack en arrière-plan (c'est une caractéristique de mon flux de travail) et exécute les tests.

Si vous souhaitez afficher les icônes sur votre référentiel avec des informations sur la couverture du code par les tests, ici vous trouverez de brèves instructions sur l' utilisation Jest, Travis CI et salopettes pour recueillir et afficher ces informations.

Voici donc le contenu du fichier .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

Ici se terminent les actions effectuées pour toutes les branches du référentiel et pour les demandes d'extraction.

â–Ť DĂ©ploiement


En supposant que tous les tests automatisés se sont déroulés avec succès, nous pouvons éventuellement déployer le code sur le serveur de production. Puisque nous voulons le faire uniquement pour le code d'une branche master, nous donnons au système des instructions appropriées dans les paramètres de déploiement. Avant d'essayer d'utiliser le code dans votre projet, que nous examinerons plus tard, je voudrais vous avertir que vous devez avoir un vrai script appelé pour le déploiement.

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

Le script de déploiement résout deux problèmes:

  • CrĂ©ez, Ă©tiquetez et envoyez l'image au Docker Hub Ă  l'aide de l'outil CI (dans notre cas, c'est Travis CI).
  • Chargement de l'image sur le serveur, arrĂŞt de l'ancien conteneur et dĂ©marrage du nouveau (dans notre cas, le serveur s'exĂ©cute sur la plateforme DigitalOcean).

Vous devez d'abord configurer le processus automatique d'assemblage, de marquage et d'envoi de l'image au Docker Hub. Tout cela est très similaire à ce que nous avons déjà fait manuellement, sauf qu'ici nous avons besoin d'une stratégie pour attribuer des balises uniques aux images et automatiser la connexion. J'ai eu des difficultés avec certains détails du script de déploiement, tels qu'une stratégie de balisage, la connexion, le codage des clés SSH, l'établissement d'une connexion SSH. Mais, heureusement, mon petit ami gère très bien bash, ainsi que bien d'autres choses. Il m'a aidé à écrire ce script.

Ainsi, la première partie du script envoie l'image au Docker Hub. C'est assez simple. Le schéma de marquage que j'ai utilisé implique la combinaison d'un hachage git et d'un tag git, s'il en existe un. Cela permet la création d'une balise unique et simplifie l'identification de l'assemblage sur lequel elle est basée. DOCKER_USERNAMEet DOCKER_PASSWORDsont des variables d'environnement utilisateur qui peuvent être définies à l'aide de l'interface Travis CI. Travis CI traite automatiquement les données sensibles afin qu'elles ne tombent pas entre de mauvaises mains.

Voici la première partie du script 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}

La nature de la deuxième partie du script dépend de l'hôte que vous utilisez et de l'organisation de la connexion. Dans mon cas, depuis que j'utilise Digital Ocean, les commandes doctl sont utilisées pour se connecter au serveur . Lorsque vous travaillez avec Aws, un utilitaire sera utilisé aws, etc.

La configuration du serveur n'a pas été particulièrement difficile. J'ai donc mis en place une gouttelette basée sur l'image de base. Il convient de noter que le système que j'ai sélectionné nécessite une installation manuelle unique de Docker et un lancement manuel unique de Docker. J'ai utilisé Ubuntu 18.04 pour installer Docker, donc si vous utilisez Ubuntu pour faire de même, vous pouvez simplement suivre ce guide simple.

Je ne parle pas ici de commandes spécifiques pour le service, car cet aspect peut varier considérablement dans différents cas. Je ne donnerai qu'un plan d'action général qui sera réalisé après connexion via SSH au serveur sur lequel le projet sera déployé:

  • Vous devez trouver le conteneur en cours d'exĂ©cution et l'arrĂŞter.
  • Ensuite, en arrière-plan, vous devez lancer un nouveau conteneur.
  • Vous devrez dĂ©finir le port du serveur local sur une valeur 80- cela vous permettra d'entrer le site Ă  l'adresse du formulaire example.com, sans spĂ©cifier le port, et de ne pas utiliser l'adresse comme example.com:5000.
  • Et enfin, vous devez supprimer tous les anciens conteneurs et images.

Voici la suite du script.

#  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

Quelques points à considérer


Peut-être que lorsque vous vous connectez au serveur via SSH à partir de Travis CI, vous verrez un avertissement qui ne permettra pas à l'installation de continuer, car le système attendra que l'utilisateur réponde.

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)?

J'ai appris que la clé de chaîne peut être encodée en base64 afin de l'enregistrer sous une forme dans laquelle il sera pratique et fiable de travailler avec elle. Au stade de l'installation, vous pouvez décoder la clé publique et l'écrire dans un fichier known_hostsafin de supprimer l'erreur ci-dessus.

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

En pratique, cette commande peut ressembler Ă  ceci:

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

Et voici ce qu'elle donne - une chaîne encodée en base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Voici l'équipe mentionnée ci-dessus

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

La même approche peut être utilisée avec une clé privée lors de l'établissement d'une connexion, car vous pouvez avoir besoin d'une clé privée pour accéder au serveur. Lorsque vous travaillez avec une clé, il vous suffit de garantir son stockage sécurisé dans la variable d'environnement Travis CI, et de sorte qu'elle ne soit affichée nulle part.

Une autre chose à laquelle vous devez faire attention est que vous devrez peut-être exécuter l'intégralité du script de déploiement, présenté sur une seule ligne, par exemple, à l'aide de doctl. Cela peut nécessiter un effort supplémentaire.

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

TLS / SSL et Ă©quilibrage de charge


Après avoir fait tout ce qui a été discuté ci-dessus, le dernier problème qui s'est posé devant moi était que le serveur n'avait pas SSL. Depuis que j'utilise le serveur Node.js, afin de rendre l' Nginx et Chiffrer proxys inverses Let travail , je dois bricoler beaucoup.

Je n'avais vraiment pas envie de faire tous ces paramètres SSL manuellement, alors je viens de créer un équilibreur de charge et d'enregistrer des informations à ce sujet dans DNS. Dans le cas de DigitalOcean, par exemple, la création d'un certificat auto-renouvelé auto-renouvelé sur un équilibreur de charge est une procédure simple, gratuite et rapide. Cette approche présente un avantage supplémentaire qui, si nécessaire, facilite la configuration de SSL sur une variété de serveurs exécutant un équilibreur de charge. Cela permet aux serveurs eux-mêmes de ne pas «penser» du tout à SSL, mais d'utiliser le port comme d'habitude 80. La configuration de SSL sur un équilibreur de charge est donc beaucoup plus simple et plus pratique que les autres méthodes de configuration SSL.

Vous pouvez maintenant fermer sur le serveur tous les ports qui acceptent les connexions entrantes - à l'exception du port 80utilisé pour la communication avec l'équilibreur de charge et du port 22pour SSH. Par conséquent, une tentative d'accès direct au serveur sur n'importe quel port, à l'exception de ces deux, échouera.

Sommaire


Après avoir fait tout ce qui était décrit dans ce document, je n'avais plus peur ni de la plateforme Docker ni du concept de chaînes CI / CD automatisées. J'ai pu mettre en place une chaîne d'intégration continue au cours de laquelle le code est testé avant sa mise en production et le code est automatiquement déployé sur le serveur. Tout cela pour moi est encore relativement nouveau, et je suis sûr qu'il existe des moyens d'améliorer mon flux de travail automatisé et de le rendre plus efficace. Par conséquent, si vous avez des idées à ce sujet, faites-le moi savoir. J'espère que cet article vous a aidé dans vos affaires. Je veux croire qu'après l'avoir lu, vous avez appris autant que moi, alors que j'ai compris tout ce que j'en ai dit.

PS Il y a une image sur notre marchéDocker , qui s'installe en un clic. Vous pouvez vérifier le fonctionnement des conteneurs sur VPS . Tous les nouveaux clients bénéficient de 3 jours gratuits pour les tests.

Chers lecteurs! Utilisez-vous les technologies CI / CD dans vos projets?


All Articles