Innlegg
Sette opp kontinuerlig integrasjon på Ubuntu med Nodejs
15. august 2015 • 11 min lesing

Jeg gikk gjennom blod, svette og tårer for å bringe dette til deg. Jeg led den brennende varmen i Death Valley og beseiret toppene av Mount McKinley. Jeg har ofret mye.
Mye av innholdet som deles i dette innlegget er ikke mitt originale arbeid. Der jeg kan, lenker jeg tilbake til det originale arbeidet.
Denne artikkelen forutsetter at du kan navigere i Linux.
Jeg kunne ikke finne en omfattende guide om hosting og administrasjon av Nodejs-applikasjoner på Ubuntu i produksjonskapasitet. Jeg har samlet flere artikler om emnet. Ved slutten av denne artikkelen håper jeg at du vil kunne sette opp din egen Ubuntu-server og ha Nodejs som distribueres via en kontinuerlig integrasjonsserver.
Miljø
Jeg bruker TeamCity på Windows som deretter distribuerer kode fra GitHub til Ubuntu hostet på AWS.
Teknologier
For denne artikkelen brukte jeg følgende teknologier:
- Ubuntu 14.04 på AWS
- Plink 0.64
- TeamCity 9.1
- GitHub
- Nginx 1.9.3
Sette opp Ubuntu
Jeg går ikke i detalj her. Amazon Web Services (AWS) gjør dette ganske enkelt å gjøre. Det spiller ingen rolle hvor det er eller om det er på din egen server.
Jeg støtte på noen fallgruver. Først, sørg for at port 80 er åpen. Jeg gjorde den tåpelige feilen å prøve å koble til med port 80 stengt. Når jeg oppdaget feilen min, følte jeg meg som en neshorns rumpe.
Installere Nodejs fra kilde
Nodejs er en serverteknologi som bruker Googles V8 javascript-motor. Siden utgivelsen i 2010 har den blitt svært populær.
De følgende instruksjonene kom opprinnelig fra et Digital Ocean innlegg).
Du har alltid muligheten til å installere Nodejs fra apt-get, men det vil være noen versjoner bak. For å få de nyeste bitene, installer Nodejs fra kilden.
Ved slutten av denne seksjonen vil vi ha lastet ned den nyeste stabile versjonen av node (per denne artikkelen), vi vil ha bygget kilden og installert Nodejs.
Logg inn på serveren din. Vi starter med å oppdatere pakkelistene.
sudo apt-get update
Jeg foreslår også at du oppgraderer alle pakkene. Dette er ikke nødvendig for Nodejs, men det er god praksis å holde serveren oppdatert.
sudo apt-get upgrade
Serveren din er helt oppdatert. Det er på tide å laste ned kilden.
cd ~
Per skrivingen er 12.7 den nyeste stabile utgivelsen av Nodejs. Sjekk ut nodejs.org for den nyeste versjonen.
wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz
Pakk ut arkivet du har lastet ned.
tar xvf node-v*
Flytt inn i den nyopprettede katalogen
cd node-v*
Konfigurer og bygg Nodejs.
./configure
make
Installer Nodejs
sudo make install
For å fjerne de nedlastede og utpakkede filene. Selvfølgelig er dette valgfritt.
cd ~
rm -rf node-v*
Gratulerer! Nodejs er nå installert! Og det var ikke så vanskelig.
Sette opp Nginx
Nodejs kan fungere som en webserver, men det er ikke det jeg ville eksponere til verden. En industriell, herdet, funksjonsrik webserver er bedre egnet for denne oppgaven. Jeg har vendt meg til Nginx for denne oppgaven.
Det er en moden webserver med funksjonene vi trenger. For å kjøre mer enn én instans av Nodejs, trenger vi portvideresending.
Du tenker kanskje, hvorfor trenger vi mer enn én instans av Nodejs som kjører samtidig. Det er et rettferdig spørsmål… I mitt scenario har jeg én server og jeg må kjøre DEV, QA og PROD på samme maskin. Ja, jeg vet det ikke er ideelt, men jeg vil ikke sette opp 3 servere for hvert miljø.
For å starte, la oss installere Nginx
sudo -s
add-apt-repository ppa:nginx/stable
apt-get update
apt-get install nginx
Når Nginx er vellykket installert, må vi sette opp domenene. Jeg antar at du vil ha hver av nettstedene dine på sitt eget domene/subdomene. Hvis du ikke gjør det og vil bruke forskjellige undermapper, er det gjennomførbart og veldig enkelt å gjøre. Jeg kommer ikke til å dekke det scenariet her. Det er tonnevis av dokumentasjon om hvordan man gjør det. Det er svært lite dokumentasjon om å sette opp forskjellige domener og portvideresending til de tilsvarende Nodejs-instansene. Dette er det jeg vil dekke.
Nå som Nginx er installert, opprett en fil for yourdomain.com på /etc/nginx/sites-available/
sudo nano /etc/nginx/sites-available/yourdomain.com
Legg til følgende konfigurasjon i din nyopprettede fil
# IP-en(e) som node-serveren din kjører på. Jeg valgte port 9001.
upstream app_myapp1 {
server 127.0.0.1:9001;
keepalive 8;
}
# nginx-serverinstansen
server {
listen 80;
server_name yourdomain.com;
access_log /var/log/nginx/yourdomain.log;
# send forespørselen til node.js-serveren med riktige headere
# og mye mer kan legges til, se nginx-konfigurasjonsalternativer
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;
}
}
Sørg for å erstatte “yourdomain.com” med ditt faktiske domene. Lagre og avslutt editoren din.
Opprett en symbolsk lenke til denne filen i sites-enabled-katalogen.
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com
For å teste at alt fungerer riktig, opprett en enkel node-app og lagre den til /var/www/yourdomain.com/app.js
og kjør den.
Her er en enkel nodejs-app hvis du ikke har en for hånden.
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/');
La oss starte Nginx på nytt.
sudo /etc/init.d/nginx restart
Ikke glem å starte Nodejs-instansen din, hvis du ikke allerede har gjort det.
cd /var/www/yourdomain/ && node app.js
Hvis alt fungerer riktig, når du navigerer til yourdomain.com vil du se “Hello World.”
For å legge til et annet domene for en annen Nodejs-instans må du gjenta trinnene ovenfor. Spesifikt må du endre upstream-navnet, porten og domenet i din nye Nginx-konfigurasjonsfil. Proxy_pass-adressen må matche upstream-navnet i nginx-konfigurasjonsfilen. Se på upstream-navnet og proxy_pass-verdien så vil du se hva jeg mener.
For å oppsummere har vi installert NodeJS fra kilde og vi har nettopp fullført installasjonen av Nginx. Vi har konfigurert og testet portvideresending med Nginx og Nodejs
Installere PM2
Du lurer kanskje på “Hva er PM2?” som jeg gjorde da jeg først hørte om det. PM2 er en prosessbehandler for Nodejs-applikasjoner. Nodejs kommer ikke med mye. Dette er en del av appellen. Ulempen med dette er, vel, du må tilby lagene foran det. PM2 er et av disse lagene.
PM2 administrerer livet til Nodejs-prosessen. Når den avsluttes, starter PM2 den på nytt. Når serveren starter på nytt, starter PM2 alle Nodejs-prosessene for deg. Den har også omfattende utviklingslivssyklusprosess. Vi kommer ikke til å dekke dette aspektet av PM2. Jeg oppfordrer deg til å lese den godt skrevne dokumentasjonen.
Forutsatt at du er logget inn i terminalen, starter vi med å installere PM2 via NPM. Npm er Nodejs pakkebehandler (npm). Den ble installert da du installerte Nodejs.
sudo npm install pm2 -g
Det er det. PM2 er nå installert.
Bruke PM2
PM2 er enkelt å bruke.
Hello world for PM2 er enkelt.
pm2 start hello.js
Dette legger applikasjonen din til PM2s prosessliste. Denne listen vises hver gang en applikasjon startes.
I dette eksemplet kjører det to Nodejs-applikasjoner. En kalt api.dev og api.pre.
PM2 tildeler automatisk navnet på appen til “App name” i listen.
Ut av boksen konfigurerer ikke PM2 seg selv til å starte opp når serveren starter på nytt. Kommandoen er forskjellig for de forskjellige Linux-variantene. Jeg kjører på Ubuntu, så jeg vil utføre Ubuntu-kommandoen.
pm2 start ubuntu
Vi er ikke helt ferdige ennå. Vi må legge til en sti til PM2-binærfilen. Heldigvis forteller utdataene fra forrige kommando oss hvordan vi gjør det.
Utdata:
[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
Eksempler på andre PM2-bruksområder (valgfritt)
Stoppe en applikasjon ved app-navnet
pm2 stop example
Starte på nytt ved app-navnet
pm2 restart example
Liste over gjeldende applikasjoner administrert av PM2
pm2 list
Spesifisere et navn når du starter en prosess. Hvis du kaller, bruker PM2 javascript-filen som navnet. Dette fungerer kanskje ikke for deg. Her er hvordan du spesifiserer navnet.
pm2 start www.js --name api.pre
Det burde være nok til å få deg i gang med PM2. For å lære mer om PM2s muligheter, besøk GitHub Repo.
Sette opp og bruke Plink
Du tenker sannsynligvis, “Hva i all verden er Plink?” I det minste var det tanken. Jeg er fortsatt ikke sikker på hva jeg skal tenke om det. Jeg har aldri sett noe lignende.
Har du noen gang sett filmen Wall-e? Wall-e trekker ut en spork. Først prøver han å legge den med gaflene, men den passer ikke, og så prøver han å legge den med skjeene, men den passer ikke. Vel, det er Plink. Det er en krysning mellom Putty (SSH) og Windows kommandolinje.
Plink lar deg i bunn og grunn kjøre bash-kommandoer via Windows kommandolinje mens du er logget inn i et Linux (og sannsynligvis Unix) shell.
Start med å laste ned Plink. Det er bare en kjørbar fil. Jeg anbefaler å legge den i C:/Program Files (x86)/Plink
. Vi må referere til den senere.
Hvis du kjører en Ubuntu-instans i AWS. Du vil allerede ha et sertifikat satt opp for Putty (jeg antar at du bruker Putty).
Hvis du ikke gjør det, må du sørge for at du har et kompatibelt ssh-sertifikat for Ubuntu i AWS.
Hvis du ikke bruker AWS, kan du spesifisere brukernavnet og passordet i kommandolinjen og trenger ikke å bekymre deg om ssh-sertifikatene.
Her er et eksempel på kommandolinje som kobler til Ubuntu med 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"
Dette kan være å komme foran oss selv, men for å kjøre et ssh-skript på Ubuntu-serveren legger vi til den komplette stien til slutten av Plink-kommandoen.
"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
Og det, kjære leser, er Plink.
Forstå NODE_ENV
NODE_ENV
er en miljøvariabel gjort populær av expressjs. Før du starter node-instansen, sett NODE_ENV
til miljøet. I koden kan du laste spesifikke filer basert på miljøet.
Sette NODE_ENV
Linux & Mac: export NODE_ENV=PROD
Windows: set NODE_ENV=PROD
Miljøvariabelen hentes inne i en Nodejs-instans ved å bruke process.env.NODE_ENV
.
eksempel
var environment = process.env.NODE_ENV
eller med expressjs
app.get('env')
*Merk: app.get('env')
standardiserer til “development”.
Bringe alt sammen
Nodejs
, PM2
, Nginx
og Plink
er installert og forhåpentligvis fungerer. Vi må nå bringe alle disse bitene sammen til en kontinuerlig integrasjonsløsning.
Klon GitHub-repositoriet ditt i /var/www/yourdomain.com
. Selv om SSH er sikrere enn HTTPS, anbefaler jeg å bruke HTTPS. Jeg vet dette ikke er ideelt, men jeg kunne ikke få Plink til å fungere med GitHub på Ubuntu. Uten å gå for mye i detalj er Plink og GitHub SSH-sertifikatformater forskjellige, og å kalle GitHub via Plink gjennom SSH fungerte ikke. Hvis du kan finne ut av problemet, gi meg beskjed!
For å gjøre GitHub-pullen handsfree, må brukernavnet og passordet være en del av origin-url-en.
Her er hvordan du setter origin-url-en din. Selvfølgelig må du erstatte informasjonen din der det er hensiktsmessig.
git remote set-url origin https://username:password@github.com/username/yourdomain.git
Klon repositoriet ditt.
cd /var/www/yourdomain.com
git clone https://username:password@github.com/username/yourdomain.git .
Merk at hvis denne katalogen ikke er helt tom, inkludert skjulte filer, vil ikke Git klone repo til denne katalogen.
For å finne skjulte filer i katalogen, kjør denne kommandoen
ls -a
For limet bruker vi et shell-skript. Her er en kopi av skriptet mitt.
#!/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."
Jeg starter dette shell-skriptet med TeamCity, men du kan starte med hva som helst.
Her er råkommandoen.
"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
Det er det.
Til slutt
Denne prosessen har noen grove kanter… Jeg håper å polere disse kantene med tiden. Hvis du har forslag, vennligst legg dem igjen i kommentarene.
Dette dokumentet er i mitt GitHub Repository. Teknologier endrer seg, så hvis du finner en feil, vennligst oppdater den. Jeg vil da oppdatere dette innlegget.
Forfatter: Chuck Conway spesialiserer seg på programvareutvikling og Generativ AI. Koble til ham på sosiale medier: X (@chuckconway) eller besøk ham på YouTube.