Creatie van CI CD pipeline via VisualStudio Team Services - lab9k/Orga GitHub Wiki

Creatie van CI/CD pipeline via VisualStudio Team Services

Info

Inleiding

img/workflow.gif

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.

Prerequisites

  • 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.

Workflow index

Workflow

Aanmaken van een docker image

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)

Dockerfile template

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

Dockerfile fields

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

Bouwen van de Docker image en Container

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.

Connectie maken met de Lab9K Azure Kubernetes Server

Verkrijgen van de credentials

De credentials kan je verkrijgen bij Hans. Log hiermee in op het Azure Developer portaal en ga naar de Kubernetes resource.

Installatie van AZCLI en Kubectl

  • 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 Continuous Integration pipeline.

Verkrijgen van de credentials

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.

nav

Aanmaken van de Continuous Integration pipeline

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.

  1. Klink hiervoor op de + NEW knop rechts bovenaan.
  2. Bij "Select a source" kies je voor GitHub
    1. Bij "Repository" klik je op de 3 puntjes rechts en klik vervolgens op "load all repositories". Selecteer vervolgens de juiste repo.
    2. bij "Default branch for manual and scheduled builds" selecteer je de branch waar je de build voor wil aanmaken.
  3. Klik op continue.
  4. Bij "Select a template" zoek je in de balk naar Docker Container Template
  5. Klik apply

In volgende figuur ziet men onder fase 1 de 2 fases.

build

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.

Build fase

Onder de build fase, zorg ervoor dat de waaren overeenkomen met die in de afbeelding:

build

Push fase

Onder de push fase, zorg ervoor dat de waaren overeenkomen met die in de afbeelding:

build

Build variabelen

Indien je applicatie extra variabelen nodig heeft om te kunnen builden kan je deze hier aanvullen.

vars

Triggers

Om tenslotte de Continuous Integration automatisch te laten gebeuren moet je onder het tabblad Triggers de CI aan zetten.

trigger

Finaliseren

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.

De Deployment en Service files

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.

Deployment file

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

Service file

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

De Continuous Deployment pipeline

Als laatste stap gaan we de update van de Dockerhub repository gaan gebruiken als trigger om de deploymentfile aan te passen in de cluster.

build

Aanmaken van de Artifacts

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.

dockerhubartifact

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.

githubartifact

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. cdau

Aanmaken van de Continuous Deployment pipeline

  1. Bij de "Select a template" selecter je "Deploy to a Kubernetes cluster"
  2. Vul bij environment name "<projectName> DEV Deployment" in.
  3. klik vervolgens op "1 phase, 1 task"
    1. 1

Aanmaken verschillende fasen

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".

fases

Fase 1: Kubectl delete old deployment

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.

delete

Fase 2: Kubectl apply new deployment

Vul alle velden in zoals op de foto en selecteer use configuration file en selecteer de deploymentfile uit de github artifact folder.

create

Fase 3: Kubectl update enviroment vars

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

set

Fase 4: Finishing up

Bij deze is de Continuous Deployment opgezet en is de applicatie bijna klaar om te weken met kubernetes.

De finale manuele stap

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.

De flow

Na deze hele configuratie zal de volgende workflow van start gaan.

⚠️ **GitHub.com Fallback** ⚠️