Vad är CI/CD? Kontinuerlig integration och kontinuerlig leverans
⚡ Smart sammanfattning
Kontinuerlig integration är en metod för mjukvaruutveckling där teammedlemmar sammanfogar sitt arbete i ett delat arkiv minst dagligen, och varje commit utlöser en automatiserad version och testning för att upptäcka integrationsfel tidigt.
Vad är Continuous Integration (CI)?
Kontinuerlig integration är en metod för mjukvaruutveckling där teammedlemmar integrerar sitt arbete minst en gång om dagen. Varje integration verifieras av en automatiserad version som upptäcker fel. Konceptet introducerades för över två decennier sedan för att undvika "integrationshelvetet", vilket inträffar när integrationen skjuts upp till slutet av ett projekt.
Efter en kodcommit byggs och testas programvaran omedelbart. I ett stort projekt med många utvecklare sker commits många gånger om dagen. Med varje commit byggs och testas koden; om testet klaras kontrolleras bygget för driftsättning; och om driftsättningen lyckas skickas koden till produktion. Denna commit-, bygg-, test- och driftsättningscykel är kontinuerlig, vilket ger metoden dess namn.
Vad är kontinuerlig leverans (CD)?
Kontinuerlig leverans är en mjukvaruutvecklingsmetod där ett team utvecklar programvara i korta cykler och säkerställer att den kan släppas tillförlitligt när som helst. Målet är att bygga, testa och släppa programvara med god hastighet och frekvens, vilket minskar kostnaden, tiden och risken för att leverera ändringar genom frekventa produktionsuppdateringar.
Skillnaden mellan CI och CD
Kontinuerlig integration är en metod för att testa varje ändring i kodbasen automatiskt, medan kontinuerlig leverans är en metod för att snabbt och säkert få ändringar som nya funktioner, konfiguration och buggfixar in i produktion.
Utveckling utan CI jämfört med utveckling med CI
| Utveckling utan CI | Utveckling med CI |
|---|---|
| Massor av buggar | Färre buggar |
| Sällsynta begås | Regelbundna åtaganden |
| Sällsynta och långsamma släpp | Regelbundna fungerande releaser |
| Svår integration | Enkel och effektiv integration |
| Testning sker sent | Testning sker tidigt och ofta |
| Problem är svårare att åtgärda | Problem upptäcks och åtgärdas snabbare |
| Dålig projektsynlighet | Bättre projektsynlighet |
Skillnaden mellan kompilering och kontinuerlig integration
Medan kompilering bara konverterar kod till maskinspråk, utför CI flera bredare aktiviteter:
- DB-integration: Håller databasen och koden synkroniserade och automatiserar skapandet av databasen och testdata.
- Code inspektion: Säkerställer en hälsosam kodbas, identifierar problem tidigt och tillämpar bästa praxis.
- Automatiserad distribution: Gör att du kan släppa produkten när som helst och håller den i ett kontinuerligt demonterbart tillstånd.
- Dokumentgenerering: Håller dokumentationen aktuell och producerar byggrapporter och mätvärden.
- Kompilering: Konverterar högnivåkod till maskinspråk och säkerställer att den kompileras på alla målplattformar.
Idealiskt sett körs bygget från kommandoraden snarare än att vara beroende av en IDE, sker kontinuerligt på en dedikerad CI-server (inte ett cron-jobb), triggas vid varje incheckning och ger omedelbar feedback utan utvecklaransträngning.
Vad behöver du för att genomföra CI-processen?
- Version Control System (VCS): En pålitlig metod för att centralisera och bevara ändringar som görs i ditt projekt över tid.
- Virtuell maskin: En extra server eller åtminstone en virtuell maskin att bygga ditt system.
- Lösningar för värdbaserade CI-verktyg: För att undvika att hantera servrar, hanterar hostade lösningar hela processen och erbjuder enklare skalbarhet.
- Verktyg: Om du väljer en självhostad variant, installera ett CI-verktyg som t.ex. Jenkins, TeamCity, Bambooeller GitLab.
Hur fungerar kontinuerlig integration?
Ett gammalt exempel är Nokia, som en gång använde en procedur som kallades nightly build. Efter flera commits från många utvecklare under dagen byggdes programvaran varje natt. Eftersom den bara byggdes en gång om dagen var det smärtsamt att isolera, identifiera och åtgärda fel i en stor kodbas.
Later Teamet använde kontinuerlig integration. Programvaran byggdes och testades så snart en utvecklare implementerade kod, så eventuella fel upptäcktes omedelbart och den ansvariga utvecklaren kunde åtgärda felet snabbt.
Funktioner hos CI
- Låter dig underhålla ett enda källkodsarkiv.
- Låter dig testa en klon av produktionsmiljön, som hålls nära produktionsmiljön.
- Ger konstant tillgänglighet för en aktuell version.
- Gör hela bygg-, test- och driftsättningsprocessen synlig för alla intressenter.
Varför använda CI?
- Hjälper dig att bygga programvara av bättre kvalitet och utföra repeterbara tester.
- Skalar leveransutgången för ingenjörsteam och låter utvecklare arbeta parallellt med funktioner.
- Ökar synligheten och kommunikationen i hela teamet.
- Ger omedelbar feedback när ett problem uppstår och minskar risken genom att göra distributionen snabbare och mer förutsägbar.
- Undviker förvirring i sista minuten vid publicering.
Bästa praxis för att använda CI-system
- Commit tidigt och ofta, och commit aldrig trasig kod.
- Åtgärda byggfel omedelbart och agera utifrån mätvärden.
- Bygg i varje målmiljö och skapa artefakter från varje bygge.
- Automatisera bygget så att det inte är beroende av en IDE.
- Bygg och testa allt när det ändras, inklusive databasschemat.
- Håll bygget snabbt och använd automatiserad distribution.
Nackdelar med CI
- Det krävs tid för initial installation och utbildning för att vänja sig vid en CI-server.
- Lämpliga testprocedurer måste utvecklas, och en välbyggd testsvit kräver betydande resurser.
- Välbekanta processer måste konverteras, och ytterligare servrar och miljöer krävs.
- Väntetider kan uppstå när flera utvecklare vill integrera sin kod samtidigt.
Verktyg för CI-processen
Jenkins
Jenkins är ett verktyg för kontinuerlig integration med öppen källkod skrivet i JavaDet underlättar realtidstestning och rapportering av isolerade förändringar i en större kodbas och hjälper utvecklare att snabbt hitta och lösa fel samtidigt som det automatiserar byggtestning.
Bamboo
Bamboo är en byggserver för kontinuerlig integration som utför automatiserad byggnation, testning och lansering på ett ställe. Den fungerar sömlöst med Jira och Bitbucket och stöder många tekniker som Docker, Git, SVN, Mercurial och AWS.
TeamCity
TeamCity är en server för kontinuerlig integration med många kraftfulla funktioner. Den håller CI-servern frisk och stabil även när inga byggen körs och ger bättre kodkvalitet för alla projekt.

