Lab 1 Report
Link naar een succesvolle run van de CI/CD job:
https://gitlab.stud.atlantis.ugent.be/Tinghel/devops-project/-/jobs/24895
Beschrijving van .gitlab-ci.yml
Stage 1: Build
In de build-stage wordt de broncode van het project gecompileerd met Maven. Dit zorgt ervoor dat alle dependencies worden opgehaald en de code klaar is om verder verwerkt te worden. Om dit efficienter te doen werd later caching toegevoegd waarbij de dependencies werden opgeslaan in .m2/repository.
Stage 2: Package
De package-stage bouwt de Quarkus-applicatie en maakt er een container image van die wordt gepusht naar de GitLab Container Registry. Door deze stage wordt de container image telkens automatisch aangemaakt. Hier had ik even wat problemen met de environment variabelen doordat ik die verkeerd hard geconfigureerd. Door goed de errors te lezen en met wat hulp van online documentatie kon ik dit aanpassen.
Stage 3: Execute
In de execute-stage wordt automatisch de game uitgevoerd als test, waarbij de eerder gebouwde logic-service als servicecontainer wordt opgestart. Het probleem dat ik hier tegenkwam was dat ik de verkeerde link van de logic-service had genomen.
Antwoord op de vragen
1. What is ./mvnw and what is the advantage of using it above mvn?
./mvnw is een Maven Wrapper, een script dat telkens de juiste versie van Maven downloadt en gebruikt voor je project zonder afhankelijk te zijn van de lokaal geïnstalleerde versie. Het voordeel hieraan is dat je Maven-projecten kan runnen zonder zelf Maven geïnstalleerd te hebben. Dit zorgt voor consistentie, iedere ontwikkelaar gebruikt dezelfde versie van Maven.
2. Explain the key differences between GitLab's cache and artifacts mechanisms. For each of Maven dependencies and build files, explain which mechanism you chose and why. What are the trade-offs of your choices?
Caches worden gebruikt om bestanden op te slaan die gebruikt kunnen worden in andere jobs of pipelines. Artifacts zijn dan weer eerder gemaakt om build-resultaten bij te houden en door te geven aan bijvoorbeeld volgende stages. In dit labo worden de Maven Dependencies opgeslagen via caches zodat ze niet telkens bij iedere run van je pipeline allemaal opnieuw gedownload moeten worden. Voor de build-files zijn artifacts dan weer interessant. Deze build-files worden opgeslagen in target/ zodat deze gemakkelijk te hergebruiken zijn bij volgende jobs.
3. In this lab, we use a 25-jre image as the base for our runtime container and a 25-jdk image for the CI/CD build jobs. Explain the reasoning behind this choice. What would be the impact (positive or negative) of using 25-jdk for both? What about using 25-jre for both?
CI/CD build jobs moeten zaken doen als code compileren en unit tests uitvoeren. Hiervoor heb je JDK nodig want deze bevat de javac compiler. JRE bevat enkel het runtime component en is dus beter geschikt voor de runtime containers, deze hoeven enkel maar de gecompileerde artefacten te draaien.
Stel dat we JDK hadden gebruikt voor beide was het misschien handig geweest door het feit dat we dan maar 1 image nodig hebben voor de beide maar dit zou resulteren in veel grotere container images en wat dus op vlak van performantie niet geschikt is. Als we dan weer voor de beide JRE hadden gebruikt zouden de build jobs falen want deze bevat zoals vermeld niet de volledige Java Development Kit, en dus geen compiler.