1. Wprowadzamy zmiany w kodzie
Jak już mówiłem wcześniej, tworzenie oprogramowania sprowadza się do wprowadzania małych zmian w kodzie. Tę pracę wykonują miliony programistów od dziesięcioleci, co doprowadziło do jego dokładnego debugowania, standaryzacji i formalizacji na wszelkie możliwe sposoby.
Do przechowywania kodu służy specjalny program – Git. Git to rozproszony system zarządzania wersjami. Nie tylko przechowuje kod, ale śledzi wszystkie zmiany w nim i pomaga programistom pracować nad projektami razem, nie przeszkadzając sobie 🤝.
Dzięki Git deweloperzy mogą tworzyć różne wersje projektu (branch'e), przechowywać pełną historię zmian i nawet wracać do dowolnego momentu w przeszłości. To jak maszyna czasu dla kodu! Git pomaga łączyć zmiany i rozwiązywać konflikty, dlatego stał się głównym narzędziem do pracy zespołowej w nowoczesnym developmencie. 👩💻
2. Buildujemy projekt
Zanim przetestujesz projekt lub wrzucisz go na serwer, trzeba go zbudować.
🏗️ Build projektów to proces kompilacji kodu źródłowego projektu do wykonywalnych programów lub innych formatów uruchomieniowych, często z testami i deploymentem w pakiecie. To kluczowy etap w tworzeniu oprogramowania, zapewniający gotowość programu do użycia.
Build to nie tylko kompilacja, choć często jest jej częścią. Po zakończeniu builda możesz mieć dziesiątki albo nawet setki plików, które trzeba wrzucić na różne serwery.
Buildery mogą być niskopoziomowe, takie jak:
- ☕ Maven i Gradle – szeroko używane w projektach Java do zarządzania dependencies i buildowania projektów.
- 🐜 Apache Ant – kolejny narzędzie do buildowania projektów Java, daje dużą elastyczność w pisaniu skryptów buildowych.
- 🖥️ MSBuild – używany do buildowania projektów tworzonych w Visual Studio od Microsoftu.
- ⚙️ Make – klasyczne narzędzie do buildowania, używa Makefile do określania reguł builda, popularne w projektach C i C++.
- 🌐 Webpack – często używany do buildowania JavaScriptowych aplikacji, zarządza dependencies i modułami.
- 📜 Gulp i Grunt – narzędzia pomagające automatyzować często powtarzane zadania w web development, takie jak minifikacja plików czy kompilacja SCSS do CSS.
Są też i buildery wysokopoziomowe. O nich – poniżej.
3. CI/CD
🔄 CI/CD (Continuous Integration/Continuous Delivery) to metodologia, która zakłada ciągłe łączenie zmian z wszystkich branch'y w główną gałąź, a także automatyczne testy i deployment tych zmian. To pozwala szybko wykrywać i naprawiać błędy, zwiększając efektywność i szybkość developmentu.
Jednym z najpopularniejszych, choć trochę przestarzałych, systemów CI/CD jest Jenkins. Jeśli pracujesz w małej firmie, to z 80% prawdopodobieństwem będzie to właśnie Jenkins.
🤖 Jenkins to popularny system automatyzacji, używany do ciągłej integracji i delivery (CI/CD). Jenkins pozwala automatyzować różne etapy developmentu, w tym build, testy i deployment, co poprawia jakość kodu i przyspiesza cały proces.
Jeśli trafisz do dużej firmy, to może być jeszcze do wyboru 5 innych:
- 🚦 TeamCity – mocny komercyjny system od JetBrains. Daje głęboką integrację z różnymi środowiskami developmentu i testowania.
- 📝 GitLab CI – wbudowany w GitLab, zapewnia CI/CD z konfiguracją przez YAML.
- ☁️ CircleCI – chmurowy serwis CI/CD, wspiera automatyzację testów i deploymentów dla wielu projektów.
- 🦑 Travis CI – jeden z pierwszych chmurowych CI, używany w wielu open-source’owych projektach. Dobrze integruje się z GitHub.
- 🎍 Bamboo – produkt od Atlassian, mocno zintegrowany z innymi narzędziami tej firmy, jak Jira i Bitbucket.
Nie musisz ich znać i umieć obsługiwać – zwykle w firmie są DevOps-owcy, którzy to wszystko konfigurują. Ty musisz wiedzieć, że one istnieją i rozumieć, o czym mowa, gdy ktoś wspomni Jenkins, CI/CD albo „continuous integration”.
4. Dostarczanie projektu na serwer
Niewystarczy napisać projekt – musi on jeszcze trafić na Twój serwer. W ogóle, deployment (deply, deploy) projektu na serwer to proces umieszczania i uruchamiania webappki na serwerze tak, żeby była dostępna dla użytkowników przez internet 🚚.
Ten proces obejmuje przeniesienie plików projektu na serwer, konfigurację środowiska serwerowego, baz danych, dependencies, a także ustawienia sieci i bezpieczeństwa 😅.
A jak myślisz, Twój kod trafi na serwer? Ktoś go tam wrzuci? A może podłączysz się przez SSH do zdalnego serwera, wrzucisz kilka plików i wszystko skonfigurujesz? Spokojnie: tak już nikt nie robi. Teraz jest Docker.
🐳 Docker to platforma do developmentu, delivery i uruchamiania aplikacji za pomocą containers. Docker upraszcza tworzenie, deployment i uruchamianie aplikacji, pakując je razem z dependencies i środowiskiem w jeden mały obiekt. To zapewnia spójność środowiska na każdym etapie: od developmentu, przez testy, aż po produkcję.
Docker pozwala zapakować Twój projekt albo projekty w Docker container. To coś jak wirtualna maszyna.
I choć na każdym forum o Dockerze zostaniesz zlany pomidorami, jeśli nazwiesz go „wirtualną maszyną”, to można myśleć o Docker container właśnie jak o wirtualnej maszynie. Tylko dużo lżejszej.
W istocie, Docker container to wirtualna „wirtualna maszyna”. Wirtualne maszyny to pełne kopie systemu operacyjnego, jądra OS i wirtualnego hardware’u, podczas gdy Docker containers dzielą jądro hosta i mogą być bardziej lekkie i szybkie ⚡.
Deployment projektu z Dockerem mocno upraszcza cały proces, zapewniając szybkość i niezawodność. Projekt jest pakowany w Docker container, które można łatwo przenosić i uruchamiać na dowolnym systemie z Dockerem 🚢.
To eliminuje problemy związane z różnicami w środowiskach serwerowych i pozwala łatwo skalować aplikację, dodając lub usuwając kontenery w zależności od obciążenia. Wszyscy przeszli na Docker – to bardzo wygodne i bardzo proste.
GO TO FULL VERSION