diff --git a/materiały na PPB (wykład)/.ipynb_checkpoints/06_prototypowanie i ciągła integracja-checkpoint.ipynb b/materiały na PPB (wykład)/.ipynb_checkpoints/06_prototypowanie i ciągła integracja-checkpoint.ipynb
index 240d1ad..0c2b68f 100644
--- a/materiały na PPB (wykład)/.ipynb_checkpoints/06_prototypowanie i ciągła integracja-checkpoint.ipynb
+++ b/materiały na PPB (wykład)/.ipynb_checkpoints/06_prototypowanie i ciągła integracja-checkpoint.ipynb
@@ -40,13 +40,170 @@
"* Wykrycie nieporozumień między klientem i wykonawcą \n",
"* Określenie brakujących funkcji \n",
"* Wykrycie błędów w specyfikacji\n",
- "* Przewidywanie przyszłych trudności\n",
- "\n",
+ "* Przewidywanie przyszłych trudności "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
"## Prototyp poziomy a pionowy\n",
+ "### Prototyp poziomy (Horizontal Prototype)\n",
"\n",
- "## Prototypowanie z porzuceniem a prototypowanie ewolucyjne\n",
- " \n",
- " "
+ "**Prototyp poziomy** obrazuje całość systemu, podkreślając interakcję z użytkownikiem, a nie wnikając w funkcjonalności.\n",
+ "\n",
+ "Przykłady prototypów poziomych w informatyce:\n",
+ " * Prototyp papierowy\n",
+ " * Makieta statyczna\n",
+ " * Makieta dynamiczna\n",
+ " * Graficzny interfejs użytkownika"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ " \n",
+ "
Prototyp papierowy
\n",
+ " \n",
+ "
Prototyp papierowy to sposób reprezentacji produktu cyfrowego za pomocą wycinanek z papieru. \n",
+ " \n",
+ "* Służy do zrozumienia koncepcji produktu cyfrowego przez użytkownika. \n",
+ "* Dla autora koncepcji prototyp taki służy do prześledzenia reakcji użytkowników na przyszłe działanie systemu przed jego realizacją.\n",
+ "\n",
+ "
Prototypowanie papierowe - etapy :\n",
+ "\n",
+ "
\n",
+ "- Naszkicowanie wstępnej koncepcji ekranów z wyróżnieniem głównych funkcjonalności.
\n",
+ "- Symulowanie interakcji poprzez podmienianie papierowych ekranów i wyciętych elementów.
\n",
+ "
\n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ " \n",
+ "
Makieta statyczna
\n",
+ " \n",
+ " \n",
+ "
Makieta statyczna to cyfrowy projekt aplikacji, który zawiera pewne elementy docelowej konstrukcji, ale nie jest funkcjonalny. \n",
+ "\n",
+ "
\n",
+ " - Obrazuje wybrane widoki bez połączeń między nimi.
\n",
+ "
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ " \n",
+ "
Makieta dynamiczna
\n",
+ " \n",
+ " \n",
+ "
Makieta dynamiczna to cyfrowy projekt aplikacji, który zawiera pewne elementy docelowej konstrukcji i wskazuje interakcje z użytkownikiem. \n",
+ "\n",
+ "
\n",
+ "- Widoki są \"klikalne\" - po kliknięciu użytkowniki kierowany jest do nowego widoku.
\n",
+ "
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ " \n",
+ "
Graficzny interfejs użytkownika (GUI)
\n",
+ "\n",
+ "
Graficzny interfejs użytkownika to sposób komunikacji użytkownika z komputerem za pomocą elementów graficznych.\n",
+ " \n",
+ "Prototypem poziomym nazwiemy GUI, który: \n",
+ "
\n",
+ "- Pokazuje menu.
\n",
+ "- Pozwala na nawigację.
\n",
+ "- Akceptuje input.
\n",
+ "- Wyświetla losowy output.
\n",
+ "- NIE wspiera logiki aplikacji.
\n",
+ "
\n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Prototyp pionowy (Vertical Prototype)\n",
+ "**Prototyp pionowy** to pełna realizacja kluczowej (kluczowych) funkcji systemu.\n",
+ "\n",
+ "Cele prototypowania pionowego:\n",
+ "* sprawdzenie wyboru technologii\n",
+ "* pomiary wydajności\n",
+ "* sprawdzenie poprawności algorytmów i struktur danych\n",
+ "\n",
+ "Realizacja prototypów pionowych jest polecana w sytuacji, gdy wykonanie kluczowych funkcji systemu obarczone jest wysokim ryzykiem."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Prototypowanie z porzuceniem a prototypowanie ewolucyjne"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Prototypowanie z porzuceniem (Thow-away Prototyping)\n",
+ "\n",
+ "W **prototypowaniu z porzuceniem** budowane są kolejne wersje prototypów, a niektóre z nich są porzucane.\n",
+ "\n",
+ "Cele prototypowania z porzuceniem:\n",
+ "* minimalizacja ryzyka,\n",
+ "* głębokie zrozumienie problemów technicznych\n",
+ "\n",
+ "Koszty:\n",
+ " * Koszty prototypowania z porzuceniem są wysokie."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Prototypowanie ewolucyjne (Ewolutionary Prototyping)\n",
+ "\n",
+ "**Prototypowanie ewolucyjne** polega na stopniowym rozszerzaniu prototypu, aż spełnia on wszystkie wymagania... \n",
+ "\n",
+ "...Wtedy prototyp staje się produktem.\n",
+ "\n",
+ "Prototyp ewolucyjny powinien być budowany:\n",
+ " * w środowisku zbliżonym do produkcyjnego, \n",
+ " * z dużą dbałością o jakość."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Prototypowanie - podsumowanie\n",
+ "\n",
+ "* Prototypy tworzy się w celu zminimalizowania ryzyka niepowodzenia produktu. \n",
+ "* W prototypach poziomych chodzi o zobrazowanie wszystkich funkcji. \n",
+ "* W prototypach pionowych chodzi o szczegóły techniczne.\n",
+ "* Prototypowanie z porzuceniem oywa się z reguły wszerz (prototypy poziome); \n",
+ " * jest bardziej kosztowne, ale minimalizuje ryzyko.\n",
+ "* Prototypowanie ewolucyjne odbywa się z reguły w głąb (prototypy pionowe); \n",
+ " * jest mniej kosztowne, ale bardziej ryzykowne."
]
},
{
@@ -57,9 +214,9 @@
" \n",
"Ciągła integracja
\n",
" \n",
- "Ciągła integracja (CI) to praktyka rozwoju oprorgamowania, w której:\n",
+ "Ciągła integracja (CI) to praktyka rozwoju oprogramowania, w której:\n",
"\n",
- " - zmiany w kodzie są regularnie przesyłane do repozytorium,
\n",
+ " - zmiany w kodzie są regularnie przesyłane do centralnego repozytorium,
\n",
" - po każdym dołączeniu nowego kodu wykonywane są (automatycznie): kompilacja kodu i testy.
\n",
"
\n",
""
@@ -69,35 +226,209 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Workflow w Ciągłej Integracji"
+ "\n",
+ " \n",
+ "
Główne przesłanki CI
\n",
+ " \n",
+ "Ciągła integracja (CI) to praktyka rozwoju oprogramowania, w której:\n",
+ "
\n",
+ " - szybsze lokalizowanie błędów w kodzie,
\n",
+ " - ciągły wzrost jakości oporgramowania,
\n",
+ " - szybkie wydawanie nowych wersji.
\n",
+ "
\n",
+ "
\n",
+ "\n",
+ " \n",
+ "\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Dobre praktyki Ciągłej Integracji"
+ "## Przebieg pracy w Ciągłej Integracji\n",
+ "1. **Take Integrated Code**\n",
+ " * Pobieram kod z repozytorium.\n",
+ " * Instaluję kopię na swojej stacji roboczej. \n",
+ " \n",
+ "2. **Do Your Part**\n",
+ " * Opracowuję nowy kod.\n",
+ " * Opracowuję nowe testy jednostkowe.\n",
+ " \n",
+ "3. **Build on your machine**\n",
+ "\n",
+ "* **Repeat** \n",
+ " * Kompiluję swój kod i buduję wersję wykonywalną,\n",
+ " * Przeprowadzam testy jednostkowe,\n",
+ "* **Until**\n",
+ " * Kod się skompilował poprawnie oraz\n",
+ " * Testy zakończyły się powodzeniem.\n",
+ " \n",
+ "4. **Integrate with Repository**\n",
+ "\n",
+ " * Przesyłam kod do repozytorium centralnego, skąd przesyłany jest do kompilacji i testów.\n",
+ " * Przypadek 1. W międzyczasie ktoś dodał swój kod do repozytorium. Kompilacja lub testy się nie powodzą.\n",
+ " * **Go back to: Take Integrated Code**\n",
+ " * Przypadek 2. Tetsy się powodzą\n",
+ " * **Continue**\n",
+ " \n",
+ "5. **End Session**\n",
+ " * Gdy powiodły się wszystkie testy, mogę zakończyć sesję."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Kompilacja automatyczna"
+ "## Dobre praktyki Ciągłej Integracji\n",
+ "(wg https://www.martinfowler.com/articles/continuousIntegration.html)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Narzędzia Ciągłej Integracji"
+ "### Maintain a Single Source Repository\n",
+ " * Załóż mainline (linię główną): \n",
+ " * Deweloperzy powinni większość pracy składać na mainline.\n",
+ " * Nie nadużywaj odgalęzień (branchów). Jeśli już, to tylko w celu:\n",
+ " * naprawy błędów,\n",
+ " * tymczasowych eksperymentów,\n",
+ " * oznaczania wersji publikowalnych.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Korzyści z Ciągłej Integracji"
+ "### Automate the Build\n",
+ " * Wersja wykonywalna powinna być tworzona jednym poleceniem.\n",
+ " * Dotyczy to zarówno repozytorium centralnego, jak i maszyn lokalnych."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Test Yourself\n",
+ " * Pisz testy jednostkowe.\n",
+ " * Uruchamiaj testy po każdej kompilacji."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Everyone Commits Everyday\n",
+ " * Każdy powinien \"codziennie\" wypychać swój kod do linii głównej.\n",
+ " * Umożliwia to wczesne wykrywanie konfliktów, gdyż...\n",
+ " * Im wcześniej wykryje się konflikt, tym łatwiej go naprawić.\n",
+ " * Postulat wymaga rozbicia projektu na małe kawałki."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Every Commit Should Build the Mainline\n",
+ " * Nie odchodzisz od pracy z repozytorium, aż Twój kod nie przeszedł pełnych testów.\n",
+ " * Korzystaj z systemów ciągłej integracji (Cruise Control, Jenkins)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Fix the Broken Builds Immediately\n",
+ "Co zrobić, jeśli jednak kod na \"mainline\" się nie buduje? \n",
+ "Znalezienie i poprawienie blędu jest priorytetem, ale:\n",
+ " * Nie debugguj kodu na centralnym repozytorium. \n",
+ " * Przywróć wersję wykonywalną na \"mainline\".\n",
+ " * Debugguj kod na maszynie lokalnej."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Make it Easy to Run the Latest Executable\n",
+ "* Każdy członek zespołu (nie tylko deweloper) powinien mieć możliwość łatwego uruchomienia ostatniej wersji stabilnej.\n",
+ "* Jest to niezbędne do:\n",
+ " * testowania integracyjnego (tester),\n",
+ " * rozmów z klientem (zarząd lub sprzedawca),\n",
+ " * prowadzenia projektu (kierownik zespołu).\n",
+ "* W specjalnej lokalizacji przetrzymuj wersje stabilne - \"do pokazania\"."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Keep the Build Fast\n",
+ "\n",
+ " * Maximum 10 minut na build + testy.\n",
+ " * A jeśli testy trwają dłużej?\n",
+ " * Testy dwuetapowe:\n",
+ " * kompilacja + testy jednostkowe przy każdym commicie,\n",
+ " * testy integracyjne co pewien czas (np. po commicie wszystkich deweloperów)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Clone the Environment\n",
+ " * Przygotuj klon środowiska produkcyjnego:\n",
+ " * ta sama wersja systemu operacyjnego\n",
+ " * ta sama baza danych\n",
+ " * te same biblioteki (nawet jak ich nie potrzebujesz) \n",
+ " * Wszystkie testy przeprowadzaj na przygotowanym środowisku."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Everyone Can See What's Happening\n",
+ "System powinien informować użytkowników o swoim statusie."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Automate Deployment\n",
+ " * Zautomatyzowanie wdrożenia polega na napisaniu skryptów, które instalują system w docelowym środowisku.\n",
+ " * Pozwala to na szybką reakcję, gdy \"coś się dzieje\". "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Narzędzia Ciągłej Integracji\n",
+ "\n",
+ "https://www.katalon.com/resources-center/blog/ci-cd-tools/\n",
+ "\n",
+ "1. Jenkins\n",
+ "2. Circle CI\n",
+ "3. Team City\n",
+ "4. Bamboo\n",
+ "5. GitLab"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Korzyści z Ciągłej Integracji\n",
+ " * Minimalizacja ryzyka\n",
+ " * Łatwiejsze szacowanie terminu zakończenia prac\n",
+ " * Szybsza lokalizacja i naprawa błędów\n",
+ " * Świadomość stanu prac u całego zespołu\n",
+ " * Możliwość kontynuowania prac w przypadku odejścia dewelopera\n",
+ " * Możliwość pracy w środowisku rozproszonym\n",
+ " * Możliwość usunięcia bariery między wykonawcą i klientem"
]
}
],
diff --git a/materiały na PPB (wykład)/02_projekt_badawczo-rozwojowy.ipynb b/materiały na PPB (wykład)/02_projekt_badawczo-rozwojowy.ipynb
index bca0132..377e9c2 100644
--- a/materiały na PPB (wykład)/02_projekt_badawczo-rozwojowy.ipynb
+++ b/materiały na PPB (wykład)/02_projekt_badawczo-rozwojowy.ipynb
@@ -300,7 +300,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.7.6"
+ "version": "3.8.5"
},
"subtitle": "02. Projekt badawczo-rozwojowy[wykład]",
"title": "Przygotowanie do projektu badawczo-rozwojowego",
diff --git a/materiały na PPB (wykład)/06_prototypowanie i ciągła integracja.ipynb b/materiały na PPB (wykład)/06_prototypowanie i ciągła integracja.ipynb
index 240d1ad..0c2b68f 100644
--- a/materiały na PPB (wykład)/06_prototypowanie i ciągła integracja.ipynb
+++ b/materiały na PPB (wykład)/06_prototypowanie i ciągła integracja.ipynb
@@ -40,13 +40,170 @@
"* Wykrycie nieporozumień między klientem i wykonawcą \n",
"* Określenie brakujących funkcji \n",
"* Wykrycie błędów w specyfikacji\n",
- "* Przewidywanie przyszłych trudności\n",
- "\n",
+ "* Przewidywanie przyszłych trudności "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
"## Prototyp poziomy a pionowy\n",
+ "### Prototyp poziomy (Horizontal Prototype)\n",
"\n",
- "## Prototypowanie z porzuceniem a prototypowanie ewolucyjne\n",
- " \n",
- " "
+ "**Prototyp poziomy** obrazuje całość systemu, podkreślając interakcję z użytkownikiem, a nie wnikając w funkcjonalności.\n",
+ "\n",
+ "Przykłady prototypów poziomych w informatyce:\n",
+ " * Prototyp papierowy\n",
+ " * Makieta statyczna\n",
+ " * Makieta dynamiczna\n",
+ " * Graficzny interfejs użytkownika"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ " \n",
+ "
Prototyp papierowy
\n",
+ " \n",
+ "
Prototyp papierowy to sposób reprezentacji produktu cyfrowego za pomocą wycinanek z papieru. \n",
+ " \n",
+ "* Służy do zrozumienia koncepcji produktu cyfrowego przez użytkownika. \n",
+ "* Dla autora koncepcji prototyp taki służy do prześledzenia reakcji użytkowników na przyszłe działanie systemu przed jego realizacją.\n",
+ "\n",
+ "
Prototypowanie papierowe - etapy :\n",
+ "\n",
+ "
\n",
+ "- Naszkicowanie wstępnej koncepcji ekranów z wyróżnieniem głównych funkcjonalności.
\n",
+ "- Symulowanie interakcji poprzez podmienianie papierowych ekranów i wyciętych elementów.
\n",
+ "
\n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ " \n",
+ "
Makieta statyczna
\n",
+ " \n",
+ " \n",
+ "
Makieta statyczna to cyfrowy projekt aplikacji, który zawiera pewne elementy docelowej konstrukcji, ale nie jest funkcjonalny. \n",
+ "\n",
+ "
\n",
+ " - Obrazuje wybrane widoki bez połączeń między nimi.
\n",
+ "
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ " \n",
+ "
Makieta dynamiczna
\n",
+ " \n",
+ " \n",
+ "
Makieta dynamiczna to cyfrowy projekt aplikacji, który zawiera pewne elementy docelowej konstrukcji i wskazuje interakcje z użytkownikiem. \n",
+ "\n",
+ "
\n",
+ "- Widoki są \"klikalne\" - po kliknięciu użytkowniki kierowany jest do nowego widoku.
\n",
+ "
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ " \n",
+ "
Graficzny interfejs użytkownika (GUI)
\n",
+ "\n",
+ "
Graficzny interfejs użytkownika to sposób komunikacji użytkownika z komputerem za pomocą elementów graficznych.\n",
+ " \n",
+ "Prototypem poziomym nazwiemy GUI, który: \n",
+ "
\n",
+ "- Pokazuje menu.
\n",
+ "- Pozwala na nawigację.
\n",
+ "- Akceptuje input.
\n",
+ "- Wyświetla losowy output.
\n",
+ "- NIE wspiera logiki aplikacji.
\n",
+ "
\n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Prototyp pionowy (Vertical Prototype)\n",
+ "**Prototyp pionowy** to pełna realizacja kluczowej (kluczowych) funkcji systemu.\n",
+ "\n",
+ "Cele prototypowania pionowego:\n",
+ "* sprawdzenie wyboru technologii\n",
+ "* pomiary wydajności\n",
+ "* sprawdzenie poprawności algorytmów i struktur danych\n",
+ "\n",
+ "Realizacja prototypów pionowych jest polecana w sytuacji, gdy wykonanie kluczowych funkcji systemu obarczone jest wysokim ryzykiem."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Prototypowanie z porzuceniem a prototypowanie ewolucyjne"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Prototypowanie z porzuceniem (Thow-away Prototyping)\n",
+ "\n",
+ "W **prototypowaniu z porzuceniem** budowane są kolejne wersje prototypów, a niektóre z nich są porzucane.\n",
+ "\n",
+ "Cele prototypowania z porzuceniem:\n",
+ "* minimalizacja ryzyka,\n",
+ "* głębokie zrozumienie problemów technicznych\n",
+ "\n",
+ "Koszty:\n",
+ " * Koszty prototypowania z porzuceniem są wysokie."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Prototypowanie ewolucyjne (Ewolutionary Prototyping)\n",
+ "\n",
+ "**Prototypowanie ewolucyjne** polega na stopniowym rozszerzaniu prototypu, aż spełnia on wszystkie wymagania... \n",
+ "\n",
+ "...Wtedy prototyp staje się produktem.\n",
+ "\n",
+ "Prototyp ewolucyjny powinien być budowany:\n",
+ " * w środowisku zbliżonym do produkcyjnego, \n",
+ " * z dużą dbałością o jakość."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Prototypowanie - podsumowanie\n",
+ "\n",
+ "* Prototypy tworzy się w celu zminimalizowania ryzyka niepowodzenia produktu. \n",
+ "* W prototypach poziomych chodzi o zobrazowanie wszystkich funkcji. \n",
+ "* W prototypach pionowych chodzi o szczegóły techniczne.\n",
+ "* Prototypowanie z porzuceniem oywa się z reguły wszerz (prototypy poziome); \n",
+ " * jest bardziej kosztowne, ale minimalizuje ryzyko.\n",
+ "* Prototypowanie ewolucyjne odbywa się z reguły w głąb (prototypy pionowe); \n",
+ " * jest mniej kosztowne, ale bardziej ryzykowne."
]
},
{
@@ -57,9 +214,9 @@
" \n",
"Ciągła integracja
\n",
" \n",
- "Ciągła integracja (CI) to praktyka rozwoju oprorgamowania, w której:\n",
+ "Ciągła integracja (CI) to praktyka rozwoju oprogramowania, w której:\n",
"\n",
- " - zmiany w kodzie są regularnie przesyłane do repozytorium,
\n",
+ " - zmiany w kodzie są regularnie przesyłane do centralnego repozytorium,
\n",
" - po każdym dołączeniu nowego kodu wykonywane są (automatycznie): kompilacja kodu i testy.
\n",
"
\n",
""
@@ -69,35 +226,209 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Workflow w Ciągłej Integracji"
+ "\n",
+ " \n",
+ "
Główne przesłanki CI
\n",
+ " \n",
+ "Ciągła integracja (CI) to praktyka rozwoju oprogramowania, w której:\n",
+ "
\n",
+ " - szybsze lokalizowanie błędów w kodzie,
\n",
+ " - ciągły wzrost jakości oporgramowania,
\n",
+ " - szybkie wydawanie nowych wersji.
\n",
+ "
\n",
+ "
\n",
+ "\n",
+ " \n",
+ "\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Dobre praktyki Ciągłej Integracji"
+ "## Przebieg pracy w Ciągłej Integracji\n",
+ "1. **Take Integrated Code**\n",
+ " * Pobieram kod z repozytorium.\n",
+ " * Instaluję kopię na swojej stacji roboczej. \n",
+ " \n",
+ "2. **Do Your Part**\n",
+ " * Opracowuję nowy kod.\n",
+ " * Opracowuję nowe testy jednostkowe.\n",
+ " \n",
+ "3. **Build on your machine**\n",
+ "\n",
+ "* **Repeat** \n",
+ " * Kompiluję swój kod i buduję wersję wykonywalną,\n",
+ " * Przeprowadzam testy jednostkowe,\n",
+ "* **Until**\n",
+ " * Kod się skompilował poprawnie oraz\n",
+ " * Testy zakończyły się powodzeniem.\n",
+ " \n",
+ "4. **Integrate with Repository**\n",
+ "\n",
+ " * Przesyłam kod do repozytorium centralnego, skąd przesyłany jest do kompilacji i testów.\n",
+ " * Przypadek 1. W międzyczasie ktoś dodał swój kod do repozytorium. Kompilacja lub testy się nie powodzą.\n",
+ " * **Go back to: Take Integrated Code**\n",
+ " * Przypadek 2. Tetsy się powodzą\n",
+ " * **Continue**\n",
+ " \n",
+ "5. **End Session**\n",
+ " * Gdy powiodły się wszystkie testy, mogę zakończyć sesję."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Kompilacja automatyczna"
+ "## Dobre praktyki Ciągłej Integracji\n",
+ "(wg https://www.martinfowler.com/articles/continuousIntegration.html)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Narzędzia Ciągłej Integracji"
+ "### Maintain a Single Source Repository\n",
+ " * Załóż mainline (linię główną): \n",
+ " * Deweloperzy powinni większość pracy składać na mainline.\n",
+ " * Nie nadużywaj odgalęzień (branchów). Jeśli już, to tylko w celu:\n",
+ " * naprawy błędów,\n",
+ " * tymczasowych eksperymentów,\n",
+ " * oznaczania wersji publikowalnych.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Korzyści z Ciągłej Integracji"
+ "### Automate the Build\n",
+ " * Wersja wykonywalna powinna być tworzona jednym poleceniem.\n",
+ " * Dotyczy to zarówno repozytorium centralnego, jak i maszyn lokalnych."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Test Yourself\n",
+ " * Pisz testy jednostkowe.\n",
+ " * Uruchamiaj testy po każdej kompilacji."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Everyone Commits Everyday\n",
+ " * Każdy powinien \"codziennie\" wypychać swój kod do linii głównej.\n",
+ " * Umożliwia to wczesne wykrywanie konfliktów, gdyż...\n",
+ " * Im wcześniej wykryje się konflikt, tym łatwiej go naprawić.\n",
+ " * Postulat wymaga rozbicia projektu na małe kawałki."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Every Commit Should Build the Mainline\n",
+ " * Nie odchodzisz od pracy z repozytorium, aż Twój kod nie przeszedł pełnych testów.\n",
+ " * Korzystaj z systemów ciągłej integracji (Cruise Control, Jenkins)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Fix the Broken Builds Immediately\n",
+ "Co zrobić, jeśli jednak kod na \"mainline\" się nie buduje? \n",
+ "Znalezienie i poprawienie blędu jest priorytetem, ale:\n",
+ " * Nie debugguj kodu na centralnym repozytorium. \n",
+ " * Przywróć wersję wykonywalną na \"mainline\".\n",
+ " * Debugguj kod na maszynie lokalnej."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Make it Easy to Run the Latest Executable\n",
+ "* Każdy członek zespołu (nie tylko deweloper) powinien mieć możliwość łatwego uruchomienia ostatniej wersji stabilnej.\n",
+ "* Jest to niezbędne do:\n",
+ " * testowania integracyjnego (tester),\n",
+ " * rozmów z klientem (zarząd lub sprzedawca),\n",
+ " * prowadzenia projektu (kierownik zespołu).\n",
+ "* W specjalnej lokalizacji przetrzymuj wersje stabilne - \"do pokazania\"."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Keep the Build Fast\n",
+ "\n",
+ " * Maximum 10 minut na build + testy.\n",
+ " * A jeśli testy trwają dłużej?\n",
+ " * Testy dwuetapowe:\n",
+ " * kompilacja + testy jednostkowe przy każdym commicie,\n",
+ " * testy integracyjne co pewien czas (np. po commicie wszystkich deweloperów)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Clone the Environment\n",
+ " * Przygotuj klon środowiska produkcyjnego:\n",
+ " * ta sama wersja systemu operacyjnego\n",
+ " * ta sama baza danych\n",
+ " * te same biblioteki (nawet jak ich nie potrzebujesz) \n",
+ " * Wszystkie testy przeprowadzaj na przygotowanym środowisku."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Everyone Can See What's Happening\n",
+ "System powinien informować użytkowników o swoim statusie."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Automate Deployment\n",
+ " * Zautomatyzowanie wdrożenia polega na napisaniu skryptów, które instalują system w docelowym środowisku.\n",
+ " * Pozwala to na szybką reakcję, gdy \"coś się dzieje\". "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Narzędzia Ciągłej Integracji\n",
+ "\n",
+ "https://www.katalon.com/resources-center/blog/ci-cd-tools/\n",
+ "\n",
+ "1. Jenkins\n",
+ "2. Circle CI\n",
+ "3. Team City\n",
+ "4. Bamboo\n",
+ "5. GitLab"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Korzyści z Ciągłej Integracji\n",
+ " * Minimalizacja ryzyka\n",
+ " * Łatwiejsze szacowanie terminu zakończenia prac\n",
+ " * Szybsza lokalizacja i naprawa błędów\n",
+ " * Świadomość stanu prac u całego zespołu\n",
+ " * Możliwość kontynuowania prac w przypadku odejścia dewelopera\n",
+ " * Możliwość pracy w środowisku rozproszonym\n",
+ " * Możliwość usunięcia bariery między wykonawcą i klientem"
]
}
],