Kontinuerlig leveranse

**Kontinuerlig leveranse** (engelsk: *continuous delivery*, CD) er en tilnærming til programvareutvikling hvor man produserer programvare i korte sykluser slik at pålitelig programvare kan bli utgitt når som helst, og på en slik måte at man slipper å gjøre det manuelt når man bestemmer seg for at en utgivelse skal slippes. Det tar sikte på å bygge, teste og gi ut programvare med høyere hastighet og frekvens. Tilnærmingen bidrar til å redusere kostnader, tid og risiko ved å levere endringer gjennom å tillate flere inkrementelle oppdateringer av applikasjoner i produksjon. En enkel og repeterbar utrullingsprosess er viktig for kontinuerlig leveranse.

Kontinuerlig leveranse står i kontrast til kontinuerlig utrulling (også forkortet CD på engelsk) som er en lignende tilnærming hvor programvare også produseres i korte sykluser, men gjennom automatisert istedet for manuell utrulling.

## Forhold til DevOps
Kontinuerlig leveranse og DevOps har lignende betydninger og brukes ofte sammen, men er to forskjellige begreper.

DevOps favner bredere og fokuserer på kulturell forandring, særlig samarbeidet mellom de ulike lagene som er involvert i programvareleveransen (utviklere, drift, kvalitetssikring, ledelse, etc.), samt automatisering av prosessene i programvareleveranse.

Kontinuerlig leveranse er derimot en tilnærming til å automatisere leveranseaspektet, og fokuserer på å samle sammen ulike prosesser og utføre dem raskere og oftere. Dermed kan DevOps være et produkt av kontinuerlig leveranse, og kontinuerlig leveranse flyter direkte inn I DevOps.

## Forholdet til kontinuerlig utrulling
Kontinuerlig leveranse er evnen til å levere programvare som kan utrulles når som helst gjennom manuelle utrullinger, dette er i motsetning til kontinuerlig utrulling som bruker automatiserte utrullinger. Ifølge Martin Fowler er det en forutsetning for kontinuerlig utrulling at kontinuerlig leveranse ligger i bunn. I akademisk litteratur skilles det mellom de to tilnærmingene som manuell vs. automatisert utrullingsmetode.

## Prinsipper

En kommandokø for utrulling eller utrullingskø (*deployment [[pipeline]]*) en viktig komponent i kontinuerlig leveranse, og fungerer som en slags *poka-yoke* (metode som retter oppmerksomheten mot feil når de oppstår). Denne kanalen kan inneholde en mengde valideringer programvaren må bestå før den utgis. Koden blir kompilert dersom nødvendig, og pakkes deretter av en byggeserver hver gang en endring blir sendt inn (*committed*) til kildekodelageret (*source control repository*), hvorpå den blir testet ved hjelp av en rekke forskjellige teknikker (muligens inkludert manuell testing) før den kan merkes som utgivbar. 
 

Utviklere som er vant med lange utviklingssykluser må kanskje endre tankegangen når de arbeider i et CD-miljø. For eksempel er det viktig å være klar over at all kode som sendes inn til kodelageret kan frigis til kunder når som helst. Egenskaper som funksjonsbrytere (mulighet for å aktivere og deaktivere en funksjon) kan være nyttig for å sende inn kode som enda ikke er klar for bruk av sluttbrukere. Bruk av NoSQL kan eliminere steget med dataoverføringer og skjemaendringer, som ellers ofte er manuelle trinn og slik avviker fra en arbeidsflyt med kontinuerlig leveranse. Andre nyttige teknikker for å utvikle kode i isolasjon som kodeforgrening kan fortsatt brukes med CD-verden, men må tilpasses. For eksempel kan det vise seg upraktisk å ha flere langlivede kodeforgreninger ettersom en utgivbar artefakt må være bygd tidlig i CD-prosessen fra en enkelt kodeforgrening dersom den skal kunne komme gjennom alle stegene i utrullingskøen.

## Kommandokø for utrulling (''deployment pipeline'')
Kontinuerlig leveranse blir gjort mulig ved help av en utrullingskø. Noen fordeler med å kjøre dette gjennom en kommandokø er synlighet, tilbakemelding og kontinuerlig utrulling.

* **Synlighet** - Alle aspekter av leveransesystemet, inkludert bygging, utrulling, testing og utgivelse, er synlig for alle medlemmer av laget for å fremme samarbeid.
* **Tilbakemelding** - Teammedlemmer blir kjent med problemer så snart de oppstår slik at man kan fikse dem raskere.
* **Kontinuerlig utrulling** – Gjennom en helautomatisert prosess kan man distribuere og gi ut en hvilken som helst versjon av programvaren til ethvert programvaremiljø.

## Verktøy
Kontinuerlig leveranse automatiserer hele prosessen fra kildekontroll til produksjon, og det finnes ulike verktøy som for hele eller deler av denne prosessen. Disse verktøyene kan utgjøre en del av en utrullingkø som inkluderer kontinuerlig leveranse. Eksempler på typer av verktøy som kan utføre ulike deler av prosessen inkluderer: kontinuerlig integrasjon, automatisering av applikasjonsutgivelse, automatisert byggesystem og håndtering av applikasjonslivssyklus.

## Arkitektur for kontinuerlig leveranse
For at kontinuerlig leveranse skal utøves effektivt må programvaren tilfredsstille en mengde arkitekturmessigt viktige krav som utrullbarhet, modifiserbarhet og testbarhet. Disse arkitekturmessige kravene krever høy prioritet og kan ikke tas lett på.

Mikrotjenester brukes ofte når man designer en arkitektur for kontinuerlig leveranse. Bruk av mikrotjenester kan øke et programvaresystem sin utrullbarhet og modifiserbarhet. Observerte forbedringer av utrulling inkluderer: uavhengig utrulling, kortere utrullingstid, enklere utrullingsprosedyrer og null nedetid. Observerte forbedringer av modifiserbarhet inkluderer: kortere syklustid for små inkrementelle funksjonelle endringer, enklere endringer av teknologivalg, inkrementelle endringer av kvalitetsattributter, og enklere oppgraderinger av språk og biblioteker.

## Se også
* DevOps
* CI/CD
* Kontinuerlig integrasjon
* Utgivelseshåndtering
* Versjonskontroll

## Referanser


## Eksterne lenker
* Video: Skifte motor i fart - fra fossefall til kontinuerlig leveranse med 200 passasjerer (av *JavaZone* på *Vimeo.com*)