Lab 1
Lab 1
Final pipeline:
https://gitlab.stud.atlantis.ugent.be/gclement/devops-project/-/pipelines/77363
Structuur .gitlab-ci.yml:
1. Image
- De default/‘globale’ image, alle jobs zullen deze image gebruiken, tenzij een andere image in de job zelf gespecificeerd is.
- Deze image is een JDK 25-image.
2. Variables
- Dit zijn de globale variabelen die iedere job zal/kan gebruiken.
-
MAVEN_CLI_OPTS: "--batch-mode”laat Maven op een stillere, CI vriendelijkere manier verlopen. -
MAVEN_OPTS: “-Dmaven.repo.local=.m2/repository"zet de lokale Maven-repository naar de map .m2/repository binnen het project.
3. Stages
- Alle stages die de pipeline zal uitvoeren.
4. Job: maven-build
- Stage: build
- Deze job checkt of de code wel compileert, het voert het commando
mvn compilemet de CLI-opties uit. - In deze job heb ik ook een cache toegevoegd die de maven dependencies folder cached voor volgende pipeline runs.
5. Job: maven-container-image-generation
- Stage: package
- Deze Job voegt de Quarkus Jib extensie toe, zodat Jib containers kan bouwen.
- Daarna roep ik het commando
mvn installmet-Dquarkus.container-image.build=trueaan, zodat de app build en Jib een container image ervan maakt. - Daarna wordt deze image gepusht naar mijn GitLab container registry.
6. Job: run-game
- Stage: execute
- Eerst start de job een tweede container, of een job service met de gespecificeerde image van de logic-service uit de container registry en geeft het de simpelere alias
logic-service. - Daarna worden enkele job-specifieke variabelen gedefineerd die ervoor zorgt dat de devops-runner na 25 stappen stopt, zodat de pipeline niet te lang dicht zit.
- Voor deze job moeten we de globale image overriden met de devops-runner image.
- De lege entrypoint zorgt ervoor dat de standaard shell entrypoint van de image gebruikt wordt.
- Daarna start het script stukje de java launcher/game op.
Problemen:
- Eerst had ik niet de juiste commando’s om image creation te doen in package stage.
- Execute stage had ik eerst een andere naam gegeven en ook niet juist aangeroepen in de job dus faalde de job.
- Services stonden ‘globaal’ boven in file en de image kon dus nog niet gepuld worden, want het werd aangeroepen voor de stap waar de container image in de registry wordt gezet.
Vragen:
-
What is ./mvnw and what is the advantage of using it above mvn?
Mvwn is de Maven wrapper, die niet vooraf moet geïnstalleerd worden zoals Maven. De wrapper zorgt ervoor dat automatisch de juiste Maven versie wordt gebruikt bij het project, en ook dat iedereen diezelfde versie gebruikt.
-
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?
Cache wordt gebruikt om files die gedownload moeten worden te hergebruiken, vooral voor snelheid. Ik gebruik in mijn pipeline een cache voor de Maven dependencies, zodat die cache kan gebruikt worden bij volgende runs en die bij gevolg ook sneller maakt. Artifacts worden gebruikt om build resultaten bij te houden, zoals bijvoorbeeld een executable file die gemaakt wordt in de build stage bij te houden en zo te kunnen doorgeven naar bijvoorbeeld de test stage. Aangezien, na het na te vragen bij een docent, het bij dit lab niet echt van toepassing is, heb ik geen gebruik gemaakt van een artifact. De trade-off van deze twee is dat caches vooral sneller zijn bij vaak gebruikte data, maar kunnen verouderen, terwijl artifacts ‘bruikbare’ output bevatten, maar wel storage opeisen.
-
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?
De build stage heeft een compiler nodig, die niet in de JRE zit, daarvoor is een JDK nodig, dus enkel JRE zou hier niet werken. De JDK bevat alles die nodig is voor het maken van een applicatie, ook de JRE en de compiler en nog meer tools, dus het is mogelijk om alleen de JDK te gebruiken, maar dat is heel groot voor iets die enkel een een runtime environment nodig heeft, zoals de execute stage. De JRE zorgt hier dus nog voor een kleine en compacte runtime environment.