Skip to content

Innlegg

Oppsett av Continuous Integration på Ubuntu med Nodejs

15. august 2015 • 11 min lesing

Oppsett av Continuous Integration på Ubuntu med Nodejs

Jeg gikk gjennom blod, svette og tårer for å bringe dette til deg. Jeg led under den brennende varmen i Death Valley og besteg toppene av Mount McKinley. Jeg har ofret mye.

Mye av innholdet som deles i innlegget er ikke mitt originale arbeid. Der jeg kan, lenker jeg tilbake til det originale arbeidet.

Denne artikkelen forutsetter at du kan navigere rundt i Linux.

Jeg kunne ikke finne en omfattende guide om hosting og administrasjon av Nodejs-applikasjoner på Ubuntu i produksjon. Jeg har samlet flere artikler om emnet. Innen slutten av denne artikkelen håper jeg du vil kunne sette opp din egen Ubuntu-server og ha Nodejs som distribueres via en continuous integration-server.

Miljø

Jeg bruker TeamCity på Windows som deretter distribuerer kode fra GitHub til Ubuntu som er vert 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

Oppsett av Ubuntu

Jeg skal ikke gå inn i detaljer her. Amazon Web Services (AWS) gjør dette ganske enkelt. Det spiller ingen rolle hvor det er eller om det er på din egen server.

Jeg møtte noen få fallgruver. Først må du sørge for at port 80 er åpen. Jeg gjorde den dumme feilen å prøve å koble til med port 80 lukket. Når jeg oppdaget feilen min, følte jeg meg som en neshorns rumpe.

Installering av Nodejs fra kilde

Nodejs er en serverteknologi som bruker Googles V8 JavaScript-motor. Siden utgivelsen i 2010 har den blitt svært populær.

Følgende instruksjoner 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 delen vil vi ha lastet ned den nyeste stabile versjonen av node (fra denne artikkelen), vi vil ha bygget kilden og installert Nodejs.

Logg inn på serveren din. Vi starter med å oppdatere pakkelisten.

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 ~

Fra 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 nylig opprettede mappen

cd node-v*

Konfigurer og bygg Nodejs.

./configure

make

Installer Nodejs

sudo make install

For å fjerne de nedlastede og ekstraherte filene. Selvfølgelig er dette valgfritt.

cd ~

rm -rf node-v*

Gratulerer! Nodejs er nå installert! Og det var ikke særlig vanskelig.

Oppsett av Nginx

Kilde

Nodejs kan fungere som en webserver, men det er ikke det jeg ville eksponert for verden. En industriell, herdet, funksjonsrik webserver er bedre egnet for dette. 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 portviderekobling.

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 ikke ideelt, men jeg vil ikke sette opp 3 servere for hvert miljø.

La oss starte med å installere Nginx

sudo -s

add-apt-repository ppa:nginx/stable

apt-get update 

apt-get install nginx

Når Nginx er installert, må vi sette opp domenene. Jeg skal anta at du vil ha hver av nettstedene dine på sin egen domene/underdomene. Hvis du ikke gjør det og vil bruke forskjellige undermapper, er det mulig og veldig enkelt å gjøre. Jeg skal ikke dekke det scenarioet her. Det er mye dokumentasjon om hvordan du gjør det. Det er veldig lite dokumentasjon om oppsett av forskjellige domener og portviderekobling til de tilsvarende Nodejs-instansene. Dette er det jeg skal 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 den nylig opprettede filen

# IP-adressen(e) som Node-serveren 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 de riktige hodene
    # 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 din faktiske domene. Lagre og avslutt redigeringsprogrammet.

Opprett en symbolsk lenke til denne filen i sites-enabled-mappen.

cd /etc/nginx/sites-enabled/ 

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

For å teste at alt fungerer korrekt, opprett en enkel node-app og lagre den på /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 korrekt, 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 den nye Nginx-konfigurasjonsfilen. Proxy_pass-adressen må samsvare med upstream-navnet i nginx-konfigurasjonsfilen. Se på upstream-navnet og proxy_pass-verdien, og du vil se hva jeg mener.

For å oppsummere, vi har installert NodeJS fra kilde og vi har nettopp ferdig installert Nginx. Vi har konfigurert og testet portviderekobling med Nginx og Nodejs

Installering av PM2

Du spør kanskje “Hva er PM2?” som jeg gjorde da jeg først hørte om det. PM2 er en prosesshåndterer for Nodejs-applikasjoner. Nodejs kommer ikke med mye. Dette er en del av appellen. Ulempen med dette er at du må levere lagene foran det. PM2 er ett 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å en omfattende prosess for utviklingslivssyklus. Vi skal ikke dekke dette aspektet av PM2. Jeg oppfordrer deg til å lese godt skrevet dokumentasjon.

Forutsatt at du er logget inn på terminalen, starter vi med å installere PM2 via NPM. Npm er Nodejs-pakkebehandler (npm). Det ble installert da du installerte Nodejs.

sudo npm install pm2 -g

Det er det. PM2 er nå installert.

Bruk av PM2

PM2 er enkelt å bruke.

Hello world for PM2 er enkelt.

pm2 start hello.js

Dette legger applikasjonen din til PM2s prosessliste. Denne listen blir utdata 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 PM2 seg ikke til å starte når serveren starter på nytt. Kommandoen er forskjellig for de forskjellige smakene av Linux. Jeg kjører på Ubuntu, så jeg skal kjøre Ubuntu-kommandoen.

pm2 start ubuntu

Vi er ikke helt ferdig ennå. Vi må legge til en bane til PM2-binæren. Heldigvis forteller utdataene fra den forrige kommandoen 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
Kjør kommandoen som ble generert (lignende den uthevede utdataene ovenfor) for å sette opp PM2 til å starte ved oppstart (bruk kommandoen fra din egen utdata):

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

Eksempler på annen PM2-bruk (valgfritt)

Stoppe en applikasjon etter appnavn

pm2 stop example

Omstart etter appnavn

pm2 restart example

Liste over gjeldende applikasjoner administrert av PM2

pm2 list

Angi et navn når du starter en prosess. Hvis du ringer, bruker PM2 JavaScript-filen som navn. Dette fungerer kanskje ikke for deg. Her er hvordan du angir navnet.

pm2 start www.js --name api.pre

Det burde være nok til å komme i gang med PM2. For å lære mer om PM2s muligheter, besøk GitHub Repo.

Du tenker sannsynligvis, “Hva i all verden er Plink?” Det er i det minste det jeg tenkte. 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 gafler, men det passer ikke, og så prøver han å legge den med skjeer, men det passer ikke. Vel, det er Plink. Det er en krysning mellom Putty (SSH) og Windows-kommandolinjen.

Plink lar deg i utgangspunktet kjøre bash-kommandoer via Windows-kommandolinjen mens du er logget inn i et Linux (og sannsynligvis Unix) skall.

Start med å laste ned Plink. Det er bare en kjørbar fil. Jeg anbefaler å legge den i C:/Program Files (x86)/Plink. Vi trenger å referere til det senere.

Hvis du kjører en Ubuntu-instans i AWS, har du allerede 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 angi brukernavn og passord på kommandolinjen og trenger ikke å bekymre deg om ssh-sertifikatene.

Her er en eksempel-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 den komplette banen 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åelse av NODE_ENV

NODE_ENV er en miljøvariabel som er gjort populær av expressjs. Før du starter node-instansen, setter du NODE_ENV til miljøet. I koden kan du laste inn spesifikke filer basert på miljøet.

Innstilling av 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') er som standard “development”.

Å bringe det hele sammen

Nodejs, PM2, Nginx og Plink er installert og forhåpentligvis fungerer. Vi må nå bringe alle disse delene sammen til en continuous integration-løsning.

Klon GitHub-repositoriet ditt i /var/www/yourdomain.com. Selv om SSH er mer sikkert enn HTTPS, anbefaler jeg å bruke HTTPS. Jeg vet at dette ikke er ideelt, men jeg kunne ikke få Plink til å fungere med GitHub på Ubuntu. Uten å gå inn i for mye 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-pullingen handsfree, må brukernavn og passord være en del av origin-URL-en.

Her er hvordan du setter origin-URL-en. Selvfølgelig må du erstatte informasjonen din der det er passende.

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 mappen ikke er helt tom, inkludert skjulte filer, vil ikke Git klone repo-en til denne mappen.

For å finne skjulte filer i mappen, 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 GitHub Repository mitt. Teknologier endres, så hvis du finner en feil, vennligst oppdater den. Jeg vil da oppdatere dette innlegget.

Forfatter: Chuck Conway er en AI-ingeniør med nesten 30 års erfaring innen programvareutvikling. Han bygger praktiske AI-systemer—innholdspipelines, infrastrukturagenter og verktøy som løser virkelige problemer—og deler det han lærer underveis. Koble til ham på sosiale medier: X (@chuckconway) eller besøk ham på YouTube og på SubStack.

↑ Tilbake til toppen

Du kan også like