- Java
- Maven
- Git
- Tålmodighet
- Godt humør
- Gå til https://github.com/eaardal/nerdschool-ci og bruk
Fork
-knappen oppe til høyre. Fork repositoriet til ditt repo (kopier repositoriet over til ditt repo). - Når det er forket, hent ned repositoriet lokalt:
git clone <url til repository du nettopp forket>
For å jukse litt kjører vi alle løsningene på byggeservere, og ikke på egne servere som vi ville gjort i virkeligheten. Men siden vi kommer til å kjøre flere løsninger side om side må de ha sin egen, unike port. Du får et tildelt portnummer av instruktør.
- Åpne
POM.xml
-filen i repoet du klonet, og finn port-innstillingen til Jetty. Endre portnummer til det du ble tildelt. - Lagre filen.
Når alt kjører i TeamCity vil addressen til din løsning være: http://nerdschool.cloudapp.net:PORT/
mvn clean install jetty:run
Om du går til http://localhost:8080/
i nettleseren skal du nå se en "Hello World" side.
Målet er at når man sjekker inn kode på en git branch i GitHub, så skal et bygg utføres i TeamCity. Bygget vi skal jobbe med her består av følgende steg:
- Kompiler koden og kjør tester
- TeamCity poller git repositoriet hvert 30 sekund
- Når en endringer er funnet, kopierer TeamCity alle filene i git repositoriet over til byggeserveren til en mappe på disk
- Når koden er kopiert, utføres byggetrinnene vi angir, i dette tilfellet vil det være å kjøre en Mavn kommando
mvn clean install
som vil kompilere og kjøre tester.
- Pakk løsningen (for hvert miljø appen skal ut til)
- Når vi har bekreftet at løsningen er gyldig (kompilerer + kjører tester), pakker vi hele løsningen sammen i en
.war
fil, som skal deployest til web serveren.
- Når vi har bekreftet at løsningen er gyldig (kompilerer + kjører tester), pakker vi hele løsningen sammen i en
- Kjør løsningen (for å minske kompleksiteten kjører vi appen på byggeserveren her)
- I en virkelig løsning vil vi kopiere
.war
-filen til en annen server for å bli kjørt der, men for enkelhets skyld kjører vi løsningen på byggeserveren her. - For å kjøre løsningen bruker vi webserveren Jetty som vi gir
.war
filen til.
- I en virkelig løsning vil vi kopiere
Siden vi kommer til å ha flere like konfigurasjoner side ved side må vi ha et unikt navn en del steder. Gruppenavnet bør være kort og ikke ha mellomrom. Vi kommer til å referere til gruppenavnet en del steder videre.
Hver gruppe må sette opp sitt eget sub-prosjekt (se bildet over)
Merk: Vi refererer til dette prosjektet som gruppeprosjektet videre
Administration
- Trykk på
Nerdschool Training
prosjektet Create subproject
- Name:
Unikt navn på gruppe eller person
Parametere er systemvariabler som referer til verdier, navn eller mapper på byggeserveren som vi kan bruke under oppsettet. F.eks så referer variabelen %teamcity.agent.work.dir%
til mappen C:\TeamCity\buildAgent\work
på byggeserveren, som er rotmappen for der filer TeamCity henter fra git blir lagt.
Vi må opprette noen slike variabler som er unike for gruppeprosjektet.
-
På Admin-siden til gruppeprosjektet du nettopp opprettet, velg
Parameters
i menyen til venstre. -
Add new parameter
-
Name:
<gruppenavn>.app.target
-
Value: Plassering til
target
-mappen:app\target
-
Add new parameter
-
Name:
<gruppenavn>.dropfolder
-
Value:
%teamcity.agent.work.dir%\<gruppenavn>\
-
Add new parameter
-
Name:
<gruppenavn>.dropfolder.app
-
Value:
app
-
Add new parameter
-
Name:
<gruppenavn>.dropfolder.app.target
-
Value:
%system.dropfolder%\app\target
Create VCS root
- Type of VCS: Git
- VCS root name: Valgfritt, anbefaler å bruker GitHub repository navn
- Fetch URL:
.git
url fra GitHub (f.ekshttps://github.com/eaardal/eaardal.github.io.git
- du finner den nede til høyre på GitHub repoet's fremside) - Test connection
Ofte vil man skille mellom Compile og Test i en slik prosess, dvs ha disse i to separate trinn, der Test-trinnet bare kjører om Compile-trinnet er ok. I dette tilfellet bruker vi Maven for å compile og teste i samme steg.
Maven (og Java) er installert på byggeserveren, så alle kommandolinjefunksjoner vi kan gjøre med Maven og Java på vår utviklermaskin kan gjøres på byggeserveren, via TeamCity. (Det vil også si at om vi tar inn andre avhengigheter i et prosjekt senere, som f.eks Node/npm, så må disse også installeres på byggeserveren).
Kommandoen for å bygge med Maven er mvn clean install
, gitt at man står i mappen med POM.xml
filen, som er Maven sitt register over avhengigheter og konfigurasjon.
- På admin-fremsiden til gruppeprosjektet, velg
General Settings
ogCreate build configuration
- Name:
Compile & Test
->Save
- I menyen til venstre velg
Build Steps
->Add build step
- Runner type:
Maven
- Step name:
Compile & Test
- Goals:
clean install
- Path to POM file: Avhenger av path til POM.xml i ditt GitHub repo. Trykk på "tree-node" ikonet ved siden av tekstboksen for å velge manuelt. Merk: Pathen inkluderer POM.xml filen, ikke bare mappen til der POM.xml er. Om du bruker repoet fra nerdschool er pathen trolig
app\POM.xml
. Save
Add build step
- Runner type:
Command line
- Step name:
Copy to dropfolder
- Execute step:
If all previous steps finished successfully
- Working dir:
%teamcity.agent.work.dir%
- Custom script:
xcopy %teamcity.build.default.checkoutDir% %<gruppenavn>.dropfolder% /s /e /Y
. Her bruker vi en av Parameterene vi lagde i forberedelsene. Dette steget er nødvendig fordi de forskjellige byggekonfigurasjonene i TeamCity befinner seg i ulike mapper på byggeserveren, så for atPackage
-steget (som vi ikke har laget enda, men som blir neste steg i rekken) skal kunne pakke filene fraCompile & Test
-steget (som vi lager nå), så må vi kopiere filene til en felles mappe der begge byggekonfigurasjonene kan nå filene. Derfor, når vi har kompilert og testet løsningen, så kopierer vi rubbel og bit til en "dropfolder" slik at neste byggesteg kan fortsette. Save
- I menyen til venstre velg
Triggers
->Add new trigger
VCS Trigger
Save
Nå skal TeamCity automatisk se etter endringer i git repoet hvert 60. sekund og sette i gang Compile & Test
byggekonfigurasjonen. Gå til Projects
-siden og se at bygget starter og fullfører ok. Når det har fullført ok, prøv å start det manuelt med Run
knappen.
- På admin-fremsiden til gruppeprosjektet, velg
General Settings
ogCreate build configuration
- Name:
Package
->Save
- I menyen til venstre velg
Build Steps
->Add build step
- Runner Type:
Maven
- Step name:
Package war
- Goals:
compile war:war
- Path to POM file:
%<gruppenavn>.dropfolder%\app\POM.xml
. Nå refererer vi til POM.xml filen som ligger i dropfolderen som forrige byggesteg ("Copy to dropfolder") gjorde klar for oss. Save
Dette vil kjøre Maven kommandoen mvn compile war:war
som egentlig er å kompilere løsningen igjen, og pakke den sammen til et .war
-arkiv.
- I menyen til venstre velg
Build Steps
->Add build step
- Runner type:
Command Line
- Step name:
Copy to deploy folder
- Execute step:
If all previous steps finished successfully
- Custom script:
mkdir %<gruppenavn>.dropfolder%\deploy -p
xcopy %<gruppenavn>.dropfolder.app.target%\ciapp-1.0-SNAPSHOT.war %system.dropfolder%\deploy /Y
Først oppretter vi en ny mappe som vi kan kopiere den ferdig bydge .war
-filen som er løsningen vi skal deploye, som 1 fil. Vi gjør dette av samme grunn som vi opprettet dropfolderen tidligere, for å kunne dele filer på kryss på av byggekonfigurasjoner. Om mappen finnes, oppretter vi den på nytt (-p
-flagget).
Så kopierer vi .war
-filen som vi lagde i forrige byggesteg, over til deploy folderen.
- I menyen til venstre velg
Triggers
->Add new trigger
- Velg
Finish build trigger
og i listen over byggekonfigurasjoner, velgCompile & Test
-steget tilhørende gruppen din.
Dette sørger for at Package
-konfigurasjonen starter automatisk når Compile & Test
fullfører.
- På admin-fremsiden til gruppeprosjektet, velg
General Settings
ogCreate build configuration
- Name:
Deploy
->Save
- I menyen til venstre velg
Build Steps
->Add build step
- Runner type:
Command Line
- Step name:
Run Jetty webserver
- Execute step:
If all previous steps finished successfully
- Working directory:
%<gruppenavn>.dropfolder%
- Custom script:
start "" java -jar %<gruppenavn>.app.target%\dependency\jetty-runner.jar %<gruppenavn>.app.target%\ciapp-1.0-SNAPSHOT.war
(Ja, med doble quotes etter Start)
Dette kjører pluginen jetty-runner
med .war
filen vår, dvs starter løsningen i en web server.
- I menyen til venstre velg
Triggers
->Add new trigger
- Velg
Finish build trigger
og i listen over byggekonfigurasjoner, velgPackage
-steget tilhørende gruppen din.
Dette sørger for at Deploy
-konfigurasjonen starter automatisk når Package
fullfører.
- Gjør en endring lokalt i git repoet og push endringen til GitHub:
- Gjør endring
git commit -am "commit melding i doble quotes"
git push origin master
- Gå til Projects-siden (hovedsiden) i TeamCity
- Vent tålmodig (inntil 60 sek) og se at
Compile & Test
starter automagisk - Se at
Package
steget starter automatisk nårCompile & Test
fullfører - Se at
Deploy
steget starter automatisk nårPackage
fullfører - Gå til http://nerdschool.cloudapp.net: og se at nettsiden kjører
Parametere er systemvariabler som referer til verdier, navn eller mapper på byggeserveren som vi kan bruke under oppsettet. F.eks så referer variabelen %teamcity.agent.work.dir%
til mappen C:\TeamCity\buildAgent\work
på byggeserveren, som er rotmappen for der filer TeamCity henter fra git blir lagt.
TBA TBA
-
Name:
<gruppenavn>.app.target
-
Value: Plassering til
target
-mappen:app\target
-
Name:
<gruppenavn>.dropfolder
-
Value:
%teamcity.agent.work.dir%\<gruppenavn>\
-
Name:
<gruppenavn>.dropfolder.app
-
Value:
app
-
Name:
<gruppenavn>.dropfolder.app.target
-
Value:
%system.dropfolder%\app\target