Dette indlæg er et afsnit i serien om Continuous Integration.
Nu er der jo ikke meget sjov ved bare at check koden ud, så lad os få bygget noget. Vi starter med at tilføje en task:
<tasks>
<nant>
<baseDirectory>d:\dev\framework</baseDirectory>
<executable>d:\dev\tools\nant\nant.exe</executable>
<buildFile>framework.build</buildFile>
<targetList>
<target>clean</target>
<target>compile-tests</target>
</targetList>
</nant>
</tasks>
Task elementer kan indeholde mange forskellige opgaver hvor vi her har valgt at køre et NAnt script. Man kunne vælge at bruge MSBuild til at bygge VS solutions med, men jeg flytter nogle ektra ting ned i build scriptet som også kan køres på udvikler maskiner. Mit NAnt script kalder så MSBuild scripts, så du har egentlig tre niveauer for hvor du skal bygge:
CC, NAnt, MSBuild (Tilføj selv flere efter behov). Hvilket niveau du vælger afhænger af dine ønsker, men jeg fortrækker at man har mulighed for at kontrollere både build og unit-tests inden man checker kode ind i source kontrol systemet.
Dette script bygger to target: Et clean target (så vi slipper af med gammelt bras) og et compile target som bygger unit test, men som afhænger af at frameworket et bygget. Tilføj selv flere targets efter behov.
Hvis du har installere på en frisk maskine uden Visual Studio, så løber du nok ind i problemer med NAnt. Problemer udmønter sig i brok over at installDir for net-2.0 ikke er angivet og det er selvom du tvinger den til at bruge net-3.5. For at løse det finder du din NAnt.exe.config fil og søger efter readregistry elementer. Attributen sdkInstallRoot skal rettes. I mit tilfælde (jeg bruger Windows SDK 6.1) til: SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.1\WinSDKNetFxTools\InstallationFolder. Det skal lige gøres et par steder, så kører det. Dette kan dog være løst i en nye version af NAnt når du læser dette. Jeg har taget udgangspunkt i TreeSurgeon som giver dig både et buildscript og de tilhørende filer.
Når vores projekter er bygget kan vi kopiere bygget til vores filserver med denne lille build publisher:
<buildpublisher>
<sourceDir>d:\dev\framework\build</sourceDir>
<publishDir>\\fileserver\framework</publishDir>
</buildpublisher>
Så er der altid adgang til det nyeste build.
Når nu det hele kører så mangler vi bare den automatiske del. Til det formål har CC en række triggers hvoraf ForceBuildTrigger er default. Det mest oplagte for CI er at indsætte en IntervalTrigger i triggers blokken:
<triggers>
<intervalTrigger name="Continuous" seconds="60" />
</triggers>
Med denne trigger vil CC checke subversion hvert minut. Hvis der er sket ændringer vil den sætte gang i et nyt build. Et natligt rebuild kan tilføjes med en ScheduleTrigger
<scheduleTrigger time="23:30" buildCondition="ForceBuild" name="Scheduled" />
Bemærk at buildCondition er sat til ForceBuild mod default at være IfModificationExists. Dette kan også bruges for intervalTrigger hvis man skulle få brug for det. Der er mange muligheder for at tilpasse triggers, så f.eks. der ikke bygges på bestemte tidspunkter med FilterTrigger eller at ScheduleTrigger kun bygger på hverdage. Se mere under http://confluence.public.thoughtworks.org/display/CCNET/Trigger+Blocks
Nu er det bare at checke noget nyt kode ind og vente på at de dit byg (hvis du altså ikke vil vente til kl 23.30).