CI/CD (Continuous Integration / Continuous Delivery) on joukko käytäntöjä, jotka mahdollistavat ohjelmiston nopean ja luotettavan toimittamisen. CI/CD liittyy läheisesti toteutusvaiheessa mainittuun jatkuvaan integraatioon ja on keskeinen osa DevOps-kulttuuria.
CI/CD-putki (pipeline) automatisoi ohjelmiston rakentamisen, testaamisen ja käyttöönoton, mikä vähentää manuaalista työtä ja inhimillisten virheiden riskiä.
Jatkuva integraatio (Continuous Integration, CI)
Jatkuva integraatio on käytäntö, jossa kehittäjät yhdistävät koodimuutoksensa yhteiseen repositorioon usein, jopa useita kertoja päivässä. Jokainen yhdistäminen (commit/push) käynnistää automaattisen prosessin.
CI:n prosessi
- Koodin yhdistäminen - Kehittäjä pushaa muutokset Git-repositorioon
- Laukaiseminen - CI-palvelin havaitsee muutoksen ja käynnistää CI-putken
- Koodin haku - CI-palvelin hakee uusimman koodin repositoriosta
- Riippuvuuksien asennus - Asennetaan tarvittavat kirjastot ja riippuvuudet
- Kääntäminen - Koodi käännetään (jos kieli vaatii kääntämistä)
- Testien ajo - Suoritetaan yksikkötestit, integraatiotestit
- Koodin laadun tarkistus - Linter, koodin analyysi, kattavuus
- Palaute - Tiimi saa välittömän palautteen (sähköposti, Slack, jne.)
CI:n hyödyt
- Integraatio-ongelmat havaitaan välittömästi
- Virheet korjataan nopeasti, kun ne ovat vielä pieniä
- Koodi pysyy aina toimivassa tilassa
- Tiimi saa jatkuvaa palautetta
- Vähentää "toimii minun koneellani" -ongelmia
- Dokumentoi rakentamisprosessin
Tyypilliset CI-testit
- Yksikkötestit - Testaavat yksittäisiä funktioita/metodeja
- Integraatiotestit - Testaavat komponenttien yhteistoimintaa
- Staattinen analyysi - Koodin laadun ja turvallisuuden tarkistus
- Testikattavuus - Mittaa kuinka suuri osa koodista on testattu
Jatkuva toimitus (Continuous Delivery, CD)
Jatkuva toimitus laajentaa CI:tä niin, että ohjelmisto on aina valmiina julkaistavaksi tuotantoon. Jokainen muutos, joka läpäisee CI-vaiheen, viedään automaattisesti testausympäristöön ja on valmis käyttöönottoon tuotannossa.
CD:n prosessi
CI-vaiheen jälkeen:
- Artefaktin luonti - Luodaan käyttöönottopaketti (Docker-image, WAR, JAR, zip, jne.)
- Käyttöönotto testiympäristöön - Automaattinen käyttöönotto staging-ympäristöön
- Automaattiset testit - E2E-testit, käytettävyystestit, suorituskykytestit
- Manuaalinen hyväksyntä (valinnainen) - Ihminen päättää viedäänkö tuotantoon
- Käyttöönotto tuotantoon - Ohjelmisto viedään tuotantoympäristöön
Continuous Delivery vs. Continuous Deployment
- Continuous Delivery - Ohjelmisto on aina valmis julkaistavaksi, mutta tuotantoon vienti vaatii manuaalisen hyväksynnän
- Continuous Deployment - Jokainen muutos viedään automaattisesti tuotantoon ilman manuaalista hyväksyntää (jos testit läpäistään)
CI/CD-putki
CI/CD-putki on automatisoitu prosessi, joka vie koodin kehittäjän koneelta tuotantoon:
Koodi → Rakennus → Testaus → Staging → E2E-testit → Tuotanto → Seuranta
Putken vaiheet
- 1. Lähdekoodin hallinta (Source Control)
- Kaikki alkaa versionhallinnasta (Git). Kehittäjät tekevät muutoksia omissa haaroissaan ja yhdistävät ne pääkoodiin.
- 2. Rakentaminen (Build)
- CI-palvelin rakentaa ohjelmiston: riippuvuuksien lataus, koodin kääntäminen, resurssien pakkaaminen ja julkaisupaketin luonti.
- 3. Testaus (Test)
- Automaattiset testit: yksikkötestit, integraatiotestit, staattinen analyysi ja turvallisuusskannaus.
- 4. Käyttöönotto testiympäristöön (Staging)
- Ohjelmisto viedään staging-ympäristöön, joka muistuttaa tuotantoympäristöä.
- 5. Integraatiotestit ja E2E-testit
- Staging-ympäristössä ajetaan end-to-end-, suorituskyky- ja käytettävyystestit sekä valinnaiset manuaaliset testit.
- 6. Käyttöönotto tuotantoon (Production)
- Jos kaikki testit läpäistään, ohjelmisto viedään tuotantoympäristöön.
- 7. Seuranta (Monitoring)
- Tuotannossa olevaa ohjelmistoa seurataan jatkuvasti: virheet, suorituskyky, käyttäjäkokemus ja liiketoimintametriikat.
CI/CD-työkalut
CI/CD-putkien toteuttamiseen on saatavilla lukuisia työkaluja:
CI/CD-palvelimet
- Jenkins - Avoimen lähdekoodin, laajimmin käytetty CI/CD-työkalu
- GitLab CI/CD - Integroitu GitLabiin, YAML-konfiguraatio
- GitHub Actions - GitHubin CI/CD-ratkaisu
- CircleCI - Pilvipohjainen CI/CD
- Travis CI - Suosittu avoimen lähdekoodin projekteille
- Azure DevOps - Microsoftin kattava DevOps-alusta
- TeamCity - JetBrainsin CI/CD-työkalu
- Bamboo - Atlassianin CI/CD-työkalu
Kontittaminen
- Docker - Sovellusten paketointi kontteihin
- Kubernetes - Konttien orkestrointi ja hallinta
Ohjelmistopakettien hallinta
- Nexus - Ohjelmistopakettien säilytys
- Artifactory - JFrogin ohjelmistopakettien hallinta
- Docker Hub / Registry - Docker-kuvien tallennuspaikka
CI/CD-konfiguraatio esimerkkejä
GitHub Actions esimerkki
GitHub Actions käyttää YAML-tiedostoa (.github/workflows/ci.yml):
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build
run: npm run build
Parhaat käytännöt
- Pidä putki nopeana - CI-putken pitäisi valmistua alle 10 minuutissa
- Testaa aikaisin ja usein - Mitä aiemmin virhe havaitaan, sitä halvempi se on korjata
- Käytä välimuistia - Välimuistita riippuvuudet nopeuttaaksesi rakentamista
- Rinnakkaista - Aja testit rinnakkain nopeuttaaksesi prosessia
- Epäonnistuminen = lopetus - Jos jokin vaihe epäonnistuu, lopeta putki
- Konfiguraatio koodina - CI/CD-konfiguraatio versionhallinnassa
- Identtiset ympäristöt - Kehitys-, testi- ja tuotantoympäristöt mahdollisimman samanlaiset
- Automaattinen palautus - Jos käyttöönotto epäonnistuu, palaudu automaattisesti edelliseen versioon
- Kattava seuranta - Seuraa putken suorituskykyä ja onnistumisprosenttia
CI/CD:n haasteet
- Alkuinvestointi - CI/CD-putken rakentaminen vie aikaa
- Ylläpito - Putki vaatii jatkuvaa ylläpitoa ja päivityksiä
- Testien laatu - Huonot testit johtavat turhiin epäonnistumisiin tai päästävät virheet läpi
- Hitaus - Hidas putki hidastaa kehitystä
- Monimutkaisuus - Monimutkainen putki on vaikea ymmärtää ja debugata
- Turvallisuus - Salaisuuksien (credentials) turvallinen hallinta