Lab 1 Report
Link to succesful run of the CI/CD job that executed the game:
https://gitlab.stud.atlantis.ugent.be/luclanno/devops-project/-/jobs/248499
Report on the structure of my .gitlab-ci.yml
Mijn pipeline bestaat uit drie stages:
1. Build: Hier wordt de applicatie opgebouwd via de maven-build job. Hier voer ik mvn package uit zodat de volledige Quarkus-applicatie gegenereerd wordt. De dependencies in .m2/repository worden gecachet zodat Maven die niet telkens opnieuw hoeft te downloaden.
2. Package: Hier wordt de container image aangemaakt en gepusht naar de GitLab Container Registry. De output van de eerste job wordt via artifacts en needs: doorgegeven aan deze job, zodat er niet opnieuw een build moet gebeuren. Dit zorgt ervoor dat deze stap veel sneller is.
3. Execute: Hier draait de devops-runner en wordt de logic-service opgepikt als service. Hierdoor start er automatisch een spel.
Problemen die ik tegenkwam:
- Ik kreeg de fout "No goals specified", dit heb ik opgelost door opnieuw package expliciet mee te geven in het script van maven-container-image-generation.
What is ./mvnw and what is the advantage of using it above mvn?
./mvnw is de Maven Wrapper. Het voordeel is dat het project daarmee altijd de juiste Maven-versie gebruikt, zonder afhankelijk te zijn van wat lokaal geïnstallerd is. Hierdoor werkt het consistent en reproduceerbaar op elk apparaat.
Verschillen tussen cache and artifacts
- De cache is ideaal voor herbruikbare dependencies. De cache gebruik ik voor de .m2/repository zodat Maven dependencies maar één keer gedownload worden.
- De artifacts zijn ideaal voor build-resultaten binnen dezelfde pipeline. De artifacts gebruik ik voor target/, zodat het resultaat van de eerste job kan hergebruikt worden in de tweede job. De container job hoeft daardoor niets opnieuw te bouwen.
Waarom 25-jdk voor de build en 25-jre voor runtime?
De build job heeft een JDK nodig om de code te compileren. De runtime container heeft enkel de JRE nodig om de applicatie uit te voeren, wat kleiner is. JDK voor runtime gebruiken werkt wel, maar image zou veel zwaarder zijn. Als je JRE gebruikt om te builden, faalt de build omdat de compiler ontbreekt.