Creatie van CI CD pipeline via VisualStudio Team Services - lab9k/Orga GitHub Wiki
- Auteur: Pieter-Jan Philips
- Publicatie datum: 06/07/2018
Deze wiki pagina geeft een gedetailleerd stramien bij het opzetten van een Continuous Integration / Continuous Deployment workflow op de Lab9K Kubernetes cluster. De Kubernetes cluster wordt gehost op de Azure Cloud Services van Lab9K. Hoe deze Kubernetes cluster aangemaakt is kan je bekijken in de wiki pagina "Creatie van een Kubernetes cluster en Docker images". De toegang tot dit portaal is noodzakelijk voor de succesvolle uitvoering van deze workflow. Zorg dus dat je de juiste credentials bezit alvorens aan de slag te gaan. Meer info kan je verkrijgen bij de Lab9K CEO Hans Fraiponts en bij Datacenter engineer Pieter-Jan Philips.
- Werkende applicatie met versie controle via GitHub
- Repo op Lab9K GitHub account.
- Repo met master, development en release branch.
- Docker geïnstalleerd op uw pc
- Toegang tot het Lab9K Azure portaal.
- Toegang tot de Lab9K Visual Studio Team Services.
- Creatie van CI/CD pipeline via VisualStudio Team Services - Info
In deze stap gaan we de applicatie omvormen tot een docker image. Het volgende voorbeeld zal gegeven worden voor een node.js/Express applicatie.
Maak een nieuw bestand aan genaamd Dockerfile aan in de root folder van het project. De inhoud van dit bestand ziet er als volgt uit: (voorbeeld voor een NodeJs applicatie)
FROM node:8.9-alpine
ENV NODE_ENV development
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm install --development --silent
COPY . .
EXPOSE 3000
CMD npm start
Enkel de fields die mogen worden aangepast worden bekeken. De andere moeten onaangetast blijven.
- Nodejs versie: bekijk NodeJS versies op Dockerhub en neem de versie die je terugvind op uw lokaal systeem via het commando
node --version
.
FROM node:8.9-alpine
- Nodejs environment variabele: indien de applicatie in testfase zit mag je hier development laten staan. Indien men wenst over te gaan naar production maakt men hier production van.
ENV NODE_ENV development
- Nodejs poort: deze poort is gespecifierd in de
bin/www
file. Indien het project opstart op een andere poort moet je deze variabele aanpassen.
EXPOSE 3000
Nu men de Dockerfile heeft toegevoegd aan het project kan men de dockerimage opbouwen. Zorg ervoor dat docker is geinstalleerd op het systeem en dat de docker deamon opgestart is.
Om de Dockerimage te bouwen opent men de terminal en voert men volgend commando uit: Vervang hier de projectnaam door de naam van het project zonder spatie!
docker build -t localTestImage/<projectnaam> .
Na het succesvol uitvoeren hiervan heeft men een image van de applicatie. Om deze container nu lokaal op te starten voert men dit uit: (lees eerst de uitleg bij de variabelen)
docker run --rm -p 80:3000 localTestImage/<projectnaam>
- De
--rm
zal er voor zorgen dat de container na het stoppen van dit commando zal verwijderd worden. Met andere woorden moet de terminal blijven openstaan tijdens het runnen van de container. - De
-p 80:3000
zal er voor zorgen dat er een link is op de localhost:80 die alles doorstuurd naar de container op poort 3000 (Dit is de poort die men gespecifierd heeft in de Dockerfile)
Na het uitvoeren van bevenstaand commando kan men de logs van de container bekijken in de terminal en surfen naar localhost:80 om de werking van de applicatie te bekijken.
Enkel na het correct werken van de docker image en Container kan men verder gaan met het opbouwen van de CI/CD workflow.
De credentials kan je verkrijgen bij Hans. Log hiermee in op het Azure Developer portaal en ga naar de Kubernetes resource.
-
Om lokaal connectie te maken met de kubernetes cluster heeft men nood aan de Azure CLI tool: Installatie hiervan vind je terug op deze link.
-
Na de installatie hiervan gaan we kubectl installeren en connectie maken met de K8S cluster. Volgend commando zal kubectl installeren:
az aks install-cli
- Volgend commando zal de nodige credentials ophalen en in de kubectl configfile
~/.kube/config
zetten:
az aks get-credentials --resource-group lab9k-kubernetes-resource-group --name lab9k-kubernetes-cluster
- Na het installeren van deze software en creds kan men aan de hand van volgend commando het cluster dashboard bekijken: Meer info over de kubernetes Dashboard vind men hier.
az aks browse --resource-group lab9k-kubernetes-resource-group --name lab9k-kubernetes-cluster
Na deze stap moet je aan de hand van het commando
kubectl cluster-info
de info over de cluster kunnen bekijken.
De CI/CD workflow wordt aangemaakt op het Lab9K Visualstudio Team services portaal. De credentials zijn dezelfde als die van het Azure portaal.
Om van start te gaan navigeer je naar het project met de naam CI-CD
en ga dan door naar het build and release tabblad. En vervolgens naar builds.
De Continuous Integration pipeline bestaat uit 2 delen, in het eerste deel gaat men de build fase aanmeken en testen, en in het 2de deel gaan we de build oploaden naar de Lab9K DockerHub.
Om deze 2 fases aan te maken starten we met een nieuwe build.
- Klink hiervoor op de + NEW knop rechts bovenaan.
- Bij "Select a source" kies je voor GitHub
- Bij "Repository" klik je op de 3 puntjes rechts en klik vervolgens op "load all repositories". Selecteer vervolgens de juiste repo.
- bij "Default branch for manual and scheduled builds" selecteer je de branch waar je de build voor wil aanmaken.
- Klik op continue.
- Bij "Select a template" zoek je in de balk naar Docker Container Template
- Klik apply
In volgende figuur ziet men onder fase 1 de 2 fases.
Verander hier de naam naar <project naam> - Container build and push to Docker hub
, en zorg dat de Agent-queue op Hosted Linux Preview
staat.
Onder de build fase, zorg ervoor dat de waaren overeenkomen met die in de afbeelding:
Onder de push fase, zorg ervoor dat de waaren overeenkomen met die in de afbeelding:
Indien je applicatie extra variabelen nodig heeft om te kunnen builden kan je deze hier aanvullen.
Om tenslotte de Continuous Integration automatisch te laten gebeuren moet je onder het tabblad Triggers de CI aan zetten.
Om de build fase te testen druk je ten slotte 2 maal op "Save and Queue".
Na deze eerste build fase moet met controleren of de image correct is opgeload naar dockerhub, bekijk hier of de repository correct is aangemaakt en of Last pushed waarde op een aantal seconden geleden staat. Indien dit alles in orde is kan je door gaan naar de Continuous Deployment fase.
Indien je enkel de images wil maken of wil kijken of de build succesvol is kan je bij deze stap stoppen.
Om de applicatie te laten draaien in de Lab9K Kubernetes cluster hebben we nood aan een deployment file. Om de applicatie toegankelijk te maken naar de buitenwereld hebben we nood aan een Service file. Deze bestanden worden in volgende paragrafen besproken. Deze 2 bestanden dienen toegevoegd te worden aan de root van het project.
Maak de file <projectName>deploymentfile.yaml
aan met volgende inhoud in de root van het project. Let op dat alle in te vullen waarden kleine letters moeten zijn en geen spaties mogen bevatten.
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: <projectName>
labels:
component: <projectName>
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
selector:
matchLabels:
app: <projectName>
template:
metadata:
labels:
app: <projectName>
spec:
containers:
- name: <projectName>
image: lab9k/<projectName>:latest
imagePullPolicy: Always
ports:
- containerPort: 3000
Maak de file <projectName>service.yaml
aan met volgende inhoud in de root van het project. Pas hier de variabele projectName aan met dezelfde waarde als in de deploymentfile!
apiVersion: v1
kind: Service
metadata:
name: <projectName>-lb
labels:
app: <projectName>-lb
spec:
ports:
- port: 80
targetPort: 3000
selector:
app: <projectName>
type: LoadBalancer
Als laatste stap gaan we de update van de Dockerhub repository gaan gebruiken als trigger om de deploymentfile aan te passen in de cluster.
Klik bij de Artifacts op + Add Als eerste artifact gaan we de Lab9K Docker hub gaan toevoegen. Bij repository selecteer je de repository van de applicatie die je wenst te automatiseren.
Klik bij de Artifacts nogmaals op + Add Om aan de depolyments file te kunnen moeten we hier ook toegang hebben tot de github repo. Zorg nogmaals dat alle velden overeenkomen met degene in de foto. Bij Source (repository) kies je de juiste repo en bij Source alias voeg je _files toe aan de naam.
Om de DC nu te automatiseren klik je op de bliksemschicht aan de dockerhub artifact en zet je de schakelaar aan. Nu zal de CD pipeline automatisch runnen wanneer de docker image op dockerhub geupdate wordt.
- Bij de "Select a template" selecter je "Deploy to a Kubernetes cluster"
- Vul bij environment name "<projectName> DEV Deployment" in.
- klik vervolgens op "1 phase, 1 task"
Maak 3 fasen aan genaamd: "Kubectl delete old deployment", "Kubectl apply new deployment" en "Kubectl update enviroment vars" Dit kan je doen door op de plus te klikken en voor de eerste 2 een "Deploy to kubernetes" template te gebruiken en voor de laatste een "Kubernetes general task".
In de eerste fase gaat men de oude deployment verwijderen. Zorg ervoor dat elke waarde in de foto overeenkomt met de waarde in de release fase. De waarde de van de Arguments moet je veranderen door lokaal het commando uit te voeren kubectl get deployments
en hier de deployment.apps/ waarde te gebruiken.
Aangezien deze deployment file niet aanwezig kan zijn zal een delete ook falen. Verander hiervoor onder het tabblad Control Options de Run this task waarde op Even if a previous task has failed, unless the deployment was canceled.
Vul alle velden in zoals op de foto en selecteer use configuration file en selecteer de deploymentfile uit de github artifact folder.
Vul alle velden in zoals op de foto.
Bij arguments geef je de argumenten in die je nodig hebt bij het bouwen van de applicatie. Geef deze in in volgende vorm:
env deployment.apps/<deployment> KEY1=VALUE1 KEY2=VALUE2
Bij deze is de Continuous Deployment opgezet en is de applicatie bijna klaar om te weken met kubernetes.
Voer nu lokaal het volgende commando uit.
Kubectl apply -f <projectname>deploymentfile.yaml
kubectl create -f <projectname>service.yaml
Deze zullen automatisch een initiele deployment en een public ip aanmaken voor de applicatie.
kubectl get all
Geeft ons een overzicht en de publieke ip adressen van de applicaties.
Na deze hele configuratie zal de volgende workflow van start gaan.