Lab 1 Report
Succesful link to the CI/CD job that executed the game: https://gitlab.stud.atlantis.ugent.be/LukaLeroy/devops-project/-/pipelines/77544
Mijn .gitlab-ci.yml bevat drie stages: build, package en run-game. Ik had problemen met het vinden van de Maven cache (.m2/repository) en het pullen van de Docker image voor logic-service. Dit heb ik opgelost door in de build stage eerst de .m2/repository te maken met mkdir -p waardoor deze wel gevonden wordt. Bij de logic service had ik eerst bij -name gewoon "logic-service geschreven waardoor hij deze niet vond. Door "$CI_REGISTRY_IMAGE/logic-service:latest" te schrijven werd de service wel gevonden.
Antwoorden op de vragen:
What is ./mvnw and what is the advantage of using it above mvn?
./mvnw is de Maven Wrapper, een script dat is opgenomen in het project zelf. De voordelen ten opzichte van gewone mvn zijn:
- ./mvnw heeft een consistente maven-versie
- Maven hoeft niet op voorhand geïnstalleerd te zijn
- Eenvoudigere CI/C
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?
Verschil tussen cache en artifacts: de cache wordt gebruikt voor bestanden die tussen pipelines gedeeld kunnen worden via een cache-sleutel. Artifacten worden dan weer gebruikt voor bestanden die binnen één pipeline tussen jobs gedeeld worden.
Voor de Maven dependencies gebruik ik het cache mechanisme omdat deze groot zijn en veel tijd inpakken om elke keer weer gedownload te worden. De cache-sleutel is hierbij verbonden aan de pom.xml file, als er nieuwe dependencies bijkomen zal de cache veranderen.
Voor de build files gebruik ik artifacts zodat de build-output beschikbaar is voor latere stages, zo wordt er in de package stage gerefereerd naar de artifact gemaakt in de build stage.
De trade-offs zijn dat caches vaak sneller zijn maar wel corrupt kunnen geraken. Artifacts zijn dan weer betrouwbaarder maar verbruiken meer serveropslag.
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?
Redenen voor de keuze tussen 25-jre en 25-jdk: JDK wordt gebruikt voor builds omdat het alle ontwikkeltools bevat, zoals javac. Deze is nodig voor het bouwen van java code. JRE wordt gebruikt voor runtime omdat het enkel bevat wat nodig is om java applicaties uit te voeren, wat resulteert in kleinere containers.
Alleen JDK gebruiken => Consistentie tussen omgevingen, beter te onderhouden. Veel meer grote images dan nodig zijn, veel meer resources dan nodig zijn, ...
Alleen JRE gebruiken => Efficiëntere en kleinere containers, maar de build jobs zouden niet eens uitgevoerd kunnen worden doordat javac ontbreekt!