Manuální deployment v pátek v 17:00 — každý to zná, nikdo to nechce opakovat. Automatizovaná CI/CD pipeline eliminuje lidské chyby, zkracuje feedback loop a umožňuje nasazovat desítkykrát denně s důvěrou. Ukážeme si, jak ji postavit.
Anatomie moderní CI/CD pipeline¶
Pipeline není jen „build a deploy”. Kvalitní pipeline má jasně definované stages, kde každá fáze musí projít, než se spustí další:
- Commit stage — lint, unit testy, compile (< 5 min)
- Build stage — Docker image build, artifact packaging
- Security stage — SAST, dependency scanning, container scanning
- Test stage — integrační testy, API testy, e2e testy
- Staging deploy — automatický deployment na staging prostředí
- Production deploy — manuální approval + automated rollout
GitLab CI — pipeline as code¶
GitLab CI definuje pipeline v souboru .gitlab-ci.yml přímo v repozitáři. Výhoda: pipeline je verzovaná spolu s kódem.
stages:
- test
- build
- security
- deploy-staging
- deploy-prod
unit-tests:
stage: test
image: node:10-alpine
script:
- npm ci
- npm run lint
- npm run test:unit -- --coverage
artifacts:
reports:
junit: coverage/junit.xml
only:
- merge_requests
- master
build-image:
stage: build
image: docker:stable
services:
- docker:dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
only:
- master
dependency-scan:
stage: security
image: node:10-alpine
script:
- npm audit --audit-level=high
allow_failure: true
deploy-staging:
stage: deploy-staging
script:
- kubectl set image deployment/api api=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- kubectl rollout status deployment/api --timeout=120s
environment:
name: staging
only:
- master
deploy-production:
stage: deploy-prod
script:
- kubectl set image deployment/api api=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- kubectl rollout status deployment/api --timeout=300s
environment:
name: production
when: manual
only:
- master
Jenkins — flexibilní veterán¶
Jenkins je v enterprise prostředí stále dominantní. Jenkinsfile (deklarativní pipeline) přináší pipeline-as-code i do Jenkins světa:
pipeline {
agent { docker { image 'node:10-alpine' } }
stages {
stage('Test') {
steps {
sh 'npm ci'
sh 'npm run test:unit'
}
post {
always { junit 'coverage/junit.xml' }
}
}
stage('Build') {
steps {
sh "docker build -t api:${env.BUILD_NUMBER} ."
sh "docker push registry.company.com/api:${env.BUILD_NUMBER}"
}
}
stage('Deploy Staging') {
steps {
sh "kubectl set image deployment/api api=registry.company.com/api:${env.BUILD_NUMBER}"
}
}
stage('Deploy Production') {
input { message 'Deploy to production?' }
steps {
sh "kubectl set image deployment/api api=registry.company.com/api:${env.BUILD_NUMBER}"
}
}
}
}
GitLab CI vs Jenkins — co vybrat?¶
- GitLab CI: lepší developer experience, integrovaný s GitLab repozitářem, jednodušší konfigurace, shared runners zdarma. Ideální pro menší až střední týmy.
- Jenkins: flexibilnější, obrovský ekosystém pluginů (1500+), lepší pro komplexní enterprise pipeline s custom kroky. Vyžaduje správu Jenkins serveru.
- Trend 2018: GitLab CI rychle roste, Jenkins drží pozici díky legacy instalacím a enterprise adopci.
Security v pipeline — shift left¶
Bezpečnostní kontroly patří do pipeline, ne až na konec development cyklu:
- SAST (Static Application Security Testing) — SonarQube, Bandit (Python), ESLint security plugin
- Dependency scanning — npm audit, OWASP Dependency Check, Snyk
- Container scanning — Clair, Trivy pro skenování Docker images
- Secret detection — git-secrets, truffleHog pro odhalení commitnutých credentials
Důležité: security stage by neměla blokovat deployment na první den. Začněte s allow_failure: true a postupně zpřísňujte, až tým vyřeší existující findings.
Zero-downtime deployment¶
Kubernetes rolling update je základ, ale nestačí. Pro skutečný zero-downtime potřebujete:
- Readiness probes — Kubernetes posílá traffic až když je pod ready
- Graceful shutdown — aplikace dokončí running requests před zastavením
- Database migrations — backward-compatible migrace (expand-contract pattern)
- Feature flags — oddělte deployment od release (LaunchDarkly, unleash)
Metriky pipeline¶
Co neměříte, nezlepšíte. Sledujte:
- Lead time — čas od commitu po produkční deployment
- Deployment frequency — kolikrát denně/týdně nasazujete
- MTTR — mean time to recovery po failed deploymentu
- Change failure rate — procento deploymentů vyžadujících hotfix/rollback
Tyto čtyři metriky pocházejí z výzkumu DORA (DevOps Research and Assessment) a korelují s výkonností celé organizace.
Pipeline je investice, která se vrátí za týdny¶
Postavení kvalitní CI/CD pipeline trvá 2–5 dní. Návratnost přijde okamžitě — méně bugů v produkci, rychlejší feedback pro vývojáře, méně stresu při release. Začněte jednoduše (test + build + deploy) a iterujte. Dokonalá pipeline neexistuje, ale každá automatizovaná pipeline je lepší než žádná.