Continuous Delivery

Den senaste tiden har vi på DevCore jobbat aktivt för att säkra och höja kvaliteten på våra leveranser. Hög leveranskvalitet beror naturligtvis även på planering, projektstyrning och utvecklingsprocesser, men här tänkte jag koncentrera mig på att berätta lite om hur vi förändrar våra releaseprocesser.

Vi strävar efter att våra projekt ska anamma continuous delivery, vilket innebär korta releasecykler med automatiserade byggen, tester och produktionssättningar. Poängen med att automatisera så mycket som möjligt är att releaseprocessen blir förutsägbar och repeterbar, vilket i sin tur gör att man sparar tid och minimerar mänskliga fel som kan uppkomma vid manuella steg.

Versionshantering är en förutsättning för att spåra kodförändringar över tid och att hålla parallella utvecklingsspår samtidigt. Vi har länge använt Git för att hantera vår källkod, men nu har vi även standardiserat vår branchingstrategi och hur den relaterar till olika releasekanaler och livscykler.

Vi har tidigare använt Team Foundation Servers (TFS) XAML byggsystem för att automatiskt kompilera och köra tester när ny kod checkas in. Nu migrerar vi våra byggen till det nya byggsystemet i TFS 2015 som är mer kraftfullt och modulärt. Med det nya byggsystemet kan vi nu, direkt på byggserver, enkelt köra allt som behövs (kod kompilering, sass kompilering, sprite generering, npm, gulp m.m.) för att få ihop ett deploybart paket. Tidigare behövde utvecklare skapa detta paket lokalt på sin utvecklingsdator, vilket kan skapa problem då man inte har en konsekvent byggmiljö. 

Nu kan vi även köra fler tester och analysverktyg för att snabbare fånga eventuella problem. Det faktum att byggservern kan köra preprocessorer för t.ex. javascript och css, gör att vi inte längre behöver checka in resultatfilerna, så nu slipper vi onödiga irriterande mergekonflikter när flera utvecklare jobbar tillsammans.

När det gäller deployer av det som byggts så har vi tidigare gjort det via MS web deploy i våra interna testmiljöer, men då web deploy har vissa begränsningar så har vi gjort produktionssättningar genom manuell filkopiering. Nu har vi införskaffat Octopus Deploy för att sköta alla deploys oavsett miljö. Med Octopus Deploy får vi en releasepipeline där releaser trycks in direkt ifrån byggservern. Releasepipelinen har olika steg, ett för varje miljö som ska deployas till. Hur många steg det är beror på projekt men oftast är det 2 eller 3 miljöer (utveckling/test - staging - produktion).

Med Octopus Deploy byggs releasen enbart en gång, vilket gör att man kan vara säker på att man deployar exakt samma filer oavsett miljö. Efter tester är avklarade i en miljö kan man enkelt avancera releasen till nästa steg i kedjan med en knapptrycking och Octopus Deploy sköter allt automatiskt. Transformationer för konfigurationsfiler, som hanterar skillnader mellan miljöer, appliceras vid deploy istället för vid bygge som är det vanliga.

Utöver att göra releaser snabbare och mer robusta så ger Octopus Deploy tillsammans med TFS total spårbarhet mellan miljöer, byggserver och källkod. Det blir inget tvivel om vilken kod som körs i en miljö då man snabbt kan se exakt vilket unikt versionsnummer som är deployat och vilket bygge och version av koden som det motsvarar.

De förändringar vi gjort gör jobbet enklare, effektivare och tryggare för våra utvecklare och vi är övertygade om att det kommer återspeglas i affärsvärde för våra kunder.