8.4 KiB
8.4 KiB
Systemy informatyczne analizy danych
3. Ciągła integracja i ciągła ewaluacja[wykład]
Filip Graliński, Krzysztof Jassem (2023)
Ciągła integracja
Ciągła integracja (CI) to praktyka rozwoju oprogramowania, w której:- zmiany w kodzie są regularnie przesyłane do centralnego repozytorium,
- po każdym dołączeniu nowego kodu wykonywane są (automatycznie): kompilacja kodu i testy.
Główne przesłanki CI
Ciągła integracja (CI) to praktyka rozwoju oprogramowania, w której:- szybsze lokalizowanie błędów w kodzie,
- ciągły wzrost jakości oporgramowania,
- szybkie wydawanie nowych wersji.
Przebieg pracy w Ciągłej Integracji
- Take Integrated Code
- Pobieram kod z repozytorium.
- Instaluję kopię na swojej stacji roboczej.
- Do Your Part
- Opracowuję nowy kod.
- Opracowuję nowe testy jednostkowe.
- Build on your machine
- Repeat
- Kompiluję swój kod i buduję wersję wykonywalną,
- Przeprowadzam testy jednostkowe,
- Until
- Kod się skompilował poprawnie oraz
- Testy zakończyły się powodzeniem.
- Integrate with Repository
- Przesyłam kod do repozytorium centralnego, skąd przesyłany jest do kompilacji i testów.
- Przypadek 1. W międzyczasie ktoś dodał swój kod do repozytorium. Kompilacja lub testy się nie powodzą.
- Go back to: Take Integrated Code
- Przypadek 2. Tetsy się powodzą
- Continue
- Przypadek 1. W międzyczasie ktoś dodał swój kod do repozytorium. Kompilacja lub testy się nie powodzą.
- End Session
- Gdy powiodły się wszystkie testy, mogę zakończyć sesję.
Dobre praktyki Ciągłej Integracji
(wg https://www.martinfowler.com/articles/continuousIntegration.html)
Maintain a Single Source Repository
- Załóż mainline (linię główną):
- Deweloperzy powinni większość pracy składać na mainline.
- Nie nadużywaj odgalęzień (branchów). Jeśli już, to tylko w celu:
- naprawy błędów,
- tymczasowych eksperymentów,
- oznaczania wersji publikowalnych.
Automate the Build
- Wersja wykonywalna powinna być tworzona jednym poleceniem.
- Dotyczy to zarówno repozytorium centralnego, jak i maszyn lokalnych.
Test Yourself
- Pisz testy jednostkowe.
- Uruchamiaj testy po każdej kompilacji.
Everyone Commits Everyday
- Każdy powinien "codziennie" wypychać swój kod do linii głównej.
- Umożliwia to wczesne wykrywanie konfliktów, gdyż...
- Im wcześniej wykryje się konflikt, tym łatwiej go naprawić.
- Postulat wymaga rozbicia projektu na małe kawałki.
Every Commit Should Build the Mainline
- Nie odchodzisz od pracy z repozytorium, aż Twój kod nie przeszedł pełnych testów.
- Korzystaj z systemów ciągłej integracji (Cruise Control, Jenkins).
Fix the Broken Builds Immediately
Co zrobić, jeśli jednak kod na "mainline" się nie buduje?
Znalezienie i poprawienie blędu jest priorytetem, ale:
- Nie debugguj kodu na centralnym repozytorium.
- Przywróć wersję wykonywalną na "mainline".
- Debugguj kod na maszynie lokalnej.
Make it Easy to Run the Latest Executable
- Każdy członek zespołu (nie tylko deweloper) powinien mieć możliwość łatwego uruchomienia ostatniej wersji stabilnej.
- Jest to niezbędne do:
- testowania integracyjnego (tester),
- rozmów z klientem (zarząd lub sprzedawca),
- prowadzenia projektu (kierownik zespołu).
- W specjalnej lokalizacji przetrzymuj wersje stabilne - "do pokazania".
Keep the Build Fast
- Maximum 10 minut na build + testy.
- A jeśli testy trwają dłużej?
- Testy dwuetapowe:
- kompilacja + testy jednostkowe przy każdym commicie,
- testy integracyjne co pewien czas (np. po commicie wszystkich deweloperów).
- Testy dwuetapowe:
Clone the Environment
- Przygotuj klon środowiska produkcyjnego:
- ta sama wersja systemu operacyjnego
- ta sama baza danych
- te same biblioteki (nawet jak ich nie potrzebujesz)
- Wszystkie testy przeprowadzaj na przygotowanym środowisku.
Everyone Can See What's Happening
System powinien informować użytkowników o swoim statusie.
Automate Deployment
- Zautomatyzowanie wdrożenia polega na napisaniu skryptów, które instalują system w docelowym środowisku.
- Pozwala to na szybką reakcję, gdy "coś się dzieje".
Narzędzia Ciągłej Integracji
https://www.katalon.com/resources-center/blog/ci-cd-tools/
- Jenkins
- Circle CI
- Team City
- Bamboo
- GitLab
Korzyści z Ciągłej Integracji
- Minimalizacja ryzyka
- Łatwiejsze szacowanie terminu zakończenia prac
- Szybsza lokalizacja i naprawa błędów
- Świadomość stanu prac u całego zespołu
- Możliwość kontynuowania prac w przypadku odejścia dewelopera
- Możliwość pracy w środowisku rozproszonym
- Możliwość usunięcia bariery między wykonawcą i klientem
Przykład - Jenkins
https://git.wmi.amu.edu.pl/filipg/paper-cutter/src/branch/master/Jenkinsfile