CI/CD
CI/CD (ang. Continuous Integration / Continuous Delivery lub Continuous Deployment) to zestaw praktyk i narzędzi umożliwiających automatyzację etapów budowy, testowania oraz wdrażania oprogramowania. Dzięki CI/CD możliwe jest szybkie i bezpieczne wprowadzanie zmian w kodzie źródłowym, co przyspiesza dostarczanie wartości użytkownikom końcowym.
Historia
Pierwsze koncepcje ciągłej integracji pojawiły się na przełomie 2000 i 2005 roku w środowiskach Agile oraz Extreme Programming. Termin „Continuous Delivery” został spopularyzowany przez D. Humble i M. Farley w książce Continuous Delivery (2010). Rozwój konteneryzacji (Docker) i orkiestracji (Kubernetes) przyczynił się do powstania praktyki Continuous Deployment pod koniec 2010 roku.
Składowe CI/CD
- Ciągła integracja (CI) – zestaw praktyk polegających na regularnym łączeniu (merge) zmian w repozytorium kodu, po którym automatycznie uruchamiane są testy jednostkowe i integracyjne. Najczęściej wykorzystywane systemy to Jenkins, GitLab CI oraz GitHub Actions.
- Ciągłe dostarczanie (CD – Delivery) – automatyzacja procesów budowy artefaktów, ich testowania w środowiskach testowych oraz przygotowanie do wdrożenia w środowisku produkcyjnym.
- Ciągłe wdrażanie (CD – Deployment) – pełna automatyzacja publikacji artefaktu w środowisku produkcyjnym po przejściu wszystkich testów i zatwierdzeń.
Korzyści
Wdrożenie CI/CD przynosi wiele korzyści, w tym:
- Skrócenie czasu pomiędzy napisaniem kodu a jego wdrożeniem (time‑to‑market).
- Wczesne wykrywanie błędów dzięki automatycznym testom.
- Zwiększenie stabilności i jakości oprogramowania.
- Umożliwienie zespołom DevOps szybkiego reagowania na zmiany rynkowe.
- Lepsza przejrzystość procesu dzięki raportom i dashboardom.
Typowy przepływ pracy
- Programista wprowadza zmiany w kodzie i commituje je do branży w systemie kontroli wersji (Git).
- Serwer CI wykrywa nowy commit i uruchamia pipeline – ciąg zadań obejmujących kompilację, testy jednostkowe i statyczną analizę kodu.
- Po pomyślnym zakończeniu testów powstaje artefakt (np. obraz Docker).
- Artefakt jest wdrażany do środowiska staging, gdzie przeprowadzane są testy integracyjne i akceptacyjne.
- Po zatwierdzeniu zmiany mogą zostać automatycznie wypuszczone do produkcji (Continuous Deployment) lub oczekują na ręczną akceptację (Continuous Delivery).
Narzędzia
Poniżej przedstawiono wybrane narzędzia wykorzystywane w praktyce CI/CD:
| Narzędzie | Typ | Opis |
|---|---|---|
| Jenkins | Serwer CI | Open‑source’owy serwer automatyzacji, obsługuje liczne pluginy. |
| GitLab CI | Serwer CI/CD | Zintegrowany z platformą GitLab, wspiera definicje pipeline w pliku .gitlab-ci.yml. |
| GitHub Actions | Serwer CI/CD | Rozwiązanie wbudowane w GitHub, pozwala na definiowanie workflow w pliku .github/workflows. |
| Azure Pipelines | Serwer CI/CD | Platforma chmurowa od Microsoft, umożliwia budowę i wdrożenia aplikacji na wiele środowisk. |
| CircleCI | Serwer CI | Usługa SaaS, koncentruje się na szybkim wykonywaniu testów i budowie kontenerów. |
Najlepsze praktyki
- Małe, częste zmiany – częste commity ograniczają ryzyko konfliktów.
- Automatyczne testy – każdy commit powinien przejść zestaw testów jednostkowych, integracyjnych oraz statycznej analizy kodu.
- Izolowane środowiska – korzystanie z kontenerów (Docker) lub maszyn wirtualnych zapewnia powtarzalność środowisk testowych.
- Wersjonowanie artefaktów – każdy zbudowany artefakt powinien mieć unikalny numer wersji (np. SemVer).
- Monitorowanie i rollback – po wdrożeniu monitoruj aplikację i przygotuj mechanizmy szybkiego wycofania zmian.
Związek z DevOps i Agile
CI/CD jest kluczowym elementem kultury DevOps, ponieważ łączy procesy rozwoju (development) i operacji (operations) w jednolitą, zautomatyzowaną ścieżkę dostarczania oprogramowania. W środowiskach Agile umożliwia spełnianie założeń krótkich iteracji i szybkiego reagowania na zmieniające się wymagania.
Przykładowy plik konfiguracyjny (GitLab CI)
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- docker build -t myapp:${CI_COMMIT_SHA} .
artifacts:
paths:
- myapp-image.tar
test_job:
stage: test
script:
- docker run --rm myapp:${CI_COMMIT_SHA} npm test
deploy_job:
stage: deploy
script:
- docker push myapp:${CI_COMMIT_SHA}
- kubectl set image deployment/myapp myapp=myregistry/myapp:${CI_COMMIT_SHA}
only:
- main
Podsumowanie
CI/CD stanowi fundament nowoczesnego tworzenia oprogramowania, pozwalając zespołom na szybkie, powtarzalne i bezpieczne dostarczanie wartości. Dzięki automatyzacji kluczowych etapów – od integracji kodu po jego wdrożenie – organizacje zwiększają efektywność, skracają cykle rozwojowe i podnoszą jakość produktów cyfrowych.