Hoppa till innehåll
DevOps & PlattformCI/CDDevOpsTestautomation6 min läsning

CI/CD-pipeline från scratch – steg för steg

Bygg en produktionsklar CI/CD-pipeline från grunden — testning, byggsteg, säkerhetsscanning och deploy till flera miljöer utan flaskhalsar

7 juli 2026Uppdaterad 11:00
2 75917
CI/CD-pipeline från scratch – steg för steg
CI/CD-pipeline från scratch – steg för stegPhoto: Unsplash

Steg-för-steg-guide till att bygga en CI/CD-pipeline från scratch 2026: pipelinestruktur, testautomation, container-byggen, säkerhetsscanning och deployment-strategier som fungerar för svenska team oavsett molnleverantör.

Vi blir ofta inkopplade när ett svenskt team har en pipeline som "typ fungerar" — den bygger, den testar, men den tar 25 minuter, misslyckas slumpmässigt en gång i veckan av oklar anledning, och ingen litar riktigt på den grönt tecken den ger. Att bygga en CI/CD-pipeline från scratch är inte svårt tekniskt sett — GitHub Actions, GitLab CI och Gitea Actions är alla mogna 2026 — men det kräver att man tänker igenom stegen i rätt ordning och sätter gränser för vad varje steg faktiskt ska ansvara för.

Den här guiden går igenom hur vi bygger pipelines från grunden: struktur och steg, testautomation, container-byggen med cache, säkerhetsscanning, och deploymentstrategier för flera miljöer.

Pipelinestruktur — vad ska köras var

En bra pipeline har tydligt separerade faser: lint och statisk analys (snabbast, kör alltid först och avbryt tidigt vid fel), enhetstester, bygg av artefakter (container-image eller paket), säkerhetsscanning, integrationstester mot en riktig miljö, och till sist deploy. Kör faser parallellt där det går — lint och enhetstester har normalt ingen beroenderelation och kan köras samtidigt, vilket kan halvera pipelinens totala körtid.

Ett vanligt misstag är att bygga en enda lång pipeline som gör allt sekventiellt för varje commit, inklusive tunga integrationstester mot en delad testmiljö. Separera istället "snabb feedback" (lint, enhetstester, bygg — under 5 minuter, körs på varje push) från "djup validering" (integrationstester, säkerhetsscan, prestandatester — kan ta 15-20 minuter, körs på pull request mot huvudgren eller nattligen). Det håller utvecklarloopen snabb utan att kompromissa med kvalitetskontrollen innan merge.

YAML
1# .github/workflows/ci.yml (förenklat)
2jobs:
3 lint:
4 runs-on: ubuntu-latest
5 steps:
6 - uses: actions/checkout@v4
7 - run: npm ci
8 - run: npm run lint
9
10 test:
11 needs: lint
12 runs-on: ubuntu-latest
13 steps:
14 - uses: actions/checkout@v4
15 - run: npm ci
16 - run: npm test -- --coverage

Testautomation — vilken nivå betalar sig

Testpyramiden är fortfarande relevant 2026, men vi ser många team som investerar fel — en handfull ytliga end-to-end-tester som är sköra och tar tio minuter att köra, men få eller inga enhetstester på affärslogiken. Riktvärdet vi rekommenderar: 70 procent enhetstester (snabba, isolerade, testar en funktion eller klass), 20 procent integrationstester (testar samspelet mellan komponenter, t.ex. API mot databas), och 10 procent end-to-end (testar hela flödet genom UI eller extern API, med Playwright eller Cypress).

Sätt en täckningsgräns som en kvalitetsgrind i pipelinen — men var försiktig med att jaga 100 procent täckning, det leder ofta till meningslösa tester som bara finns för att öka en siffra. 75-85 procent täckning på affärskritisk kod med fokus på faktisk risk är ett bättre mål än ett godtyckligt högt tal överallt. Kör flaky-testdetektion (upprepa misstänkta tester 3-5 gånger innan de får fälla pipelinen) — vi har sett team tappa förtroendet för hela CI-systemet på grund av ett enda instabilt test som ingen orkat fixa.

Container-byggen som inte tar 15 minuter

Om ni bygger container-images är byggtiden ofta den enskilt största tidstjuven i pipelinen. Multi-stage Dockerfiles minskar slutstorleken och separerar byggberoenden från runtime, men den stora vinsten kommer från lagercache. Använd BuildKit med registry-cache (--cache-from/--cache-to) så att oförändrade lager (typiskt npm ci eller pip install-steget) återanvänds mellan körningar istället för att byggas om varje gång.

Ordna Dockerfile-instruktioner så att det som ändras minst (beroendeinstallation) kommer före det som ändras mest (applikationskod). Vi har sett byggtider gå från 12 minuter till under 90 sekunder enbart genom rätt lagerordning och registry-cache. För monorepos, bygg bara det som faktiskt ändrats — verktyg som Nx, Turborepo eller egna path-filter i CI sparar enorm tid när bara en av tio tjänster i repot faktiskt behöver byggas om.

Docker
1# Dockerfile beroenden före kod för bättre cache
2FROM node:22-alpine AS deps
3WORKDIR /app
4COPY package.json package-lock.json ./
5RUN npm ci
6
7FROM node:22-alpine AS build
8WORKDIR /app
9COPY --from=deps /app/node_modules ./node_modules
10COPY . .
11RUN npm run build

Säkerhetsscanning — inte bara en grön bock

2026 förväntar sig de flesta kunder och revisorer att pipelinen innehåller automatiserad säkerhetsscanning, men vi ser fortfarande gott om "dekorativa grindar" — Trivy eller Snyk körs, men pipelinen är konfigurerad att aldrig faktiskt fälla bygget oavsett resultat. Konfigurera scanning i minst tre lager: SAST på källkoden (Semgrep, CodeQL), beroende-scanning (Dependabot, Snyk, eller npm audit i CI), och image-scanning på den färdiga container-imagen (Trivy eller Grype).

Sätt en tydlig policy för vad som faktiskt fäller bygget — kritiska och höga sårbarheter med tillgänglig fix bör blockera merge till huvudgren, medan lägre allvarlighetsgrad kan flaggas utan att stoppa flödet. Granska regelbundet att grinden faktiskt fungerar genom att medvetet introducera en känd sårbarhet i en testgren och verifiera att pipelinen fäller den. Läs mer om hur vi jobbar med säkerhet i CI/CD under cybersäkerhet.

Deployment-strategier för flera miljöer

Sista steget är att faktiskt leverera koden säkert. Rolling deploy är standard och räcker för de flesta interna verktyg, men för kundvända tjänster med krav på hög tillgänglighet rekommenderar vi blue-green eller canary-deploy. Canary-deploy — där en ny version rullas ut till en liten andel trafik (5-10 procent) innan full utrullning — ger er tidig varning om en regression innan alla användare drabbas, kombinerat med automatiska metrics-baserade rollback-triggers.

Koppla ihop deploy med observability: om felfrekvensen eller svarstiden försämras signifikant efter en deploy ska pipelinen (eller en separat kontroller som Argo Rollouts) rulla tillbaka automatiskt utan mänsklig inblandning. Vi går igenom hur man sätter upp den kopplingen i vår artikel om observability i praktiken, och hur pipelinen kan trigga deploy till en Kubernetes-plattform byggd enligt vår guide om Terraform och Kubernetes.

Vår rekommendation

Bygg pipelinen i den ordning vi beskrivit ovan — lint och test först för snabb feedback, sedan bygg, säkerhetsscan och deploy som separata, tydligt avgränsade steg. Mät pipelinens egen prestanda (byggtid, flaky-testfrekvens, tid till produktion) lika noggrant som ni mäter applikationens — en pipeline som tar 25 minuter och misslyckas slumpmässigt kostar er mer utvecklartid per år än de flesta funktionsprojekt. För team som bygger sin första pipeline från grunden rekommenderar vi att börja enkelt (lint, test, bygg, deploy till en miljö) och lägga till säkerhetsscanning och canary-deploy när grunden är stabil, snarare än att försöka bygga allt på en gång.

Vi hjälper svenska team bygga och modernisera CI/CD-pipelines, från grundstruktur till avancerad deploymentstrategi — läs mer om våra tjänster eller boka ett samtal.

En pipeline som tar 25 minuter och misslyckas slumpmässigt kostar er mer utvecklartid per år än de flesta funktionsprojekt.

- Simon Axelsson

Vanliga frågor

Hur lång bör en CI/CD-pipeline vara för att inte störa utvecklarflödet?
Sikta på under 5 minuter för snabb feedback (lint, enhetstester, bygg) på varje push. Tyngre steg som integrationstester och säkerhetsscanning kan ta 15-20 minuter men bör köras på pull request mot huvudgren eller nattligen, inte blockera varje enskild commit.
Vilken testfördelning rekommenderar ni i pipelinen?
En riktlinje på 70 procent enhetstester, 20 procent integrationstester och 10 procent end-to-end-tester ger bra balans mellan hastighet och verklig täckning. Undvik att jaga 100 procent kodtäckning — 75-85 procent på affärskritisk kod med fokus på faktisk risk är ett rimligare mål.
Hur snabbar vi upp container-byggen i CI?
Använd multi-stage Dockerfiles med beroendeinstallation före applikationskod, och aktivera BuildKit registry-cache med --cache-from/--cache-to. För monorepos, bygg bara de tjänster som faktiskt ändrats med path-filter eller verktyg som Nx eller Turborepo.
Vad är skillnaden mellan rolling, blue-green och canary-deploy?
Rolling deploy byter ut instanser gradvis och räcker för de flesta interna verktyg. Blue-green kör två fullständiga miljöer och växlar trafik direkt, vilket ger snabb rollback. Canary rullar ut till en liten andel trafik först (5-10 procent) och ger tidig varning om en regression innan alla användare påverkas — vi rekommenderar det för kundvända tjänster med höga tillgänglighetskrav.
Hur vet vi att vår säkerhetsscanning i pipelinen faktiskt fungerar?
Testa grinden aktivt genom att medvetet introducera en känd sårbarhet i en testgren och verifiera att bygget faktiskt fälls. Vi har sett gott om pipelines där scanning körs men aldrig kan blockera merge oavsett resultat — en granskning av den faktiska policyn (inte bara att steget finns) är avgörande.

Om författaren

SIAX Technology
SIAX TechnologyTeknikteamet

SIAX Technologys teknikteam skriver guiderna utifrån verkliga leveranser inom molninfrastruktur, dataplattformar och AI-automation åt nordiska företag.

Fler artiklar av SIAX