reklama - zainteresowany?

Ciągłe dostarczanie oprogramowania w języku Java. Najlepsze narzędzia i praktyki wdrażania kodu - Helion

Ciągłe dostarczanie oprogramowania w języku Java. Najlepsze narzędzia i praktyki wdrażania kodu
Autor: Daniel Bryant, Abraham Marín-Pérez
Tytuł oryginału: Continuous Delivery in Java: Essential Tools and Best Practices for Deploying Code to Production
TÅ‚umaczenie: Krzysztof BÄ…bol, Andrzej Watrak, Lech Lachowski
ISBN: 978-83-283-5633-7
stron: 400, Format: 168x237, okładka: miękka
Data wydania: 2019-10-11
Księgarnia: Helion

Cena książki: 69,00 zł

Dodaj do koszyka Ciągłe dostarczanie oprogramowania w języku Java. Najlepsze narzędzia i praktyki wdrażania kodu

Tagi: Docker | Inne - Programowanie | Java - Programowanie | Testowanie oprogramowania

W ciÄ…gu ostatnich lat radykalnie zmieniÅ‚y siÄ™ wymagania i oczekiwania biznesowe wobec oprogramowania. Kluczowymi wartoÅ›ciami sÄ… innowacyjność, szybkość i czas wejÅ›cia na rynek. Do speÅ‚nienia tych wymagaÅ„ konieczne okazaÅ‚y siÄ™ nowe architektury i modele tworzenia kodu. Metodyka ciÄ…gÅ‚ego dostarczania, zwanego też CD, polega na tworzeniu w krótkich cyklach wartoÅ›ciowych i solidnych produktów. FunkcjonalnoÅ›ci sÄ… dodawane w maÅ‚ych krokach, a oprogramowanie można wydawać niezawodnie w dowolnej chwili. To sprawia, że można też szybko otrzymywać informacje zwrotne. Jednak taki sposób pracy wymaga odpowiednich ram organizacyjnych, a zespóÅ‚ projektowy musi przyswoić nieco inny od tradycyjnego styl pracy.

Ta książka jest praktycznym przewodnikiem, dziÄ™ki któremu programiÅ›ci Javy opanujÄ… techniki potrzebne do pomyÅ›lnego zastosowania metody ciÄ…gÅ‚ego dostarczania. Opisano tu najlepsze zasady budowy architektury oprogramowania, automatycznej kontroli jakoÅ›ci, pakowania aplikacji i wdrażania ich w różnych Å›rodowiskach produkcyjnych. SzczególnÄ… uwagÄ™ poÅ›wiÄ™cono testowaniu oprogramowania: przedstawiono caÅ‚Ä… gamÄ™ metodyk testowania, opisano ich zastosowanie i znaczenie w cyklu życia aplikacji. Ciekawym elementem książki sÄ… informacje o zÅ‚ych praktykach i antywzorcach wraz ze wskazówkami dotyczÄ…cymi rozwiÄ…zywania tego rodzaju problemów.

W tej książce między innymi:

  • solidne podstawy ciÄ…gÅ‚ego dostarczania oprogramowania
  • migracja do ciÄ…gÅ‚ego dostarczania oprogramowania
  • narzÄ™dzia: Jenkins, PMD i FindSecBugs
  • zasady testowania funkcjonalnoÅ›ci i jakoÅ›ci oprogramowania
  • techniki obserwacji aplikacji w Å›rodowisku produkcyjnym

Java i CD: tak zdobędziesz prawdziwą przewagę!

Dodaj do koszyka Ciągłe dostarczanie oprogramowania w języku Java. Najlepsze narzędzia i praktyki wdrażania kodu

 

Osoby które kupowały "Ciągłe dostarczanie oprogramowania w języku Java. Najlepsze narzędzia i praktyki wdrażania kodu", wybierały także:

  • Docker. Kurs video. Poziom drugi. Sieci, wolumeny i ustawienia daemona
  • DevOps w praktyce. Kurs video. Jenkins, Ansible, Terraform i Docker
  • Docker. Kurs video. Podstawy konteneryzacji
  • Docker. Kurs video. Optymalizacja konteneryzacji
  • Docker. Kurs video. ZostaÅ„ administratorem systemów IT

Dodaj do koszyka Ciągłe dostarczanie oprogramowania w języku Java. Najlepsze narzędzia i praktyki wdrażania kodu

Spis treści

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

Dodaj do koszyka Ciągłe dostarczanie oprogramowania w języku Java. Najlepsze narzędzia i praktyki wdrażania kodu

Code, Publish & WebDesing by CATALIST.com.pl



(c) 2005-2024 CATALIST agencja interaktywna, znaki firmowe należą do wydawnictwa Helion S.A.