Articles
Configuration de l'intégration continue sur Ubuntu avec Nodejs
15 août 2015 • 12 min de lecture
J’ai versé du sang, de la sueur et des larmes pour vous apporter cela. J’ai souffert de la chaleur torride de la Vallée de la Mort et j’ai gravi les pics 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 fais un lien vers le travail original.
Cet article suppose que vous savez vous déplacer sous Linux.
Je n’ai pas pu trouver un guide complet sur l’hébergement et la gestion des 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 en mesure de configurer votre propre serveur Ubuntu et d’avoir Nodejs déployé via un serveur d’intégration continue.
Environnement
J’utilise TeamCity sur Windows qui déploie ensuite le code de 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. D’abord, assurez-vous que le port 80 est ouvert. J’ai commis 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 à partir de la source
Nodejs est une technologie serveur utilisant le moteur JavaScript V8 de Google. Depuis sa sortie en 2010, elle est devenue très populaire.
Les instructions suivantes proviennent à l’origine d’un article de Digital Ocean.
Vous avez toujours la possibilité d’installer Nodejs à partir d’apt-get, mais il sera quelques versions en retard. Pour obtenir les dernières versions, installez Nodejs à partir de la source.
À 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 la source et installé Nodejs.
Connectez-vous à votre serveur. Nous allons commencer par mettre à jour les listes de paquets.
sudo apt-get update
Je vous suggère également de mettre à niveau tous les paquets. Ce n’est pas nécessaire pour Nodejs, mais c’est une bonne pratique de garder votre serveur à jour.
sudo apt-get upgrade
Votre serveur est à jour. Il est temps de télécharger la source.
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
Nodejs peut agir comme serveur web, mais ce n’est pas ce que je voudrais exposer au monde. Un serveur web industriel, durci 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 vous demandez peut-être pourquoi nous avons besoin de plus d’une instance de Nodejs en cours d’exécution en même temps. C’est une question juste… Dans mon scénario, j’ai un serveur et je dois exécuter DEV, QA et PROD sur la même machine. Ouais, je sais que ce n’est pas idéal, mais je ne veux pas mettre en place 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 a été 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 faites pas et que vous voulez utiliser différents sous-dossiers, c’est possible et très facile à faire. Je ne vais pas couvrir ce scénario ici. Il y a beaucoup 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 à /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. Enregistrez 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 simple application node et enregistrez-la dans /var/www/yourdomain.com/app.js et exécutez-la.
Voici une simple application nodejs 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, lorsque vous accédez à 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 modifier le nom en amont, le port et le domaine dans votre nouveau fichier de configuration Nginx. L’adresse proxy_pass doit correspondre au nom en amont dans le fichier de configuration nginx. Regardez le nom en amont et la valeur proxy_pass et vous verrez ce que je veux dire.
Pour résumer, nous avons installé NodeJS à partir de la source et nous venons de terminer l’installation de 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 grand-chose. C’est une partie de son attrait. L’inconvénient, c’est que vous devez fournir les couches devant. PM2 est l’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 également 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 allons commencer 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
Cela ajoute votre application à la liste des processus de PM2. Cette liste est affichée chaque fois qu’une application est démarrée.

Dans cet exemple, deux applications Nodejs sont en cours d’exécution. L’une appelée api.dev et api.pre.
PM2 attribue automatiquement le nom de l’application au « App name » dans la liste.
Par défaut, PM2 ne se configure pas pour démarrer au redémarrage du serveur. La commande est différente pour les différentes saveurs de Linux. Je suis sur Ubuntu, donc j’exécuterai la commande Ubuntu.
pm2 start ubuntu
Nous n’avons pas tout à fait terminé. Nous devons ajouter un chemin au binaire PM2. Heureusement, la sortie de la commande précédente nous dit comment faire.
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êt d’une application par le nom de l’application
pm2 stop example
Redémarrage par le nom de l’application
pm2 restart example
Liste des applications actuelles gérées par PM2
pm2 list
Spécification d’un nom au 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 lancer avec PM2. Pour en savoir plus sur les capacités de PM2, visitez le GitHub Repo.
Configuration et utilisation de Plink
Vous vous demandez probablement « Qu’est-ce que c’est que Plink au nom de la vache de Betsey ? » C’est du moins ce que j’ai pensé. Je ne suis toujours pas sûr de ce que j’en pense. Je n’ai jamais vu quelque chose comme ça.
Avez-vous déjà regardé le film Wall-e ? Wall-e sort une cuillère-fourchette. D’abord, il essaie de la mettre avec les fourchettes, mais ça ne rentre pas et puis il essaie de la mettre avec les cuillères, mais ça 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 que vous avez 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 vous 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 devancer un peu, 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 c’est ça, cher lecteur, Plink.
Comprendre NODE_ENV
NODE_ENV est une variable d’environnement popularisée par expressjs. Avant de démarrer l’instance node, définissez NODE_ENV sur l’environnement. Dans le code, vous pouvez charger des fichiers spécifiques en fonction de l’environnement.
Setting NODE_ENV
Linux & Mac: export NODE_ENV=PROD
Windows: set NODE_ENV=PROD
La variable d’environnement est récupérée dans 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 ».
Tout assembler
Nodejs, PM2, Nginx et Plink sont installés et j’espère qu’ils fonctionnent. Nous devons maintenant rassembler tous ces éléments dans une solution d’intégration continue.
Clonez votre référentiel 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 l’appel de GitHub via Plink via SSH n’a pas fonctionné. Si vous pouvez résoudre le problème, faites-le moi savoir !
Pour rendre le tirage GitHub sans intervention, le nom d’utilisateur et le mot de passe devront faire partie de l’URL d’origine.
Voici comment définir 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 référentiel.
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 référentiel 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 aspérités… J’espère polir ces aspérités avec le temps. Si vous avez des suggestions, veuillez les laisser dans les commentaires.
Ce document se trouve dans mon GitHub Repository. Les technologies changent, donc si vous trouvez une erreur, veuillez la mettre à jour. Je mettrai alors à jour cet article.
Auteur : Chuck Conway est un ingénieur IA avec près de 30 ans d’expérience en génie logiciel. Il construit des systèmes IA pratiques — pipelines de contenu, agents d’infrastructure et outils qui résolvent des problèmes réels — et partage ce qu’il apprend en chemin. Connectez-vous avec lui sur les réseaux sociaux : X (@chuckconway) ou visitez-le sur YouTube et sur SubStack.