Kontinuerlig integrasjon
Hva er kontinuerlig integrasjon?
Kontinuerlig integrasjon (CI) er en devops- og programvareutviklingspraksis der kode kontinuerlig integreres i trunk (et delt repository, også kjent som master eller mainline) der disse integrasjonene automatisk bygges og testes.
Ved å integrere kontrollerte deler av koden i mastergrenen mer regelmessig, kan du finne feil raskere og lettere. Kontinuerlig integrasjon gjør at du slipper å håpe at koden din fungerer når du slår den sammen med alle andres kode, fordi du vet hvilken status den har i forhold til mainline.
Uten CI må programvareutviklerne jobbe med å ferdigstille hele funksjonen før de kan slå den sammen med resten av kodebasen. Når en utvikler har slått den sammen med hovedkoden, har det skjedd så mange endringer at det oppstår en såkalt sammenslåingskonflikt, eller konkurrerende endringer i koden. Dette skaper friksjon i utviklingsflyten fordi det noen ganger tar timer å løse og slå sammen kode som er skrevet av forskjellige teammedlemmer eller team.
Her er noen av de beste fremgangsmåtene for kontinuerlig integrasjon:
- Oppretthold all kode i ett enkelt repository for enklere administrasjon.
- Oppmuntre til små, hyppige kodeforpliktelser til hovedgrenen.
- Optimaliser byggetiden for rask tilbakemelding ved hjelp av caching og parallellisering.
- Implementer pålitelige automatiserte tester (enhets-, integrasjons- og regresjonstester).
- Bruk separate testmiljøer for å unngå konflikter.
- Bruk versjonsstrategier for enkel sporing og tilbakeføring.
Hvorfor er kontinuerlig integrasjon viktig?
CIs integrering av automatiserte tester og eksperimenter effektiviserer ikke bare utviklingsprosessen, men bidrar også til å bygge robuste funksjoner ved å fange opp feil tidlig, sikre funksjonalitet og muliggjøre en mer effektiv utviklingssyklus.
CI bidrar til å bygge funksjonelle funksjoner som fungerer, blant annet ved å
- Validere funksjonalitet: Automatiserte tester i CI-pipelines verifiserer at nye funksjoner eller endringer oppfyller funksjonelle krav og ikke ødelegger eksisterende funksjonalitet. Dette sikrer at funksjonene fungerer som forventet før distribusjon.
- Iterativ utvikling: CI støtter en iterativ utviklingstilnærming, slik at utviklere kan gjøre trinnvise endringer og teste dem regelmessig. Denne iterative prosessen bidrar til utvikling av funksjoner som utvikler seg jevnt og pålitelig.
- Tidlig oppdagelse av problemer: Ved å kjøre tester og eksperimenter under integrasjonen kan CI identifisere problemer tidlig i utviklingssyklusen. Dette reduserer sjansen for å distribuere feilaktige funksjoner.
Fordeler med kontinuerlig integrasjon
Øker utviklingshastigheten
Ved å bruke kontinuerlig integrasjon kan organisasjoner øke utviklingshastigheten fordi utviklere kan isolere deler av koden for effektivt å finne feil i programvareprosjektene sine og rulle ut nye funksjoner til kundene uten å skape fiksjon i opplevelsen. Utviklere kan integrere uferdige funksjoner i mastergrenen bak funksjonsflagg uten å risikere ustabilitet.
I tillegg kan utviklerne jobbe uten å måtte bekymre seg for å løse rotete sammenslåingskonflikter. Ved å bruke funksjonsflagg eller funksjonsbrytere kan funksjoner som er under utvikling, skyves inn i en delt gren uten å blokkere utgivelsen fra den grenen.
Forbedre produktkvaliteten
Når du sjekker inn koden oftere, forbedrer du produktkvaliteten fordi du kjører tester mot koden flere ganger om dagen og ikke venter på at en gigantisk build skal hoper seg opp før du prøver å integrere den med alle andres arbeid. Muligheten til å kontrollere deler av koden gjør at utviklerne kan fokusere på kvaliteten på koden og levere raskere og tryggere.
Sterkt kodefundament
Det er urealistisk å forestille seg en verden med 100 % feilfri kode, men det er mulig å ha verktøy og prosesser på plass for å fange opp de mest forstyrrende feilene, og det bør være en del av tankegangen når du implementerer kontinuerlig integrasjon i bedriften din. Når du bruker CI, har teamene full kontroll og oversikt over hva som blir introdusert i kodebasen, og de kan enkelt finne ut om en distribusjon har forårsaket en feil.
Raskere tilbakemeldingssløyfer
Ved å kjøre automatiserte tester og eksperimenter i CI-pipelines får du rask tilbakemelding på effekten av kodeendringer. Utviklere kan raskt ta tak i problemer, iterere og forbedre kodekvaliteten uten forsinkelser.
Muliggjør eksperimentering
CI gjør det enklere å kjøre eksperimenter og A/B-tester som en del av integrasjonsprosessen. Utviklere kan introdusere nye funksjoner eller endringer, teste dem i et kontrollert miljø og vurdere effekten av dem før de distribueres til produksjon.
Funksjonens pålitelighet
Kontinuerlig integrasjon sikrer at funksjoner testes grundig på en automatisert måte. Det gjør det mulig å identifisere og rette opp feil raskt, noe som øker påliteligheten til nye funksjoner.
Verktøy for kontinuerlig integrasjon
Det finnes mange CI-verktøy som kan hjelpe utviklere med å implementere kontinuerlig integrasjon i programvareutviklingsprosessen:
-
Kildekontroll
Kildekontroll- og versjonskontrollsystemer som Git, Github (for programvare med åpen kildekode), Bitbucket og Subversion fungerer både som et kodelager og som en måte å slå sammen endringer i kildekoden på og løse konflikter i kode som integreres. -
Automatiserte tester
Med den hyppige kodeintegrasjonen som CI-prosessen innebærer, er det viktig å sikre kvaliteten på koden som slås sammen, og derfor er automatiserte enhetstester og testsuiter som Jenkins og Selenium avgjørende. -
Automatisering av bygging
Verktøy for kontinuerlig integrasjon har også funksjonalitet som bidrar til å automatisere byggeprosessen, slik at byggingen starter automatisk ved hjelp av triggere, for eksempel når ny kode slås sammen til hovedlinjen, en prosess som kalles kontinuerlig distribusjon. -
CI-plattformer
Det finnes mange plattformer for kontinuerlig integrasjon som hjelper deg med å administrere mange av oppgavene som er involvert i CI-prosessen. Populære verktøy inkluderer CircleCI, Jenkins, Buddy, Gitlab CI, Travis CI og Codeship.
Prosess for funksjonslevering gjennom kontinuerlig integrasjon
Slik ser en prosess for funksjonslevering ut for utvikling av både nett- og mobilapper:
-
Kodeutvikling og versjonskontroll
Utviklere jobber med kodeendringer lokalt, som skyves over til et versjonskontrollsystem. -
Automatiserte builds og tester
CI-systemer (f.eks. Jenkins, Travis CI) starter automatiserte bygginger utløst av kodeendringer.
For webapper
- Bygge koden til et kjørbart format (f.eks. JavaScript, HTML, CSS).
- Kjører enhetstester for å sjekke kodens funksjonalitet.
- Generering av artefakter for distribusjon.
For mobilapper
- Bygge appen for målplattformene (f.eks. iOS, Android).
- Kjøre automatiserte tester (enhetstester, integrasjonstester) på emulatorer eller ekte enheter.
- Opprette byggeartefakter (APK-, IPA-filer).
-
Kontinuerlig integrering og distribusjon
Automatisert distribusjon til staging-miljøer eller testservere for webapper. Mobilapper kan gjennomgå betatesting eller distribueres til testgrupper via appdistribusjonsplattformer (f.eks. TestFlight, Google Play Console). -
Test og validering
Manuelle tester av QA-team eller interessenter for webapper i staging-miljøer. Mobilapper gjennomgår brukerakseptansetesting (UAT) på faktiske enheter i kontrollerte miljøer.
Automatiserte tester (regresjon, ytelse) fortsetter å kjøre parallelt. -
Tilbakemeldinger
Samle inn tilbakemeldinger fra interessenter, QA og brukertester. Kodeendringer og nye funksjoner går gjennom CI-pipelinen igjen for validering. -
Distribusjon
Godkjente endringer går over til produksjonsdistribusjon for nettapper. Mobilapper lanseres i appbutikker (App Store, Google Play Store) eller via MDM-systemer (Mobile Device Management). -
Overvåking
Kontinuerlig overvåking av distribuerte funksjoner og rask håndtering av eventuelle problemer etter distribusjon gjennom CI/CD-pipelines.
Denne funksjonsleveringsprosessen gjennom CI sikrer en strømlinjeformet og iterativ tilnærming til å bygge, teste og distribuere både nett- og mobilapplikasjoner.
Kontinuerlig integrasjon vs. kontinuerlig levering
Kontinuerlig levering (CD) er en programvareutviklingsprosess som går ut på å få kodeendringer ut i produksjon raskt, sikkert og med høyere kvalitet, vanligvis ved hjelp av verktøy for å automatisere distribusjonene. Ingeniørteam gjør endringer i programvaren i korte sykluser, slik at den kan testes og slippes oftere. Denne tilnærmingen gir mulighet for inkrementelle endringer med både lavere kostnader og risiko.
I tradisjonell programvareutvikling skjer integrasjonsprosessen på slutten av et prosjekt, etter at hver enkelt person er ferdig med sitt arbeid. Denne prosessen kan ta lang tid og være frustrerende for alle involverte.
Kontinuerlig integrasjon er en praksis for programvareutvikling som flytter integrasjonsfasen tidligere i utviklingssyklusen, slik at utvikling, test og integrering av kode skjer med større hyppighet. Utviklingsteamet fusjonerer kodeendringer inn i et felles, sentralt repository flere ganger om dagen for å kunne lansere en produktversjon når som helst. Dette krever en integrasjonsprosess som er reproduserbar og automatisert.
Kontinuerlig integrasjon og kontinuerlig leveranse er vanligvis koblet sammen som en del av den smidige utviklingsmetodikken, så mye at det kombinerte akronymet "CI/CD" ofte brukes for å beskrive prosessen.
Kontinuerlig integrasjon og produkteksperimentering
For å drive en vellykket eksperimenterende organisasjon må utviklingsteamet jobbe raskt og effektivt, fordi det er behov for å iterere når funksjonene har blitt brukt i virkelige miljøer. Med funksjonsflagg kan du eksperimentere med større selvtillit og slippe å bekymre deg for å måtte endre infrastruktur eller kode hvis du ønsker å aktivere eller deaktivere en funksjon.
For å bidra til at A/B-testing forblir en viktig del av organisasjonens distribusjonsprosess, integrerer Optimizely serversideeksperimentering funksjonsflagg, utrullinger og variabler med eksperimentering, slik at du kan kontrollere hele livssyklusen for produktutvikling på ett og samme sted. Ved først å kjøre en A/B-test på en del av trafikken, kan teamet ditt teste og gradvis optimalisere en ny funksjon. Når du har den beste brukeropplevelsen, kan den rulles ut på en kontrollert måte på tvers av hele kundebasen for å redusere risikoen for tekniske problemer i lanseringsprosessen.