Hvad er CI/CD? Kontinuerlig integration og kontinuerlig levering
⚡ Smart opsummering
Kontinuerlig integration er en softwareudviklingspraksis, hvor teammedlemmer fletter deres arbejde sammen i et delt arkiv mindst dagligt, og hver commit udløser en automatiseret build og test for at opdage integrationsfejl tidligt.
Hvad er Continuous Integration (CI)?
Kontinuerlig integration er en softwareudviklingsmetode, hvor teammedlemmer integrerer deres arbejde mindst én gang om dagen. Hver integration verificeres af en automatiseret build, der registrerer fejl. Konceptet blev introduceret for over to årtier siden for at undgå "integrationshelvede", hvilket sker, når integration udskydes til slutningen af et projekt.
Efter en kode-commit bygges og testes softwaren med det samme. I et stort projekt med mange udviklere sker der commits mange gange om dagen. Med hver commit bygges og testes koden; hvis testen består, kontrolleres buildet for implementering; og hvis implementeringen lykkes, sendes koden til produktion. Denne commit-, build-, test- og implementeringscyklus er kontinuerlig, hvilket giver praksissen sit navn.
Hvad er Continuous Delivery (CD)?
Kontinuerlig tilførsel er en softwareudviklingsmetode, hvor et team udvikler software i korte cyklusser og sikrer, at den kan udgives pålideligt når som helst. Målet er at bygge, teste og udgive software med god hastighed og hyppighed, hvilket reducerer omkostningerne, tiden og risikoen ved at levere ændringer gennem hyppige produktionsopdateringer.
Forskellen mellem CI og CD
Kontinuerlig integration er en tilgang til automatisk at teste hver ændring i kodebasen, hvorimod Continuous Delivery er en tilgang til at få ændringer såsom nye funktioner, konfiguration og fejlrettelser i produktion sikkert og hurtigt.
Udvikling uden CI vs. udvikling med CI
| Udvikling uden CI | Udvikling med CI |
|---|---|
| Masser af fejl | Færre fejl |
| Sjældent forpligter sig | Regelmæssige commits |
| Sjældne og langsomme udgivelser | Regelmæssige arbejdsudgivelser |
| Svær integration | Nem og effektiv integration |
| Testen sker sent | Testning sker tidligt og ofte |
| Problemer er sværere at løse | Problemer findes og løses hurtigere |
| Dårlig projektsynlighed | Bedre projekt synlighed |
Forskellen mellem kompilering og kontinuerlig integration
Mens kompilering kun konverterer kode til maskinsprog, udfører CI flere bredere aktiviteter:
- DB-integration: Holder databasen og koden synkroniseret og automatiserer oprettelsen af databasen og testdata.
- Code inspektion: Sikrer en sund kodebase, identificerer problemer tidligt og anvender bedste praksis.
- Automatiseret implementering: Giver dig mulighed for at frigive produktet når som helst og holder det i en kontinuerligt demobar tilstand.
- Dokumentgenerering: Holder dokumentationen opdateret og producerer byggerapporter og metrikker.
- Samling: Konverterer kode på højt niveau til maskinsprog og sikrer, at den kompilerer på alle målplatforme.
Ideelt set kører buildet fra kommandolinjen i stedet for at være afhængigt af et IDE, sker kontinuerligt på en dedikeret CI-server (ikke et cron-job), udløses ved hver check-in og giver øjeblikkelig feedback uden udviklerindsats.
Hvad skal du bruge for at gennemføre CI-processen?
- Versionskontrolsystem (VCS): En pålidelig metode til at centralisere og bevare ændringer foretaget i dit projekt over tid.
- Virtuel maskine: En ekstra server eller mindst én virtuel maskine at bygge dit system.
- Hostede CI-værktøjsløsninger: For at undgå at administrere servere, vedligeholder hostede løsninger hele processen og tilbyder nemmere skalerbarhed.
- Værktøjer: Hvis du vælger en selvhostet variant, skal du installere et CI-værktøj som f.eks. Jenkins, TeamCity, Bambooeller GitLab.
Hvordan fungerer kontinuerlig integration?
Et gammelt eksempel er Nokia, som engang brugte en procedure kaldet nightly build. Efter flere commits fra mange udviklere i løbet af dagen blev softwaren bygget hver nat. Fordi den kun blev bygget én gang om dagen, var det smertefuldt at isolere, identificere og rette fejl i en stor kodebase.
Later Teamet anvendte kontinuerlig integration. Softwaren blev bygget og testet, så snart en udvikler committede kode, så enhver fejl blev opdaget med det samme, og den ansvarlige udvikler kunne hurtigt rette fejlen.
Funktioner af CI
- Giver dig mulighed for at vedligeholde et enkelt kildelager.
- Lader dig teste en klon af produktionsmiljøet, der holdes tæt på produktionsmiljøet.
- Giver konstant tilgængelighed af en aktuel build.
- Gør hele bygge-, test- og implementeringsprocessen synlig for alle interessenter.
Hvorfor bruge CI?
- Hjælper dig med at bygge software af bedre kvalitet og udføre gentagne tests.
- Skalerer leveringsoutputtet fra ingeniørteams og lader udviklere arbejde parallelt på funktioner.
- Øger synlighed og kommunikation på tværs af teamet.
- Giver øjeblikkelig feedback, når der opstår et problem, og reducerer risikoen ved at gøre implementeringen hurtigere og mere forudsigelig.
- Undgår forvirring i sidste øjeblik ved udgivelsestidspunktet.
Bedste praksis for brug af CI-systemer
- Commit tidligt og ofte, og commit aldrig ødelagt kode.
- Ret buildfejl med det samme, og handl på metrikker.
- Byg i alle målmiljøer og skab artefakter fra alle builds.
- Automatiser build'et, så det ikke er afhængigt af et IDE.
- Byg og test alt, når det ændres, inklusive databaseskemaet.
- Hold byggeprocessen hurtig, og brug automatiseret implementering.
Ulemper ved CI
- Det kræver tid til indledende opsætning og træning at vænne sig til en CI-server.
- Der skal udvikles passende testprocedurer, og en veludviklet testsuite kræver betydelige ressourcer.
- Kendte processer skal konverteres, og yderligere servere og miljøer er nødvendige.
- Ventetider kan opstå, når flere udviklere ønsker at integrere deres kode på samme tid.
Værktøjer til CI-processen
Jenkins
Jenkins er et open source-værktøj til kontinuerlig integration skrevet i JavaDet muliggør realtidstestning og rapportering af isolerede ændringer i en større kodebase og hjælper udviklere med hurtigt at finde og løse fejl, samtidig med at det automatiserer build-testning.
Bamboo
Bamboo er en build-server med kontinuerlig integration, der udfører automatiseret build, test og release på ét sted. Den fungerer problemfrit med Jira og Bitbucket og understøtter mange teknologier som Docker, Git, SVN, Mercurial og AWS.
TeamCity
TeamCity er en server for kontinuerlig integration med mange kraftfulde funktioner. Den holder CI-serveren sund og stabil, selv når der ikke kører nogen builds, og giver bedre kodekvalitet til ethvert projekt.

