Skip to content

Articles

Configuration de l'intégration continue sur Ubuntu avec Nodejs

15 août 2015 • 12 min de lecture

Configuration de l'intégration continue sur Ubuntu avec Nodejs

J’ai traversé le sang, la sueur et les larmes pour vous apporter ceci. J’ai souffert de la chaleur torride de la Vallée de la Mort et gravi les sommets du mont McKinley. J’ai beaucoup sacrifié.

Une grande partie du contenu partagé dans cet article n’est pas mon travail original. Quand je le peux, je renvoie vers le travail original.

Cet article suppose que vous savez naviguer dans Linux.

Je n’ai pas pu trouver de guide complet sur l’hébergement et la gestion d’applications Nodejs sur Ubuntu en capacité de production. J’ai rassemblé plusieurs articles sur le sujet. À la fin de cet article, j’espère que vous serez capable de configurer votre propre serveur Ubuntu et d’avoir Nodejs se déployant via un serveur d’intégration continue.

Environnement

J’utilise TeamCity sur Windows qui déploie ensuite le code depuis GitHub vers Ubuntu hébergé sur AWS.

Technologies

Pour cet article, j’ai utilisé les technologies suivantes :

  • Ubuntu 14.04 sur AWS
  • Plink 0.64
  • TeamCity 9.1
  • GitHub
  • Nginx 1.9.3

Configuration d’Ubuntu

Je ne vais pas entrer dans les détails ici. Amazon Web Services (AWS) rend cela assez facile à faire. Peu importe où c’est ou si c’est sur votre propre serveur.

J’ai rencontré quelques pièges. Premièrement, assurez-vous que le port 80 est ouvert. J’ai fait l’erreur stupide d’essayer de me connecter avec le port 80 fermé. Une fois que j’ai découvert mon erreur, je me suis senti comme le derrière d’un rhinocéros.

Installation de Nodejs depuis les sources

Nodejs est une technologie serveur utilisant le moteur javascript V8 de Google. Depuis sa sortie en 2010, elle est devenue largement populaire.

Les instructions suivantes proviennent à l’origine d’un article de Digital Ocean.

Vous avez toujours la possibilité d’installer Nodejs depuis apt-get, mais il aura quelques versions de retard. Pour obtenir les derniers bits, installez Nodejs depuis les sources.

À la fin de cette section, nous aurons téléchargé la dernière version stable de node (au moment de cet article), nous aurons construit les sources et installé Nodejs.

Connectez-vous à votre serveur. Nous commencerons par mettre à jour les listes de paquets.

sudo apt-get update

Je suggère aussi que vous mettiez à jour tous les paquets. Ce n’est pas nécessaire pour Nodejs mais c’est une bonne pratique de maintenir votre serveur à jour.

sudo apt-get upgrade

Votre serveur est maintenant à jour. Il est temps de télécharger les sources.

cd ~

Au moment de la rédaction, 12.7 est la dernière version stable de Nodejs. Consultez nodejs.org pour la dernière version.

wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz

Extrayez l’archive que vous avez téléchargée.

tar xvf node-v*

Déplacez-vous dans le répertoire nouvellement créé

cd node-v*

Configurez et construisez Nodejs.

./configure

make

Installez Nodejs

sudo make install

Pour supprimer les fichiers téléchargés et extraits. Bien sûr, c’est optionnel.

cd ~

rm -rf node-v*

Félicitations ! Nodejs est maintenant installé ! Et ce n’était pas très difficile.

Configuration de Nginx

Source

Nodejs peut agir comme un serveur web, mais ce n’est pas ce que je voudrais exposer au monde. Un serveur web industriel, renforcé et riche en fonctionnalités est mieux adapté à cette tâche. Je me suis tourné vers Nginx pour cette tâche.

C’est un serveur web mature avec les fonctionnalités dont nous avons besoin. Pour exécuter plus d’une instance de Nodejs, nous aurons besoin de redirection de port.

Vous pensez peut-être, pourquoi avons-nous besoin de plus d’une instance de Nodejs fonctionnant en même temps. C’est une question juste… Dans mon scénario, j’ai un serveur et j’ai besoin d’exécuter DEV, QA et PROD sur la même machine. Oui, je sais que ce n’est pas idéal, mais je ne veux pas monter 3 serveurs pour chaque environnement.

Pour commencer, installons Nginx

sudo -s

add-apt-repository ppa:nginx/stable

apt-get update 

apt-get install nginx

Une fois que Nginx s’est installé avec succès, nous devons configurer les domaines. Je vais supposer que vous voudrez avoir chacun de vos sites sur son propre domaine/sous-domaine. Si vous ne le voulez pas et voulez utiliser différents sous-dossiers, c’est faisable et très facile à faire. Je ne vais pas couvrir ce scénario ici. Il y a une tonne de documentation sur comment faire cela. Il y a très peu de documentation sur la configuration de différents domaines et la redirection de port vers les instances Nodejs correspondantes. C’est ce que je vais couvrir.

Maintenant que Nginx est installé, créez un fichier pour yourdomain.com dans /etc/nginx/sites-available/

sudo nano /etc/nginx/sites-available/yourdomain.com

Ajoutez la configuration suivante à votre fichier nouvellement créé

# the IP(s) on which your node server is running. I chose port 9001.
upstream app_myapp1 {
    server 127.0.0.1:9001;
    keepalive 8;
}

# the nginx server instance
server {
    listen 80;
    server_name yourdomain.com;
    access_log /var/log/nginx/yourdomain.log;

    # pass the request to the node.js server with the correct headers
    # and much more can be added, see nginx config options
    location / {
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://app_myapp1;

    }
 }

Assurez-vous de remplacer “yourdomain.com” par votre domaine réel. Sauvegardez et quittez votre éditeur.

Créez un lien symbolique vers ce fichier dans le répertoire sites-enabled.

cd /etc/nginx/sites-enabled/ 

ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com

Pour tester que tout fonctionne correctement, créez une application node simple et sauvegardez-la dans /var/www/yourdomain.com/app.js et exécutez-la.

Voici une application nodejs simple si vous n’en avez pas sous la main.

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');}).listen(9001, "127.0.0.1");
console.log('Server running at http://127.0.0.1:9001/');

Redémarrons Nginx.

sudo /etc/init.d/nginx restart

N’oubliez pas de démarrer votre instance Nodejs, si vous ne l’avez pas déjà fait.

cd /var/www/yourdomain/ && node app.js

Si tout fonctionne correctement, quand vous naviguez vers yourdomain.com vous verrez “Hello World.”

Pour ajouter un autre domaine pour une instance Nodejs différente, vous devez répéter les étapes ci-dessus. Spécifiquement, vous devrez changer le nom upstream, le port et le domaine dans votre nouveau fichier de configuration Nginx. L’adresse proxy_pass doit correspondre au nom upstream dans le fichier de configuration nginx. Regardez le nom upstream et la valeur proxy_pass et vous verrez ce que je veux dire.

Pour récapituler, nous avons installé NodeJS depuis les sources et nous venons de finir d’installer Nginx. Nous avons configuré et testé la redirection de port avec Nginx et Nodejs

Installation de PM2

Vous vous demandez peut-être “Qu’est-ce que PM2 ?” comme je l’ai fait quand j’en ai entendu parler pour la première fois. PM2 est un gestionnaire de processus pour les applications Nodejs. Nodejs ne vient pas avec beaucoup de choses. C’est une partie de son attrait. L’inconvénient de ceci, c’est bien, vous devez fournir les couches devant lui. PM2 est une de ces couches.

PM2 gère la vie du processus Nodejs. Quand il est terminé, PM2 le redémarre. Quand le serveur redémarre, PM2 redémarre tous les processus Nodejs pour vous. Il a aussi un processus de cycle de vie de développement étendu. Nous ne couvrirons pas cet aspect de PM2. Je vous encourage à lire la documentation bien écrite.

En supposant que vous êtes connecté au terminal, nous commencerons par installer PM2 via NPM. Npm est le gestionnaire de paquets Nodejs (npm). Il a été installé quand vous avez installé Nodejs.

sudo npm install pm2 -g

C’est tout. PM2 est maintenant installé.

Utilisation de PM2

PM2 est facile à utiliser.

Le hello world pour PM2 est simple.

pm2 start hello.js

Ceci ajoute votre application à la liste de processus de PM2. Cette liste est affichée chaque fois qu’une application est démarrée.

Dans cet exemple, il y a deux applications Nodejs en cours d’exécution. Une appelée api.dev et api.pre.

PM2 assigne automatiquement le nom de l’application au “App name” dans la liste.

Par défaut, PM2 ne se configure pas pour démarrer quand le serveur redémarre. La commande est différente pour les différentes saveurs de Linux. Je fonctionne sur Ubuntu, donc j’exécuterai la commande Ubuntu.

pm2 start ubuntu

Nous n’avons pas encore tout à fait fini. Nous devons ajouter un chemin vers le binaire PM2. Heureusement, la sortie de la commande précédente nous dit comment faire cela.

Sortie :

[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy
Run the command that was generated (similar to the highlighted output above) to set PM2 up to start on boot (use the command from your own output):

 sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy

Exemples d’autres utilisations de PM2 (optionnel)

Arrêter une application par le nom de l’application

pm2 stop example

Redémarrer par le nom de l’application

pm2 restart example

Liste des applications actuelles gérées par PM2

pm2 list

Spécifier un nom lors du démarrage d’un processus. Si vous appelez, PM2 utilise le fichier javascript comme nom. Cela pourrait ne pas fonctionner pour vous. Voici comment spécifier le nom.

pm2 start www.js --name api.pre

Cela devrait être suffisant pour vous faire démarrer avec PM2. Pour en savoir plus sur les capacités de PM2, visitez le dépôt GitHub.

Vous pensez probablement, “Qu’est-ce que diable est Plink ?” Au moins c’est ce que j’ai pensé. Je ne suis toujours pas sûr de ce qu’il faut en penser. Je n’ai jamais rien vu de tel.

Avez-vous déjà regardé le film Wall-e ? Wall-e sort une fourchette-cuillère. D’abord il essaie de la mettre avec les fourchettes, mais elle ne rentre pas et puis il essaie de la mettre avec les cuillères, mais elle ne rentre pas. Eh bien c’est Plink. C’est un croisement entre Putty (SSH) et la ligne de commande Windows.

Plink vous permet essentiellement d’exécuter des commandes bash via la ligne de commande Windows tout en étant connecté à un shell Linux (et probablement Unix).

Commencez par télécharger Plink. C’est juste un exécutable. Je recommande de le mettre dans C:/Program Files (x86)/Plink. Nous devrons le référencer plus tard.

Si vous exécutez une instance Ubuntu dans AWS. Vous aurez déjà un certificat configuré pour Putty (je suppose que vous utilisez Putty).

Si ce n’est pas le cas, vous devrez vous assurer d’avoir un certificat ssh compatible pour Ubuntu dans AWS.

Si vous n’utilisez pas AWS, vous pouvez spécifier le nom d’utilisateur et le mot de passe dans la ligne de commande et n’aurez pas à vous soucier des certificats ssh.

Voici un exemple de ligne de commande qui se connecte à Ubuntu avec Plink.

"C:\Program Files (x86)\Plink\plink.exe" -ssh ubuntu@xx.xx.xx.xx -i "C:\Program Files (x86)\Plink\ssh certs\aws-ubuntu.ppk" 

Cela pourrait nous faire prendre de l’avance, mais pour exécuter un script ssh sur le serveur Ubuntu, nous ajoutons le chemin complet à la fin de la commande Plink.

"C:\Program Files (x86)\Plink\plink.exe" -ssh ubuntu@xx.xx.xx.xx -i "C:\Program Files (x86)\Plink\ssh certs\aws-ubuntu.ppk" /var/www/deploy-dev-ui.sh

Et voilà, cher lecteur, c’est Plink.

Comprendre NODE_ENV

NODE_ENV est une variable d’environnement rendue populaire par expressjs. Avant de démarrer l’instance node, définissez le NODE_ENV à l’environnement. Dans le code, vous pouvez charger des fichiers spécifiques basés sur l’environnement.

Définir NODE_ENV
Linux & Mac: export NODE_ENV=PROD
Windows: set NODE_ENV=PROD

La variable d’environnement est récupérée à l’intérieur d’une instance Nodejs en utilisant process.env.NODE_ENV.

exemple

var environment = process.env.NODE_ENV

ou avec expressjs

app.get('env')

*Note : app.get('env') par défaut à “development”.

Rassembler le tout

Nodejs, PM2, Nginx et Plink sont installés et fonctionnent espérons-le. Nous devons maintenant rassembler toutes ces pièces en une solution d’intégration continue.

Clonez votre dépôt GitHub dans /var/www/yourdomain.com. Bien que SSH soit plus sécurisé que HTTPS, je recommande d’utiliser HTTPS. Je sais que ce n’est pas idéal, mais je n’ai pas pu faire fonctionner Plink avec GitHub sur Ubuntu. Sans entrer dans trop de détails, les formats de certificat SSH de Plink et GitHub sont différents et appeler GitHub via Plink à travers SSH n’a pas fonctionné. Si vous pouvez résoudre le problème, faites-le moi savoir !

Pour rendre le pull GitHub automatique, le nom d’utilisateur et le mot de passe devront faire partie de l’url d’origine.

Voici comment vous définissez votre url d’origine. Bien sûr, vous devrez substituer vos informations où approprié.

git remote set-url origin  https://username:password@github.com/username/yourdomain.git

Clonez votre dépôt.

cd /var/www/yourdomain.com
git clone https://username:password@github.com/username/yourdomain.git .

Notez que si ce répertoire n’est pas complètement vide, y compris les fichiers cachés, Git ne clonera pas le dépôt dans ce répertoire.

Pour trouver les fichiers cachés dans le répertoire, exécutez cette commande

ls -a

Pour la colle, nous utilisons un script shell. Voici une copie de mon script.

#!/bin/bash

echo "> Current PM2 Apps"
pm2 list

echo "> Stopping running API"
pm2 stop api.dev

echo "> Set Environment variable."
export NODE_ENV=DEV

echo "> Changing directory to dev.momentz.com."
cd /var/www/yourdomain.com

echo "> Listing the contents of the directory."
ls -a

echo "> Remove untracked directories in addition to untracked files."
git clean -f -d

echo "> Pull updates from Github."
git pull

echo "> Install npm updates."
sudo npm install

echo "> Transpile the ECMAScript 2015 code"
gulp babel

echo "> Restart the API"
pm2 start transpiled/www.js --name api.dev

echo "> List folder directories"
ls -a

echo "> All done."

Je lance ce script shell avec TeamCity, mais vous pouvez le lancer avec n’importe quoi.

Voici la commande brute.

"C:\Program Files (x86)\Plink\plink.exe" -ssh ubuntu@xx.xx.xx.xx -i "C:\Program Files (x86)\Plink\ssh certs\aws-ubuntu.ppk" /var/www/deploy-yourdomain.sh
exit
>&2

C’est tout.

En conclusion

Ce processus a quelques bords rugueux… J’espère polir ces bords avec le temps. Si vous avez des suggestions, veuillez les laisser dans les commentaires.

Ce document est dans mon dépôt GitHub. Les technologies changent, donc si vous trouvez une erreur, veuillez la mettre à jour. Je mettrai alors à jour cet article.

Auteur : Chuck Conway se spécialise dans l’ingénierie logicielle et l’IA générative. Connectez-vous avec lui sur les réseaux sociaux : X (@chuckconway) ou visitez-le sur YouTube.

↑ Retour en haut

Vous pourriez aussi aimer