Ciągłe dostarczanie oprogramowania w języku Java. Najlepsze narzędzia i praktyki wdrażania kodu
SPIS TREŚCI
Słowa wstępne 13
Wstęp 17
1. Ciągłe dostarczanie? Dlaczego? Czym jest? 21
- Ogólny zarys 21
- Dlaczego? Bo daje możliwości programistom 22
- Szybka informacja zwrotna pozwala ograniczyć zmiany kontekstu 22
- Automatyczne, powtarzalne i niezawodne wydania 22
- Uściślenie definicji ukończenia 23
- Czym jest? Badamy typowy potok budowy 24
- Podstawowe etapy potoku budowy 24
- Wpływ technologii kontenerów 28
- Zmiany we współczesnych architekturach 29
- Podsumowanie 29
2. Ewolucja programowania w języku Java 31
- Wymagania współczesnych aplikacji Java 31
- Potrzeba szybkości i stabilności biznesowej 32
- Rozwój ekonomii interfejsów API 32
- Szanse i koszty chmury 33
- Przywrócenie modularności: wykorzystanie niewielkich usług 33
- Wpływ na ciągłe dostarczanie 34
- Ewolucja platform wdrożeniowych w języku Java 35
- Archiwa WAR i EAR: era dominacji serwerów aplikacji 35
- Wykonywalne pliki JAR z zależnościami: powstanie metodologii dwunastu aspektów 36
- Obrazy kontenerów: ulepszenie przenośności (i zwiększenie złożoności) 37
- Funkcja jako usługa: pojawienie się przetwarzania „bezserwerowego” 37
- Wpływ platform na ciągłe dostarczanie 38
- Metodyki DevOps, SRE oraz Release Engineering 39
- Rozwój i utrzymanie 39
- Site Reliability Engineering 40
- Inżynieria wydawnicza oprogramowania 42
- Współodpowiedzialność, metryki i wgląd 43
- Podsumowanie 44
3. Projektowanie architektury pod kątem ciągłego dostarczania 45
- Fundamenty dobrej architektury 45
- Luźne sprzężenie 45
- Wysoka spójność 47
- Sprzężenie, spójność i ciągłe dostarczanie 47
- Architektura nakierowana na elastyczność biznesową 49
- Zła architektura ogranicza dynamikę biznesową 49
- Złożoność i koszt zmian 50
- Najlepsze rozwiązania dla aplikacji zorientowanych na API 50
- Tworzenie interfejsów API metodą od zewnątrz do wewnątrz 51
- Dobre interfejsy API pomagają w ciągłym testowaniu i dostarczaniu 51
- Platformy wdrażania a architektura 52
- Projektowanie aplikacji natywnych dla chmury według metodologii 12 aspektów 52
- Doskonalenie wyczucia mechaniki 55
- Projektowanie i ciągłe testowanie pod kątem awarii 56
- Podążanie w kierunku niewielkich usług 57
- Wyzwania w dostarczaniu aplikacji monolitycznych 57
- Mikrousługi: architektura zorientowana na usługi spotyka się z projektowaniem dziedzinowym 58
- Funkcje, architektura Lambda i nanousługi 59
- Architektura: „wszystko to, co trudno zmienić” 60
- Podsumowanie 60
4. Platformy wdrożeniowe, infrastruktura i ciągłe dostarczanie aplikacji Java 63
- Funkcje zapewniane przez platformę 63
- Niezbędne procesy programistyczne 64
- Platformy oparte o tradycyjną infrastrukturę 65
- Komponenty tradycyjnej platformy 65
- Wyzwania platform opartych o tradycyjną infrastrukturę 66
- Korzyści z bycia tradycyjnym 66
- Ciągła integracja i dostarczanie na platformach opartych o tradycyjną infrastrukturę 67
- Platforma chmury (IaaS) 67
- Zaglądamy w chmurę 68
- Wyzwania chmury 69
- Korzyści z chmury 70
- Ciągłe dostarczanie w chmurze 71
- Platforma jako usługa 72
- Zaglądamy w usługę PaaS 72
- Wyzwania platformy PaaS 73
- Korzyści z platformy PaaS 75
- Ciągła integracja i dostarczanie a model PaaS 75
- Kontenery (Docker) 75
- Komponenty platformy kontenerów 76
- Wyzwania technologii kontenerów 76
- Korzyści z kontenerów 78
- Ciągłe dostarczanie kontenerów 78
- Kubernetes 78
- Podstawowe koncepcje platformy Kubernetes 79
- Wyzwania platformy Kubernetes 80
- Korzyści z platformy Kubernetes 81
- Ciągłe dostarczanie na platformie Kubernetes 81
- Funkcja jako usługa (funkcje bezserwerowe) 81
- Koncepcje platformy FaaS 82
- Wyzwania platformy FaaS 83
- Korzyści z platformy FaaS 84
- Ciągła integracja i dostarczanie a model FaaS 84
- Praca z infrastrukturą jako kodem 85
- Podsumowanie 86
5. Budowanie aplikacji w języku Java 87
- Podział procesu budowania 87
- Automatyzacja budowania 88
- Zależności budowania 89
- Zależności zewnętrzne 92
- Projekty wielomodułowe 93
- Wiele repozytoriów (czy jedno)? 93
- Wtyczki 94
- Wydawanie i publikacja artefaktów 95
- Przegląd narzędzi do budowania kodu Java 95
- Ant 95
- Maven 98
- Gradle 102
- Bazel, Pants i Buck 105
- Inne narzędzia do budowania oparte o JVM: SBT i Leiningen 107
- Make 107
- Wybór narzędzia do budowania 108
- Podsumowanie 109
6. Dodatkowe narzędzia i umiejętności wykorzystywane do budowania aplikacji 111
- Polecenia Linuksa, powłoki Bash i podstawowego interfejsu wiersza poleceń 111
- Użytkownicy, uprawnienia i grupy 112
- Praca z systemem plików 115
- Przeglądanie i edycja tekstu 117
- Wszystko razem: przekierowania, potoki i filtry 118
- Wyszukiwanie tekstu i manipulowanie nim: grep, awk i sed 119
- Narzędzia diagnostyczne: top, ps, netstat i iostat 120
- Wywołania HTTP i manipulacja danymi JSON 121
- Narzędzie curl 121
- Narzędzie HTTPie 124
- Narzędzie jq 127
- Podstawy pisania skryptów 128
- Narzędzie xargs 128
- Potoki i filtry 128
- Pętle 129
- Warunki 129
- Podsumowanie 130
7. Pakowanie aplikacji do wdrożenia 131
- Budowanie archiwum JAR krok po kroku 131
- Budowanie wykonywalnego fat JAR (uber JAR) 135
- Wtyczka Maven Shade 135
- Budowanie plików uber JAR przy użyciu projektu Spring Boot 138
- Skinny JAR – gdy zdecydujesz się nie budować plików uber JAR 139
- Budowanie plików WAR 140
- Pakowanie dla chmury 141
- Gotowanie konfiguracji: wypiekanie lub smażenie maszyn 142
- Budowanie pakietów RPM i DEB systemu operacyjnego 142
- Dodatkowe narzędzia kompilowania pakietów systemu operacyjnego (z obsługą systemu Windows) 145
- Tworzenie obrazów maszyn dla wielu chmur za pomocą programu Packer 147
- Dodatkowe narzędzia do tworzenia obrazów maszyn 149
- Budowanie kontenerów 150
- Tworzenie obrazów kontenerów za pomocą narzędzia Docker 150
- Fabrykowanie obrazów Docker za pomocą fabric8 151
- Pakowanie aplikacji Java FaaS 153
- Podsumowanie 155
8. Praca w lokalnym odpowiedniku środowiska produkcyjnego 157
- Wyzwania związane z lokalnym tworzeniem oprogramowania 157
- Imitacje, atrapy i wirtualizacja usług 158
- Wzorzec 1.: profile, imitacje i atrapy 158
- Imitowanie usług za pomocą biblioteki Mockito 159
- Wzorzec 2.: wirtualizacja usług i symulacja interfejsu API 161
- Wirtualizacja usług za pomocą narzędzia Hoverfly 162
- Maszyny wirtualne oraz narzędzia Vagrant i Packer 165
- Instalacja narzędzia Vagrant 166
- Utworzenie pliku Vagrantfile 166
- Wzorzec 3.: pudełkowe środowisko produkcyjne 168
- Kontenery: Kubernetes, minikube i Telepresence 169
- Przykładowa aplikacja Docker Java Shop 169
- Tworzenie aplikacji Java i obrazów kontenerów 170
- Wdrożenie kontenera na platformie Kubernetes 172
- Prosty test usługi 174
- Utworzenie pozostałych usług 174
- Wdrożenie całej usługi Java na platformie Kubernetes 174
- Kontrola wdrożonej aplikacji 175
- Telepresence: praca zdalna i lokalna 176
- Wzorzec 4.: dzierżawa środowiska 178
- Funkcja jako usługa: AWS Lambda i SAM Local 179
- Instalacja narzędzia SAM Local 179
- Tworzenie funkcji AWS Lambda 179
- Testowanie obsługi zdarzeń za pomocą funkcji AWS Lambda 182
- Testowanie funkcji za pomocą narzędzia SAM Local 185
- FaaS: usługa Azure Functions i edytor Visual Studio Code 186
- Instalacja najważniejszych komponentów Azure Functions 186
- Lokalne kompilowanie i testowanie funkcji 189
- Testowanie lokalnych i zewnętrznych funkcji za pomocą edytora Visual Studio Code 191
- Podsumowanie 192
9. Ciągła integracja: pierwsze kroki w tworzeniu procesu kompilacji kodu 193
- Co to jest ciągła integracja oprogramowania? 193
- Implementacja ciągłej integracji oprogramowania 194
- Centralny i rozproszony system kontroli wersji 194
- Przewodnik po systemie Git 196
- Najważniejsze polecenia systemu Git 196
- Hub: podstawowe narzędzie w systemach Git i GitHub 198
- Efektywne korzystanie z systemu DVCS 200
- Programowanie pniowe 200
- Odgałęzienia funkcjonalne 201
- Gitflow 201
- Nie ma recepty na wszystko, czyli jak wybrać odpowiednią strategię odgałęziania 202
- Przeglądanie kodu 204
- Cele przeglądania kodu 205
- Automatyzacja przeglądu kodu: analizatory PMD, Checkstyle i FindBugs 207
- Przeglądanie wniosków o zmiany 210
- Automatyzacja kompilacji 211
- Jenkins 212
- Zaangażowanie zespołu 213
- Regularne konsolidowanie kodu 214
- „Zatrzymać produkcję!”, czyli obsługa nieudanych kompilacji 214
- Nie ignoruj testów 214
- Kompilacja musi być szybka 215
- Ciągła integracja platformy (infrastruktura jako kod) 215
- Podsumowanie 216
10. Proces wdrażania i wydawania oprogramowania 217
- Wprowadzenie do aplikacji Extended Java Shop 217
- Rozdzielenie wdrożenia i wydania aplikacji 220
- Wdrażanie aplikacji 220
- Utworzenie obrazu kontenera 221
- Mechanizm wdrażania 224
- Wszystko zaczyna się (i kończy) na kontroli stanu 233
- Strategie wdrożeniowe 237
- Praca z niezarządzanymi klastrami 246
- Modyfikacje baz danych 249
- Wydawanie funkcjonalności 252
- Flagi funkcjonalności 253
- Wersjonowanie semantyczne 255
- Kompatybilność wsteczna i wersje interfejsu API 257
- Wielofazowe aktualizacje 261
- Zarządzanie konfiguracją i poufnymi danymi 262
- „Zaprasowana” konfiguracja 263
- Zewnętrzna konfiguracja 264
- Przetwarzanie poufnych danych 265
- Podsumowanie 266
11. Testy funkcjonalne: sprawdzenie poprawności i akceptacja oprogramowania 267
- Po co testować oprogramowanie? 267
- Co testować? Wprowadzenie do kwadrantów zwinnego testowania 267
- Ciągłe testowanie oprogramowania 269
- Utworzenie odpowiedniej pętli zwrotnej 270
- Żółwie są wszędzie, aż po sam koniec 270
- Transakcje syntetyczne 272
- Testy kompleksowe 272
- Testy akceptacyjne 274
- Programowanie zorientowane na działanie 275
- Imitowanie i wirtualizowanie zewnętrznych usług 278
- Wszystko razem 278
- Testy kontraktów klienckich 279
- Kontrakty REST API 280
- Kontrakty komunikatów 283
- Testy komponentów 285
- Wbudowane magazyny danych 285
- Kolejki komunikatów umieszczane w pamięci 286
- Dublerzy testowi 287
- Tworzenie wewnętrznych zasobów lub interfejsów 288
- Testy wewnątrz- i zewnątrzprocesowe 289
- Testy integracyjne 291
- Weryfikowanie zewnętrznych interakcji 291
- Testy odporności na błędy 292
- Testy jednostkowe 293
- Towarzyskie testy jednostkowe 294
- Samotne testy jednostkowe 295
- Niestabilne testy 296
- Dane 296
- Tymczasowo niedostępne zasoby 296
- Niedeterministyczne zdarzenia 297
- Gdy nic nie można zrobić 297
- Testy „do wewnątrz” i „na zewnątrz” 298
- Testy „do wewnątrz” 298
- Testy „na zewnątrz” 299
- Zebranie wszystkiego w jeden proces 301
- Jak dużo testów trzeba wykonać? 301
- Podsumowanie 303
12. Testy jakościowe systemu: weryfikacja wymagań niefunkcjonalnych 305
- Po co testować wymagania niefunkcjonalne? 305
- Jakość kodu 306
- Jakość architektury 306
- ArchUnit: testy jednostkowe architektury 307
- Wyliczanie wskaźników jakościowych projektu za pomocą biblioteki JDepend 308
- Testy wydajnościowe i obciążeniowe 310
- Testowanie wydajności przy użyciu Apache Benchmark 311
- Testy obciążeniowe z użyciem narzędzia Gatling 312
- Bezpieczeństwo, podatności i zagrożenia 317
- Weryfikacja bezpieczeństwa na poziomie kodu 318
- Weryfikacja zależności 322
- Luki w bezpieczeństwie platform wdrożeniowych 325
- Kolejny krok: modelowanie zagrożeń 329
- Testowy chaos 332
- Wywoływanie chaosu w środowisku produkcyjnym 333
- Wywoływanie chaosu w środowisku przedprodukcyjnym 334
- Jak dużo testów wymagań niefunkcjonalnych trzeba wykonać? 335
- Podsumowanie 336
13. Obserwowalność aplikacji: monitorowanie, logowanie i śledzenie 337
- Obserwowalność i ciągłe dostarczanie oprogramowania 337
- Po co obserwować aplikację? 338
- Obiekty obserwacji: aplikacja, sieć, serwer 338
- Metody obserwacji: monitorowanie, logowanie i śledzenie 340
- Alarmy 340
- Projektowanie obserwowalnych systemów 341
- Wskaźniki 342
- Rodzaje wskaźników 343
- Dropwizard Metrics 343
- Spring Boot Actuator 344
- Micrometer 345
- Dobre praktyki tworzenia wskaźników 346
- Logowanie 347
- Formaty logów 347
- SLF4J 348
- Log4j 2 349
- Dobre praktyki logowania 350
- Śledzenie zapytań 351
- Ślady, przęsła i bagaże 352
- Śledzenie aplikacji Java: OpenZipkin, Spring Cloud Sleuth i OpenCensus 353
- Dobre praktyki śledzenia systemów 353
- Śledzenie wyjątków 354
- Airbrake 355
- Narzędzia do monitorowania systemu 356
- collectd 356
- rsyslog 356
- Sensu 357
- Zbieranie i zapisywanie danych 357
- Prometheus 358
- Elastic-Logstash-Kibana 358
- Wizualizacja danych 359
- Wizualizacja dla biznesu 359
- Wizualizacja dla administratorów 360
- Wizualizacja dla programistów 361
- Podsumowanie 362
14. Migracja do ciągłego dostarczania 365
- Czynniki ciągłego dostarczania 365
- Wybór projektu migracji 366
- Świadomość sytuacyjna 367
- Framework Cynefin i ciągłe dostarczanie 368
- Wszystkie modele są złe, ale niektóre są przydatne 369
- Wstępne organizowanie ciągłego dostarczania 370
- Pomiar ciągłego dostarczania 371
- Zacznij od niewielkich rzeczy, eksperymentuj, ucz się, udostępniaj i powtarzaj 372
- Szersze wdrożenie: kierowanie wprowadzaniem zmian 374
- Dodatkowe porady i wskazówki 375
- Złe praktyki i typowe antywzorce 375
- Brzydka architektura: naprawiać czy nie naprawiać 376
- Podsumowanie 379
15. Ciągłe dostarczanie i ciągłe doskonalenie 381
- Zacznij od punktu, w którym jesteś 381
- Opieraj się na solidnych podstawach technicznych 382
- Ciągłe dostarczanie wartości (Twój najwyższy priorytet) 382
- Zwiększenie współodpowiedzialności za oprogramowanie 383
- Promuj szybką informację zwrotną i eksperymentowanie 384
- Rozwijaj ciągłe dostarczanie w organizacji 385
- Ciągłe doskonalenie 385
- Podsumowanie 386
Skorowidz 389
Opinie
Na razie nie ma opinii o produkcie.