Bygge prosjektet
FS-plattform i filsystemet
Når man har lastet ned Git-repoet fs-plattform og har sjekket ut en branch, kan man finne denne branch sine filer gjennom Windows Filutforsker, IntelliJ Project Tool eller med en terminalapplikasjon som PowerShell (PS).
Her kan vi se deler av fs-plattform repoet i PowerShell:
PS C:\Users\ditt_brukenavn\dev\fs-plattform> ls
Directory: C:\Users\ditt_brukenavn\dev\fs-plattform
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 25.05.2023 11:39 .gitlab
d----- 18.09.2023 13:54 .idea
d----- 07.03.2022 13:36 .mvn
d----- 25.05.2023 11:39 batch
d----- 21.06.2023 12:13 db
da---- 30.08.2023 11:12 docs
d----- 11.09.2023 14:26 docusaurus
d----- 08.09.2023 12:35 fs-graphql-spec
d----- 08.09.2023 12:37 fsapi-rest
...( 25 linjer slettet) ...
I bildet under ser vi Windows Filutforsker helt til venstre og IntelliJ liggende over og forskjøvet til høyre for filutforskervinduet.
Filutforsker og IntelliJ prosjektverktøyvindu viser frem innholdet fra filsystemet (nesten helt) likt. Begge verktøy involverer filbehandling, men ellers fokuserer de på forskjellige oppgaver. I Windows Filutforsker kan du navigere i prosjektets katalogstruktur og opprette, flytte og slette filer. Prosjektverktøyvindu i IntelliJ er designet for å lette prosjektspesifikke utviklingsoppgaver.
I praksis vil mange arbeide både i Windows sitt filsystem med hjelp av terminalapplikasjoner som PowerShell eller Git Bash, og i IntelliJ med programmeringsoppgaver. Andre velger å bruke IntelliJ sine verktøy til alle oppgaver.

I IntelliJ sitt prosjektverktøyvindu ser vi det samme utsnittet fra filsystemet som filutforsker viser til helt venstre. Helt til høyre i en text editor tab ser vi innholdet av pom.xml som er markert i Project Tool. Denne POM-filen er fs-plattform-parent, dvs. denne POM-filen er inngangsporten til hele Maven prosjektet fs-plattform.
I text editor er det markert hvilke Maven moduler prosjektet består av, dvs. hvilke subprosjekter hele fs-plattform prosjektet består av.
IntelliJ IDEA modules
En Maven module er et sub-prosjekt og er ikke det samme som en IntelliJ IDEA module.
Når man i IntelliJ åpner menyvalg Fil | Project Structure..., kan man se hvordan IntelliJ grupperer prosjektet som moduler.
The Module page in the Project Structure dialog

Maven prosjektstruktur
Hva er en POM-fil?
-
En POM-fil (Project Object Model-fil) er en XML-fil som brukes i Apache Maven, et verktøy for bygging og administrasjon av Java-prosjekter
-
POM-filen brukes til å beskrive prosjekter på en standardisert måte Dette gjør det enkelt å dele og administrere Java-prosjekter, spesielt når det kommer til avhengigheter og byggeprosessen.
-
POM-filen beskriver prosjektets metadata og konfigurasjon, inkludert avhengigheter til eksterne biblioteker, byggeinstruksjoner, versjon av prosjektet, utgave og annen viktig informasjon
FS-plattform er et Maven-prosjekt som består av forskjellige mindre prosjekt og noen av disse prosjektene består igjen av mindre prosjekt. Slik er det bygget opp en hierarkisk struktur.
For å se prosjektstrukturen kan du åpne POM-filen på roten av prosjektet (den filen som er markert i bildet over) og finne <modules>.
fs-plattform/pom.xml(fs-plattform-parent)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>no.fellesstudentsystem</groupId>
<artifactId>fs-plattform-parent</artifactId>
<packaging>pom</packaging>
<!-- (innhold i kommentar slettet) -->
<version>${revision}${changelist}</version>
<modules>
<module>docusaurus</module>
<module>kjerneapi-codegen</module>
<module>kjerneapi-codegen-maven</module>
<module>kjerneapi-db</module>
<module>kjerneapi</module>
<module>kjerneapi-service</module>
<module>graphitron</module>
<module>fs-graphql-spec</module>
<module>fsapi-rest</module>
</modules>
</project>
Dersom man åpner POM-filen i en av modulene, f.eks. fsapi-rest som ligger i katalogen fs-plattform/fsapi-rest,
kan man finne henvisning til flere sub-moduler:
fs-plattform/fsapi-rest/pom.xml(fsapi-rest-parent) modules
<modules>
<module>fsapi-rest-spec</module>
<module>wildfly-oracle-galleon-pack</module>
<module>splitting-role-decoder</module>
<module>splitting-role-decoder-galleon-pack</module>
<module>fsapi-rest</module>
</modules>
fs-plattform/fsapi-rest/fsapi-rest/pom.xml
Og så kan man gå inn i modulen fsapi-rest i fs-plattform/fsapi-rest/fsapi-rest og åpne POM-filen der. Der finner
man ikke henvisning til flere moduler.
fs-plattform/fsapi-rest/fsapi-rest-spec/pom.xml
Et lignende hierarki finner her fs-plattform/fsapi-rest/fsapi-rest-spec. POM-filen her henviser heller ikke til flere moduler.
Bli kjent med FS-plattformen som
- filer i filsystemet
- et Maven-prosjekt
- et IntelliJ-prosjekt
Be om hjelp fra tech lead eller andre for å forstå hvordan dette henger sammen!
Databasetilgang
Hente FS-db Docker image fra Artifactory
For å bygge prosjektet må du ha tilgang til en FS-database. Dette følger av at det interne APIet bruker databasen for å generere javakode som deretter brukes av de respektive eksterne APIene.
Vi har laget et docker image som inneholder FS-databasen og gjort dette tilgjengelig på Sikts Artifactory.
Hva er Artifactory?
Artifactory er et repositoriesystem som brukes til å administrere og lagre binære byggekomponenter, avhengigheter og artefakter for programvareprosjekter. Det har blitt en nøkkelkomponent i moderne programvareutviklingsprosesser for effektiv håndtering av binære artefakter og avhengigheter.
Noen av hovedfunksjonene er:
-
Lagrings- og organiseringssystem: Artifactory gir et sentralt sted for lagring av binære artefakter som kompilerte biblioteker, JAR-filer, Docker-image, Maven-pakker og mer. Dette gjør det enklere å administrere og distribuere disse artefaktene i programvareprosjekter.
-
Sikkerhet og tilgangskontroll: Artifactory gir omfattende kontroll over hvem som har tilgang til artefaktene dine, hvem som kan laste dem opp, og hvem som kan laste dem ned. Dette er viktig for sikkerhet og etterlevelse av lisensieringskrav.
-
Avhengighetshåndtering: Artifactory integrerer sømløst med byggeverktøy som Apache Maven, Gradle og Ivy, og kan tjene som en proxy for eksterne binære repositories. Dette betyr at den kan cache avhengigheter for å redusere byggetider og risikoen for feil på grunn av utilgjengelige eksterne ressurser.
-
Byggpromotering: Artifactory lar deg følge en promotering eller godkjenningsprosess for artefakter før de blir gjort tilgjengelige for andre i teamet eller organisasjonen.
-
Integrasjoner: Det er enkelt å integrere Artifactory med andre verktøy i DevOps-stakken, som CI/CD-verktøy (Continuous Integration/Continuous Deployment), automatiseringsskript, og konfigurasjonsstyringsverktøy.
-
Metadata og søk: Artifactory lagrer også metadata om artefakter, noe som gjør det enkelt å søke og finne artefakter basert på forskjellige kriterier som versjon, dato, lisens og mer.
For å logge inn i Artifactory må man autentisere seg og da bruke en API-nøkkel som passord.
- Gå til artifactory.sikt.no
- Klikk på "Log In" oppe i høyre hjørne
- Logg inn med Feide
- Klikk på "Welcome, din.epost@sikt.no" oppe i høyre hjørne
- Velg "Edit Profile"
- Klikk på "Generate API Key"
- Klikk på "Copy to clipboard"
- Legg API-nøkkelen inn i konfigurasjonsfilen
c:/Users/din_bruker/.m2/settings.xmlsom 'password' (se lenger ned)
Logg inn i Artifactory ved hjelp av den følgende kommandoen på kommandolinjen. Bruk din nylige opprettede API-nøkkel som passord ved å lime den inn bak prompten 'Password:'
PS C:\Users\ditt_brukernavn\dev\fs-plattform> docker login artifactory.sikt.no -u din.epost@sikt.no
Password: (lim inn API-nøkkel)
Login Succeeded
Etter at dette er gjort skal det være nok å kjøre følgende kommando i roten av repoet for å laste ned database-imaget:
PS C:\Users\ditt_brukernavn\dev\fs-plattform> docker-compose up
Ved første gangs bruk, vil kommandoen docker-compose up laste ned et ~7 GB stort image, så det kan ta litt tid.
Beklager dette.
Tilgang til andre avhengigheter i Artifactory
I tillegg bruker vi noen avhengigheter som ligger i Artifactory.
Dette krever også autentisering i form av konfigurasjonsfilen c:/Users/din_bruker/.m2/settings.xml.
Som ovenfor bruker man Sikt-epostadressen og sin personlige Artifactory-API-nøkkel som brukernavn og passord.
Brukernavn:
DIN.EPOST@sikt.no
Passord:DIN-PERSONLIGE-ARTIFACTORY-NØKKEL
Her er et eksempel på hvordan filen kan se ut:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>artifactory-central</id>
<username>DIN.EPOST@sikt.no</username>
<password>DIN-PERSONLIGE-ARTIFACTORY-NØKKEL</password>
</server>
<server>
<id>artifactory-libs-snapshots</id>
<username>DIN.EPOST@sikt.no</username>
<password>DIN-PERSONLIGE-ARTIFACTORY-NØKKEL</password>
</server>
<server>
<id>artifactory-libs-releases</id>
<username>DIN.EPOST@sikt.no</username>
<password>DIN-PERSONLIGE-ARTIFACTORY-NØKKEL</password>
</server>
</servers>
</settings>
Bygge prosjektet
Du kan velge å bygge prosjektet med eller uten tester. Det går naturlig nok raskere å bygge uten testene, men det kan være lurt å bygge med testene aktivert før du sender koden til gitlab.
Bygge uten tester
For å bygge hele FS-plattform prosjektet, kan du på kommandolinjen gå til roten av prosjektet kjøre mvn clean install -DskipTests
PS C:\Users\ditt_brukernavn\dev\fs-plattform> mvn clean install -DskipTests
Hva gjør 'mvn clean install -DskipTests'?
The command mvn clean install -DskipTests is typically used in the context of a Maven-based Java project
and performs the following actions:
-
mvn: This is the command to invoke Apache Maven, a build automation and project management tool primarily used for Java projects. -
clean: This is a Maven goal that cleans the project by deleting thetargetdirectory and all of its contents. Thetargetdirectory is where Maven stores compiled classes and other generated artifacts. -
install: This is another Maven goal that is used to install the project's artifacts (usually JAR files) into the local Maven repository. These artifacts can then be used as dependencies by other Maven projects on the same machine. -
-DskipTests: This is a command-line option that is used to skip the execution of unit tests during the build process. When you specify-DskipTests, Maven will compile and package your project without running any of the test cases defined in your project. This can be useful when you want to build your project quickly without waiting for tests to run, but it's important to note that skipping tests may not be advisable in a production or quality assurance environment, as it may lead to undetected issues.
So, in summary, mvn clean install -DskipTests is a Maven command that cleans the project, compiles and packages it,
and installs the resulting artifacts in the local Maven repository, all while skipping the execution of any unit tests.
Da vil man se at det logges over 265 000 linjer:
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] fs-plattform-parent [pom]
[INFO] docusaurus [war]
[INFO] kjerneapi-codegen [jar]
[INFO] kjerneapi-codegen-maven [maven-plugin]
[INFO] kjerneapi-db [jar]
[INFO] kjerneapi [jar]
[INFO] kjerneapi-service [jar]
[INFO] graphitron-maven-plugin [maven-plugin]
[INFO] fs-graphql-spec [jar]
[INFO] utviklerportal [war]
[INFO] fsapi-rest-parent [pom]
[INFO] fsapi-rest-spec [jar]
[INFO] Oracle driver for WildFly [pom]
[INFO] Custom role decoder for WildFly [jar]
[INFO] Galleon pack som inneholder splitting-role-decoder [pom]
[INFO] fsapi-rest [war]
[INFO]
[INFO] -------------< no.fellesstudentsystem:fs-plattform-parent >-------------
[INFO] Building fs-plattform-parent 2.0-SNAPSHOT [1/16]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ fs-plattform-parent ---
[INFO]
... (265167 linjer slettet) ...
[INFO] --- maven-install-plugin:2.4:install (default-install) @ fsapi-rest ---
[INFO] Installing C:\Users\ditt_brukernavn\dev\fs-plattform\fsapi-rest\fsapi-rest\target\fsapi-rest.war to C:\Apps\maven\repository\no\fellesstudentsystem\fsapi-rest\2.0-SNAPSHOT\fsapi-rest-2.0-SNAPSHOT.war
[INFO] Installing C:\Users\ditt_brukernavn\dev\fs-plattform\fsapi-rest\fsapi-rest\.flattened-pom.xml to C:\Apps\maven\repository\no\fellesstudentsystem\fsapi-rest\2.0-SNAPSHOT\fsapi-rest-2.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for fs-plattform-parent 2.0-SNAPSHOT:
[INFO]
[INFO] fs-plattform-parent ................................ SUCCESS [ 5.509 s]
[INFO] docusaurus ......................................... SUCCESS [ 37.040 s]
[INFO] kjerneapi-codegen .................................. SUCCESS [ 9.991 s]
[INFO] kjerneapi-codegen-maven ............................ SUCCESS [ 11.642 s]
[INFO] kjerneapi-db ....................................... SUCCESS [01:47 min]
[INFO] kjerneapi .......................................... SUCCESS [04:57 min]
[INFO] kjerneapi-service .................................. SUCCESS [ 19.122 s]
[INFO] graphitron-maven-plugin ............................ SUCCESS [ 29.508 s]
[INFO] fs-graphql-spec .................................... SUCCESS [02:04 min]
[INFO] utviklerportal ..................................... SUCCESS [ 1.012 s]
[INFO] fsapi-rest-parent .................................. SUCCESS [ 0.075 s]
[INFO] fsapi-rest-spec .................................... SUCCESS [ 11.896 s]
[INFO] Oracle driver for WildFly .......................... SUCCESS [ 1.484 s]
[INFO] Custom role decoder for WildFly .................... SUCCESS [ 1.070 s]
[INFO] Galleon pack som inneholder splitting-role-decoder . SUCCESS [ 1.404 s]
[INFO] fsapi-rest ......................................... SUCCESS [ 26.760 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:26 min
[INFO] Finished at: 2023-09-08T12:37:47+02:00
[INFO] ------------------------------------------------------------------------
Les loggen!
- Det første vi ser i loggen, er hvilke Maven-prosjekter og hvilke type artefakter som skal bygges.
- Så er nesten alle linjer slettet inntil vi ser hvordan to artefakter installeres etter å ha blitt bygget.
- Legg merke til
-DskipTestsi kommandoen som ble kjørt for å starte byggingen. Den sier 'hopp over testene.' Med andre ord vil loggen være lenger når man ikke hopper over testene. - Loggingen avrundes med en oppsummering av hvordan byggingen av prosjektet og alle subprosjektene gikk.
- Som man kan se gikk byggingen smertefritt - "BUILD SUCCESS" - og det tok 11 minutter og 26 sekunder.
- Legg også merke til at denne byggingen ble kjørt 08.09.2023, loggen vil være endret når du bygger prosjektet da FS-plattform er i kontinuerlig utvikling og endring
- Det aller, aller meste av loggingen er nå hoppet over. Bruk tid på å bli kjent med hva som logges når prosjektet bygges.
- Under byggingen ble artefakter installert på ulike steder i filsystemet i
targetmapper under..\fs-plattform\... Du vil f.eks finne kjerneapi-service-2.0-SNAPSHOT.jar her:
C:\Users\din_bruker\dev\fs-plattform\kjerneapi-service\target\kjerneapi-service-2.0-SNAPSHOT.jar
- Under byggingen ble artefakter også installert i ditt lokale Maven repositorie, f.eks:
...\sti_til_ditt_lokale_maven\repository\no\fellesstudentsystem\fsapi-rest\2.0-SNAPSHOT\fsapi-rest-2.0-SNAPSHOT.war
...\sti_til_ditt_lokale_maven\repository\no\fellesstudentsystem\fsapi-rest\2.0-SNAPSHOT\fsapi-rest-2.0-SNAPSHOT.pom
Artefakter som ble installert
- docusaurus-2.0-SNAPSHOT.pom
- docusaurus-2.0-SNAPSHOT.war
- fs-plattform-parent-2.0-SNAPSHOT.pom
- fsapi-rest-2.0-SNAPSHOT.war
- fsapi-rest-spec-2.0-SNAPSHOT.jar
- fs-graphql-spec-2.0-SNAPSHOT.jar
- fs-graphql-spec-2.0-SNAPSHOT.pom
- fsapi-rest-spec-2.0-SNAPSHOT.pom
- fsapi-rest-2.0-SNAPSHOT.war
- fsapi-rest-2.0-SNAPSHOT.pom
- fsapi-rest-parent-2.0-SNAPSHOT.pom
- graphitron-maven-plugin-2.0-SNAPSHOT.jar
- graphitron-maven-plugin-2.0-SNAPSHOT.pom
- kjerneapi-2.0-SNAPSHOT.jar
- kjerneapi-2.0-SNAPSHOT.pom
- kjerneapi-db-2.0-SNAPSHOT.jar
- kjerneapi-db-2.0-SNAPSHOT.pom
- kjerneapi-codegen-2.0-SNAPSHOT.jar
- kjerneapi-codegen-2.0-SNAPSHOT.pom
- kjerneapi-codegen-maven-2.0-SNAPSHOT.jar
- kjerneapi-codegen-maven-2.0-SNAPSHOT.pom
- kjerneapi-service-2.0-SNAPSHOT.jar
- kjerneapi-service-2.0-SNAPSHOT.pom
- splitting-role-decoder-2.0-SNAPSHOT.jar
- splitting-role-decoder-2.0-SNAPSHOT.pom
- splitting-role-decoder-galleon-pack-2.0-SNAPSHOT.pom
- utviklerportal-2.0-SNAPSHOT.war
- utviklerportal-2.0-SNAPSHOT.pom
- wildfly-oracle-galleon-pack-2.0-SNAPSHOT.pom
Bygge prosjektet med testing
Aller helst skal man kunne bygge FS-plattform prosjektet med testene. Det kan gjøres på to måter:
- Bygge uten systemtester:
PS C:\Users\ditt_brukernavn\dev\fs-plattform> mvn clean install
- Bygge med systemtester:
PS C:\Users\ditt_brukernavn\dev\fs-plattform> mvn clean install -P systemtest-ci
Systemtestene kjøres ende-til-ende gjennom APIet. Disse tar litt tid, og de er derfor utelatt som standard. Disse blir uansert kjørt i CI-pipelinen i GitLab.
Det logges over 265 897 linjer. Starten er som forrige gang, men nå feiler bygget:
... (massevis av linjer slettet) ...
[INFO] Running no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.025 s <<< FAILURE! - in no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT
[ERROR] no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT Time elapsed: 0.025 s <<< ERROR!
org.jooq.exception.DataAccessException:
SQL [insert into "KJERNEAPI"."DB_HENDELSE" ("TABELLNAVN", "OPERASJON", "PK", "HENDELSESDATA") values (?, ?, ?, ?)]; ORA-02290: kontrollskranken (FS_SYSTEM.DB_HENDELSE__DATA__JSON__CK) er overtrÕdt
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.populerDatabaseHendelser(StudenthendelsesStudentkortUtgattServiceIT.java:57)
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.setUp(StudenthendelsesStudentkortUtgattServiceIT.java:35)
Caused by: java.sql.SQLIntegrityConstraintViolationException:
ORA-02290: kontrollskranken (FS_SYSTEM.DB_HENDELSE__DATA__JSON__CK) er overtrÕdt
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.populerDatabaseHendelser(StudenthendelsesStudentkortUtgattServiceIT.java:57)
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.setUp(StudenthendelsesStudentkortUtgattServiceIT.java:35)
Caused by: oracle.jdbc.OracleDatabaseException:
ORA-02290: kontrollskranken (FS_SYSTEM.DB_HENDELSE__DATA__JSON__CK) er overtrÕdt
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.populerDatabaseHendelser(StudenthendelsesStudentkortUtgattServiceIT.java:57)
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.setUp(StudenthendelsesStudentkortUtgattServiceIT.java:35)
[INFO] Running no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentStartetPaStudieprogramIT
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.367 s - in
... (40 linjer slettet) ...
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.434 s - in no.fellesstudentsystem.kjerneapi_service.UpsertPersonTelefonIT
[INFO] Running no.fellesstudentsystem.kjerneapi_service.VurderingsmeldingIT
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.601 s - in no.fellesstudentsystem.kjerneapi_service.VurderingsmeldingIT
[INFO] Running vurderingsmelding.VedtakOmEkstraVurderingsforsokIT
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.274 s - in vurderingsmelding.VedtakOmEkstraVurderingsforsokIT
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] StudenthendelsesStudentkortUtgattServiceIT.setUp:35->populerDatabaseHendelser:57 ╗ DataAccess
[INFO]
[ERROR] Tests run: 234, Failures: 0, Errors: 1, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-failsafe-plugin:3.0.0-M5:verify (default) @ kjerneapi-service ---
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for fs-plattform-parent 2.0-SNAPSHOT:
[INFO]
[INFO] fs-plattform-parent ................................ SUCCESS [ 1.796 s]
[INFO] docusaurus ......................................... SUCCESS [ 28.444 s]
[INFO] kjerneapi-codegen .................................. SUCCESS [ 13.132 s]
[INFO] kjerneapi-codegen-maven ............................ SUCCESS [ 8.547 s]
[INFO] kjerneapi-db ....................................... SUCCESS [02:47 min]
[INFO] kjerneapi .......................................... SUCCESS [06:16 min]
[INFO] kjerneapi-service .................................. FAILURE [01:12 min]
[INFO] graphitron-maven-plugin ............................ SKIPPED
[INFO] fs-graphql-spec .................................... SKIPPED
[INFO] utviklerportal ..................................... SKIPPED
[INFO] fsapi-rest-parent .................................. SKIPPED
[INFO] fsapi-rest-spec .................................... SKIPPED
[INFO] Oracle driver for WildFly .......................... SKIPPED
[INFO] Custom role decoder for WildFly .................... SKIPPED
[INFO] Galleon pack som inneholder splitting-role-decoder . SKIPPED
[INFO] fsapi-rest ......................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11:09 min
[INFO] Finished at: 2023-09-11T14:37:39+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-failsafe-plugin:3.0.0-M5:verify (default) on project kjerneapi-service: There are test failures.
[ERROR]
[ERROR] Please refer to C:\Users\ditt_brukernavn\dev\fs-plattform\kjerneapi-service\target\failsafe-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :kjerneapi-service
Lese loggen, finne feilbeskrivelsen, fikse feilen og fortsette bygget
Vi får en melding:
[INFO] Running ...kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT
Og så en feilmelding som sier at det er én test som feiler:
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.025 s <<<
Og fortsetter med navnet på testen:
FAILURE! - in ...kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT
De neste linjene har feilbeskrivelsen:
[ERROR] ... org.jooq.exception.DataAccessException ...
Les ovenfor i utdraget av loggen for å få detaljene i feilmeldingen
Lenger ned oppsummers testingen slik:
[ERROR] Tests run: 234, Failures: 0, Errors: 1, Skipped: 0
I Reactor Summary i loggen står det så at bygget feilet i kjerneapi-service subprosjektet
[INFO] kjerneapi-service ... ... FAILURE [01:12 min]
Og at de neste subprosjektene er SKIPPED og bygget har status BUILD FAILURE
Heldigvis får vi tips:
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :kjerneapi-service
Du fikser problemet som gjør at en test feiler
og kjører kommandoen mvn clean install og hvor kommandoen skal starte:
-rf :kjerneapi-service (der bygget feilet)
PS C:\Users\ditt_brukernavn\dev\fs-plattform> mvn clean install -rf :kjerneapi-service
Dersom bygget feiler på nytt, går man gjennom tilsvarende prosedyre som ovenfor. Helt til man får BUILD SUCCESS.
Bygge prosjektet med cache
Det tar veldig lang tid å bygge fs-plattform, så et verktøy vi kan benytte oss av for å gjøre dette raskere er caching.
Cachen bruker Content based caching for å finne ut om det har skjedd endringer.
Content based caching lager en hash av alle inputene som hver maven plugin ser på og dersom det ikke har skjedd endringer, så vil pluginkjøringen skippes.
Cachen er forløbig opt-in, noe som betyr at hver enkelt uvikler må aktivere den selv. Dette gjøres ved:
mvn -Dmaven.build.cache.enabled=true <goals>
feks:
mvn -Dmaven.build.cache.enabled=true clean install
mvn -Dmaven.build.cache.enabled=true wildfly:dev
Dersom man disabler tester i den nåværende løsningen, så vil cache resultatet ta vare på det, så neste gang man kjører vil også tester være deaktivert. Dette kan fikses, men har foreløbig ikke blitt gjort.
Om man ønsker å alltid sl å på cachen lokalt så kan man gjøre det ved å eksportere miljøvariabelen MAVEN_OPTS.
eks:
echo 'export MAVEN_OPTS="${MAVEN_OPTS} -Dmaven.build.cache.enabled=true"' >> ~/.zshrc
Kjente problemer
Det oppstår også feil som det ikke er så lett å finne ut av. Her dokumenteres noen kjente problemer.
Bli med på dokumentasjonsdugnaden ved å dokumentere løsningen på et passende sted i denne veilederen.
PROBLEM: "Failed to install artifact" - ?
Vi vet ikke helt ennå hva som forårsaker dette problemet. Dersom du kan bidra til forståelse av og løsning på dette problemet, så er det fint om du oppretter en merge request på dette dokumentet hvor du fyller inn disse feltene:
Hvordan gjenskape problemet: [Beskrivelse av hvordan gjenskape problemet]
Løsning: [Beskrivelse av løsning]
Dokument og plassering i dokumentet:
DOKUMENT: fs-plattform/docs/utviklerdokumentasjon/utvikle_pa_fs_plattform/bygge_prosjektet.md
PLASSERING: ### PROBLEM: "Failed to install artifact" - ?
Symptom
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:3.1.1:install (default-install)
on project kjerneapi-codegen: Failed to install artifact no.fellesstudentsystem:kjerneapi-codegen:jar:2.0-SNAPSHOT:
C:\Users\ditt_brukernavn\\.m2\repository\no\fellesstudentsystem\kjerneapi-codegen\2.0-SNAPSHOT\
kjerneapi-codegen-2.0-SNAPSHOT.jar.8736640235868930471.tmp ->
C:\Users\ditt_brukernavn\\.m2\repository\no\fellesstudentsystem\kjerneapi-codegen\2.0-SNAPSHOT\
kjerneapi-codegen-2.0-SNAPSHOT.jar -> [Help 1]
Hvordan gjenskape problemet
[Vi vet ennå ikke hvordan dette problemet oppstår]
Slack-tråd (lukket kanal)
Failed to install artifact ...
Løsning
Følgende løsninger har fungert for windows-bruker med VS Code:
- Lukke VS Code, åpne igjen og kjøre
mvn clean install -rf :kjerneapi-codegen - Dersom det ikke virker, lukke VS Code, finne fila i filsystemet, slette den, åpne VS Code, kjøre
mvn clean install på nytt - Avslutte HyperV, kjøre
mvn clean installHow to Disable Hyper-V in Windows 11: 3 Easy Methods
PROBLEM: "The Network Adapter could not establish the connection"
Problem
Kjøring av mvn clean install gir følgende feilmelding:
[ERROR] Failed to execute goal no.fellesstudentsystem:kjerneapi-codegen-maven:2.0-SNAPSHOT:
generate (codegen) on project kjerneapi-db: Error running kjerneapi-db code generation: I/U-feil:
The Network Adapter could not establish the connection (CONNECTION_ID=IvmpQ+CfToy4/pSzNxQaLw==):
Connection refused: connect, socket connect lapse 2078 ms. localhost 1521 0 (2/2) true -> [Help 1]
Hvordan gjenskape problemet
- Stopp lokal database
- Kjør
mvn clean install
Slack-tråd
The Network Adapter could not establish the connection
Løsning:
- Start lokal database
- Kjør
mvn clean install
PROBLEM: Tester med Non-ASCII tegn feiler
Problem: Integrasjonstest feiler med "org.jooq.exception.IntegrityConstraintViolationException"
Problemet er at noen tester inneholder data hvor det forekommer tekst med Non-ASCII tegn som Æ, Ø og Å.
Eksempel:
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.017 s <<< FAILURE! - in no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT
[ERROR] no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT Time elapsed: 0.017 s <<< ERROR!
org.jooq.exception.IntegrityConstraintViolationException:
SQL [insert into "KJERNEAPI"."DB_HENDELSE" ("TABELLNAVN", "OPERASJON", "PK", "HENDELSESDATA") values (?, ?, ?, ?)]; ORA-02290: kontrollskranken (FS_SYSTEM.DB_HENDELSE__DATA__JSON__CK) er overtrådt
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.populerDatabaseHendelser(StudenthendelsesStudentkortUtgattServiceIT.java:98)
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.setUp(StudenthendelsesStudentkortUtgattServiceIT.java:40)
Caused by: java.sql.SQLIntegrityConstraintViolationException:
ORA-02290: kontrollskranken (FS_SYSTEM.DB_HENDELSE__DATA__JSON__CK) er overtrådt
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.populerDatabaseHendelser(StudenthendelsesStudentkortUtgattServiceIT.java:98)
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.setUp(StudenthendelsesStudentkortUtgattServiceIT.java:40)
Caused by: oracle.jdbc.OracleDatabaseException: ORA-02290: kontrollskranken (FS_SYSTEM.DB_HENDELSE__DATA__JSON__CK) er overtrådt
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.populerDatabaseHendelser(StudenthendelsesStudentkortUtgattServiceIT.java:98)
at kjerneapi.service@2.0-SNAPSHOT/no.fellesstudentsystem.kjerneapi_service.hendelser.student.StudenthendelsesStudentkortUtgattServiceIT.setUp(StudenthendelsesStudentkortUtgattServiceIT.java:40)
Hvordan gjenskape problemet
- Legg inn tekst med Non-ASCII tegn i dataene i en integrasjonstest
- Kjør testen
Løsning
Løsningen på dette problemet er å sette JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8"
i terminalvinduet hvor testene kjøres.
POWERSHELL i IntelliJ
Når vi henviser til PowerShell i dette dokumentet, så er det PowerShell brukt i IntelliJ sitt Terminalvindu.
Manuelt i PowerShell
PS C:\Users\ditt_brukernavn\dev\fs-plattform> $Env:JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8"
PS C:\Users\ditt_brukernavn\dev\fs-plattform> echo $Env:JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF8
Script i PowerShell-profil som setter 'JAVA_TOOL_OPTIONS' ved oppstart av terminal
For å finne PowerShell-profil, kan du sjekke filstien slik:
PS>$profile
C:\Users\ditt_brukernavn\OneDrive - Sikt\Dokumenter\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Dersom PowerShell-profilen ikke er opprettet, kan du legge til en tekstfil 'Microsoft.PowerShell_profile.ps1'.
I 'Microsoft.PowerShell_profile.ps1' kan du legge til et script likt dette. Dette skriptet setter JAVA_TOOL_OPTIONS kun
i mappen fs-plattform og fs-plattform undermapper. Skriptet gjør det følgende ved hver prompt:
- Sjekker om man er i katalogen
fs-plattformeller undermapper tilfs-plattform - Dersom det stemmer settes
JAVA_TOOL_OPTIONSmed verdi-Dfile.encoding=UTF8 - Dersom det ikke stemmer og miljøvariabelen
JAVA_TOOL_OPTIONSeksisterer, så slettes denne variabelen - Til slutt settes ledetekst for prompt
function prompt() {
if ($PWD.Path.StartsWith("$HOME\dev\fs-plattform") )
{
[System.Environment]::SetEnvironmentVariable("JAVA_TOOL_OPTIONS", "-Dfile.encoding=UTF8", [System.EnvironmentVariableTarget]::Process)
} elseif ($Env:JAVA_TOOL_OPTIONS -ne $null)
{
[System.Environment]::SetEnvironmentVariable("JAVA_TOOL_OPTIONS", $null, [System.EnvironmentVariableTarget]::Process)
}
"PS $($PWD.ProviderPath)> "
}
Når du åpner et nytt PowerShell-vindu, vil 'JAVA_TOOL_OPTIONS' settes i fs-plattform og underkataloger,
men ikke i katalogen dev som er foreldrekatalog til fs-plattform katalogen.
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6
PS C:\Users\ditt_brukernavn\dev\fs-plattform> echo $Env:JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF8
PS C:\Users\ditt_brukernavn\dev\fs-plattform> cd ..
PS C:\Users\ditt_brukernavn\dev> echo $Env:JAVA_TOOL_OPTIONS
PS C:\Users\ditt_brukernavn\dev> cd .\fs-plattform\
PS C:\Users\ditt_brukernavn\dev\fs-plattform> echo $Env:JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF8
PS C:\Users\ditt_brukernavn\dev\fs-plattform> cd .\docs\
PS C:\Users\ditt_brukernavn\dev\fs-plattform\docs> echo $Env:JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF8
PS C:\Users\ditt_brukernavn\dev\fs-plattform\docs>
GIT BASH
Manuelt i Git Bash
SIKT+ditt_brukernavn@SIKT-4793 MINGW64 ~
$ export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8"
SIKT+ditt_brukernavn@SIKT-4793 MINGW64 ~
$ echo $JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF8
Script i Git Bash-profil som setter eller fjerner'JAVA_TOOL_OPTIONS' ved ny prompt
I filen 'C:\Users\ditt_brukernavn\.bashrc' kan du legge til et script likt dette. Dette scriptet setter 'JAVA_TOOL_OPTIONS' kun dersom du er i FS-plattform eller en underkatalog og fjerner 'JAVA_TOOL_OPTIONS' dersom du ikke er der.
java_tool() {
if [[ $PWD == "$HOME/dev/fs-plattform"* ]]; then
export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8"
else
unset JAVA_TOOL_OPTIONS
fi
}
PROMPT_COMMAND=java_tool
Når du bruker Git Bash i 'fs-plattform' eller en underkatalog, vil 'JAVA_TOOL_OPTIONS' være satt
SIKT+roaldmha@SIKT-4793 MINGW64 ~/dev
$ echo $JAVA_TOOL_OPTIONS
SIKT+roaldmha@SIKT-4793 MINGW64 ~/dev
$ cd fs-plattform
SIKT+roaldmha@SIKT-4793 MINGW64 ~/dev/fs-plattform (main)
$ echo $JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF8
SIKT+roaldmha@SIKT-4793 MINGW64 ~/dev/fs-plattform (main)
$ cd docs
SIKT+roaldmha@SIKT-4793 MINGW64 ~/dev/fs-plattform/docs (main)
$ echo $JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF8