Continuous Integration

Continuous Integration, CI, är en metod som föreskriver att kod och system ska integreras frekvent med syftet att minska risker och tidigt identifiera integrationsrelaterade problem. Metoden lämpar sig för alla projekt eller leveranser som är i behov av att automatisera build och deployment processen samt upptäcka integrationsfel tidigt.

Continuous Integration växte fram som en metod inom Extreme Programming (XP). Martin Fowler och Kent Beck skrev om CI redan runt 1999.

“Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible.

Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.”

Martin Fowler
http://martinfowler.com/articles/continuousIntegration.html

Syfte

Continuous Integration handlar om att minska risker och accelerera utvecklingen. Det kräver en liten initial investering och genom att följa CI som en av många utvecklingsdiscipliner kan ni förvänta er att minska integrationsproblemen för både kod och hela system.

Fördelar med CI:

  • Tester sker tidigt och ofta
  • Fel upptäcks tidigt
  • Transparensen ökar
  • Minskat manuellt arbete, vilket ger mer tid över för att leverera värde
  • Build och deployment går snabbare och utan risk för manuella handhavandefel
  • Tester sker kontinuerligt under utvecklingen och inte i slutet
  • Integration blir en icke-händelse – inget mer integration hell
  • Minskat behov av iterationer som enbart fokuserar på system integration

För de team som består av flera personer, som har scriptade testfall, variationer i olika miljöer och som vill minska problem med integrationer så är CI en självklar metod. Fördelarna övervägar nackdelarna – effekten av att tidigt identifiera och åtgärda fel i utvecklingsarbetet sparar både tid och pengar.

För agila systemutvecklingsprojekt är det här en naturlig metod att tillämpa.

Tillämpning

Om det går lång tid mellan varje integrationstillfälle ökar sannolikheten för att fel uppstår samt att det blir svårare att hitta felet, eftersom sökområdet blir större. Genom frekventa integrationer upptäcks fel tidigare och sökområdet begränsas. Genom att ladda upp ny kod till ett repository, versionshanterad lagringsplats för källkod, ofta och skapa en automatisk integration av koden kommer förändringar i koden som medför fel upptäckas tidigt. Det finns flera verktyg för att övervaka förändringar i ett repository och automatiskt genomföra integration samt övervaka resultatet.

Förberedelser

  • Teamet är överens om att följa CI disciplinen
    Teamet måste förstå värdet och fördelarna med CI och vara motiverade att införa CI. För att lyckas med CI krävs disciplin från teamet – att följa det arbetssätt som förespråkas för teamets och systemets bästa.
  • Etablera en CI server
    CI servern bevakar projektets repository, utför integrationsprocessen och rapporterar resultatet. En CI server är en liten investering för ett projekt i förhållande till det manuella arbetet som den sparar.
  • Extrahera bygg scriptet
    Integrationsprocessen ska inte vara beroende av en utvecklingsmiljö. Extrahera byggscriptet så det kan köras på vilken miljö som helst, var noga med att ange förutsättningar  i form av underliggande installationer och tredjeparts produkter.
  • Skapa ett feedback system
    Systemet ska ge en tydlig bild av tillståndet projektets respositor samt resultatet av kompilering och tester.

Genomförande

Det finns 10 rekommendationer som Martin Fowler har formulerat för hur ett team kan lyckas med CI.

  • Arbeta med ett repository för er kod
    Alla artefakter som behövs för att bygga ert system ska finnas i ert repository, exklusive OS och applikationer som är en del av miljön.
  • Automatisera bygget
    Systemet ska kunna byggas med en knapptryckning. Använd verktyg som Make, Ant, Maven, MSBuild eller liknande.
  • Se till att systemet testar sig själv som en del av integrationsprocessen
    När koden är kompilerad bör tester exekveras för att verifiera att systemet fungerar som förväntat.
  • Alla i teamet gör commit varje dag
    Minska avståndet mellan integration av kod genom att frekvent göra en commit av kod.
  • Varje gång det sker en commit bör det även triggas en integrationsprocess
    Integrationsprocessen genomför en build, där koden kompileras och testas och resultatet återkopplas till teamet. Att göra det i samband med varje commit ger snabb återkoppling till teamet att allt fungerar som förväntat.
  • Se till att integrationsprocessen går fort
    En build ska ta några minuter upp till ca 15 minuter men inte mer.
  • Testa i en klon av produktionsmiljön
    Det finns risk för skillnader mellan olika miljöer. När tester sker av systemet ska de genomföras i en så produktionslik miljö som möjligt för att förhindra att fel uppstår i produktion men inte under utvecklingen.
  • Den senaste fungerande versionen av systemet ska vara tillgänglig
    Vid ett godtyckligt tillfälle ska den senaste fungerande versionen vara tillgänglig för test, demonstration eller leverans.
  • Resultatet av den senaste integrationsprocessen ska vara synlig för alla
    Det ska vara enkelt för alla, även de utanför teamet, att ta del av resultatet från den projektets senaste build.
  • Automatisera deployment
    De flesta CI verktyg kan exekvera script när integrationsprocessen är klar. Genom att skriva script som gör en deployment till olika målmiljöer kan även det arbetet automatiseras. 

Läs mer om rekommendationerna här.

Integration av kod går till enligt följande:

  1. Utvecklare bygger koden på sin lokala dator och om allt går bra gör de en commit, laddar upp koden, till projektets gemensamma respository.
  2. CI servern inväntar en uppdatering i projektets respository. Vid en uppdatering kör CI servern en integrationsprocess med ett fristående byggscript som omfattar kompilering, tester men även aktiviteter som databasintegration, inspektion av kod, automatisk deployment eller generering av dokumentation och statistik.
  3. När integrationsprocessen är klar återkopplar CI servern resultatet till teamet. Om kompilering eller tester misslyckas kan exempelvis teamet informeras via e-post.

CI

Uppföljning

CI är inte en ingångsinvestering för att förbättra integration av kod och system – det är en disciplin som ska efterlevas under hela projektet. Med hjälp av resprospektiv kan CI metoden utvärderas och förbättras.

Det finns mängder av bra verktyg för att samla in statistik som sen kan presenteras på ett snyggt sätt. Relevant statistik kan ge er en bättre förståelse för ert system och hur ni kan förbättra det.

Erfarenheter

För att lyckas med CI finns det några erfarenheter som teamet bör ha med sig.

  • Arbeta aktivt mot projektets respoitory
    På samma sätt som system mår bra av att integreras ofta ska även kod integreras ofta. Ett aktivt arbete mot den gemensamma koden är viktigit. Se därför till att göra commits flera gånger per dag och såklart hämta hem ny kod från kollegor. Teamet ska ha ett gemensamt ägande över koden där alla kan läsa, förbättra och kommentera varandras kod.
  • Följ disciplinen för hur ni gör en commit
    Updatera med den senaste koden från ert respository, bygg koden lokalt och om allt går bra kan ni göra en commit. Om det uppstår några problem behöver de konflikterna hanteras först. Undvik helt enkelt de integrationsproblem som går genom att testa lokalt först.
  • Om er CI server får ett fel har det högsta prioritet
    Även om utvecklare gör en commit som har fungerat lokalt på sin dator kan det bli ett fel när CI servern kör sitt integrationsscript. Det beror oftast på skillnader i miljöer eller att CI-servern kör mer omfattande tester. Ett fel som rapporteras av CI servern motsvarar ett stop i fabriken – teamets fokus och högsta prioritet är att lösa problemet.
  • Snabb integrationsprocess
    Se till att integrationsprocessen är snabb, inte längre än ca 15 minuter. Använd testfall som går snabbt att köra i första hand och fokusera på kärnfunktionalitet. Om CI serven tar för lång tid på sig kommer utvecklare behöva vänta på att göra en ny commit – eftersom de vill försäkra sig om att den föregående fungerade.
  • Bygg systemet i rätt miljö
    Det finns alltid små skillnader mellan olika miljöer. En utvecklad och testad funktion som fungerar på et utvecklares dator är inte klar förens den fungerar i målmiljön, exempelvis produktionsmiljön eller en acceptanstestmiljö. Se därför till att era byggen (kompilering, tester med mera) sker i rätt miljö.
  • Skapa paket som är redo för leverans
    Ha som ambition att skapa ett fristående paket som kan användas vid en deployment. Praxis i CI är att vid varje tillfälle ha en fungerande version av systemet som är redo att levereras.

Mer information

Boken Continuous Integration: Improving Software Quality and Reducing Risk rekommenderas för alla som vill lära sig mer om CI samt vill få praktiska tips.

Även värt att läsa följande böcker och besöka dessa webbplatser:

Uppdaterades: 2012-03-26 18:19:30