Jest wiele sposobów na wdrożenie kodu źródłowego z Git repo do kontenera, w tym przerzucenie całego kontenera, natychmiastowe przerzucanie przez wolumeny lub przy użyciu „git clone”. Automatyzacja procesu i zmiana na „continuous deployment” może jednak przysporzyć problemów wielu deweloperom, ponieważ muszą oni wiedzieć, jak poprawnie połączyć wszystkie komponenty aplikacji z niezbędnymi punktami wzajemnego połączenia.
Dokładnie mówiąc, w świecie kontenerów musisz zarządzać dużą liczbą nagromadzonych stert obrazów, a dodatkowej trudności dodaje proces CI/CD. Przerzucanie całych kontenerów może nie być najlepszym rozwiązaniem, jeśli często zatwierdzasz zmiany nie modyfikując konfiguracji systemu operacyjnego, stosu aplikacji serwerowej lub jej elementów zależnych.
Aby ułatwić automatyzację przenoszenia, UniCloud przygotował dedykowany pakiet Git-Push-Deploy do dostarczania kodów do wstępnie stworzonych obrazów kontenera. Pakiet ten zawiera wiele konfiguracji pozwalających na ustawienie automatycznego wdrażania zmian wprowadzonych w repozytorium źródłowym aplikacji Git w chmurze, umożliwiając tym samym ich dalsze udostępnianie do testowania przy minimalnych opóźnieniach.
Specyfikacje Git-Push-Deploy
Pakiet Git-Push-Deploy może zostać zintegrowany z GitHub oraz z repozytoriami GitLab. W pakiecie zaprojektowano automatyczne dostarczanie aktualizacji w źródłach aplikacji Java, PHP, Ruby, Node.js oraz Python i może być użyta w następujących certyfikowanych szablonach stosów:
- Java – Tomcat 6/7/8/9, TomEE, GlassFish 3/4, Jetty 6/8/9, WildFly 8/9/10, JBoss AS 7, Spring Boot 1.x
- PHP – Apache 2.4, NGINX 1.10
- Ruby – Apache 2.4, NGINX 1.10
- Node.js – NodeJS 0.x-6.x
- Python – Apache 2.4
Proces pracy zależy od języka programowania użytego w danym projekcie:
- w projektach opartych na Java, pakiet zainicjuje tworzenie oddzielnego środowiska z węzłem kompilacji Maven build node, który będzie odpowiadał za interakcję z repozytorium zdalnego Git, uruchamiając tworzenie aplikacji oraz jej wdrażanie na serwer aplikacji,
- dla PHP/Ruby/Node.js/Python applications, pakiet tworzy proces do wdrożenia projektu bezpośrednio do kontekstu ROOT na serwer sieci web (weź pod uwagę, że aplikacja serwerowa Ruby wyposażona jest w tryb wdrożeniowy, a nie kontekstowy na pulpicie. Sama lokalizacja projektu pozostaje taka sama).
Prekonfiguracja repozytoriów
Aby poprawnie zainstalować dodatek, należy podać Osobisty Token API (Personal API Token) do konta Git. Umożliwi to pakietowi skonfigurować webhooka dla odpowiedniego repozytorium, co spowoduje zainicjowanie przerzucenia aplikacji za każdym razem, gdy do kodu zostaną wprowadzone jakieś zmiany.
Zobaczmy jak to zrobić. Wybierz instrukcję odpowiadającą temu Git VSC, którego używasz (GitHub lub GitLab) i postępuj według niej.
Generowanie Tokena Dostępu na GitHub
Aby otrzymać token do indywidualnego dostępu (personal access token) do konta GitHub, przejdź do Ustawień (Settings) > Tokeny do indywidualnego dostępu (Personal access tokens) i kliknij Wygeneruj nowy token (Generate new token).
Na wyświetlonej stronie podaj Opis tokena (Token description) i wybierz repo oraz zakresy admin:repo_hook. Kliknij przycisk Wygeneruj token (Generate token), znajdujący się u dołu strony.
Zostaniesz przekierowany do strony z tokenami dostępowymi. Skopiuj je i zapisz w innym miejscu, gdyż po opuszczeniu tej strony nie będziesz miał do nich ponownego dostępu.
Po zakończeniu przejdź do zakładki Zainstaluj pakiet Git-Push-Deploy (Install Git-Push-Deploy Package), znajdującej się u dołu artykułu.
Generowanie Tokena Dostępu w GitLab
Aby wygenerować token do indywidualnego dostępu (personal access token) w GitLab, przejdź do Ustawień (Settings), a następnie do zakładki Tokeny Dostępowe (Access Tokens).
W tym miejscu należy określić opcjonalną nazwę tokena, jego datę ważności (można pozostawić puste) i zaznaczyć zakres uprawnień api.
Kliknij Utwórz Token do indywidualnego dostępu (Create Personal Access Token).
Zostaniesz przekierowany do strony z tokenem dostępowym. Skopiuj je i zapisz w innym miejscu, gdyż po opuszczeniu tej strony nie będziesz miał do nich ponownego dostępu.
Teraz możemy przejść do instalowania pakietu.
Dodatkowe ustawienia przedkonfiguracyjne dla Projektów Java
Pracując nad projektem opartym na Java, musisz przede wszystkim upewnić się, czy będzie on dobrze współpracował z dowiązaniem budowanym na Maven. W tym celu dodaj specjalny plik POM Model Celu Projektu (Project Object Model) do struktury projektu.
Stwórz plik pom.xml w głównym źródle repozytoriów projektu, dane poniżej stanowią obowiązkową podstawę:
<project> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0</version> <packaging>war</packaging> <build> <finalName>${project.artifactId}</finalName> </build> </project>
przy czym wartości opcjonalne to:
- groupId – grupa projektów (np. nazwa firmy)
- artifactId – nazwa projektu
- version – wersja twojej aplikacji
Pozostałe parametry powinny zostać niezmienione.
Zainstaluj pakiet wdrażania Git-Push-Deploy
Pakiet Git-Push-Deploy jest dodatkiem, dlatego też może zostać zainstalowany tylko na środowisko. Przygotowaliśmy dwa osobne środowiska z serwerami aplikacji Tomcat i Apache-PHP, aby pokazać przepływ pracy dla różnych języków programowania. Aby zaprezentować pracę na różnych językach, przygotowaliśmy dwa osobne środowiska z serwerami aplikacji Tomcat oraz Apache-PHP.
Jeśli zamierzasz użyć poprzednio stworzonego środowiska, miej na uwadze, że ten pakiet nadpisze się na aplikacji wdrożonej w kontekście ROOT. Jeśli chcesz zachować już wdrożoną aplikację, przenieś ją do kontekstu niestandardowego. Zalecamy utworzenie nowego środowiska, a następnie kontynuowanie instalacji:
- Kliknij Importuj w górnej części okna pulpitu i w otworzonym oknie przeglądarki wstaw łącze manifest.jps dla projektu Git-Push-Deploy:
https://github.com/Jelastic-jps/git-push-deploy/blob/master/manifest.jps
Kliknij Importuj (Import), aby przejść dalej. - W otwartym oknie, podaj następujące dane dotyczące repozytorium i wybranego środowiska:
- Git Repo Url – link HTTPS do repozytorium Twojej aplikacji (.git lub widok wspólny). Możesz przetestować przykładową aplikację Hello World, aby zobaczyć jak wszystko działa
- Branch – branch projektu, który ma być użyty
- Użytkownik – wprowadź login swojego konta Git
- Token – podaj token dostępu, który został utworzony wcześniej do generowania webhook
- Nazwa środowiska – wybierz środowisko, do którego zostanie zainstalowana twoja aplikacja
- Node’y – nazwa serwera aplikacji (pobierze się automatycznie po wybraniu środowiska)
Kliknij Instaluj, aby przejść dalej.
- Poczekaj chwilę, aż UniCloud pobierze wszystkie źródła aplikacji z GitHub i skonfiguruje webhook dla continuous deployment.
Gdy instalacja dobiegnie końca, Zakmnij okienko powiadomień. - W zależności od rodzaju projektu wyniki mogą wyglądać następująco:
- w przypadku infrastruktury zbudowanej na Java, środowisko pojawi się na pulpicie z wbudowanym dowiązaniem Maven. Po każdym zaktualizowaniu kodu źródłowego zostanie on zbudowany i wdrożony do kontekstu ROOT na serwerze
Pamiętaj, że Maven potrzebuje trochę czasu na skompilowanie projektu, więc, mimo, że sam pakiet instalacyjny będzie już gotowy, musisz poczekać zanim uruchomisz to narzędzie. Postęp tej operacji może być śledzony w czasie rzeczywistym za pośrednictwem pliku dziennika vcs_update na Maven:
- dla infrastruktury opartej na PHP (i pozostałych obsługiwanych językach), aplikacja zostanie wdrożona bezpośrednio do wybranego serwera ROOT
Zauważ, że podobna sekcja Projekty dla serwerów aplikacji Ruby udostępnia informacje o używanym trybie wdrażania (wdrażanie domyślne), zamiast kontekstu, podczas gdy rzeczywiste położenie aplikacji dotyczy również głównego serwera.Aby uruchomić aplikację, kliknij Otwórz w przeglądarce.
- w przypadku infrastruktury zbudowanej na Java, środowisko pojawi się na pulpicie z wbudowanym dowiązaniem Maven. Po każdym zaktualizowaniu kodu źródłowego zostanie on zbudowany i wdrożony do kontekstu ROOT na serwerze
Zasady ponownego wdrażania różnych stosów
Poniższa tabela zawiera listę zachowań różnych serwerów aplikacji po otrzymaniu zaktualizowanego kodu.
Nazwa stosu | Zasada |
Tomcat 6 | Restart |
Tomcat 7 | Restart |
Tomcat 8 | Restart |
Tomcat 9 | Restart |
TomEE | Restart |
GlassFish 3 | Hot Redeploy via Server API |
GlassFish 4 | Hot Redeploy via Server API |
GlassFish 5 | Hot Redeploy via Server API |
Jetty 6 | Restart |
Jetty 8 | Restart |
Jetty 9 | Restart |
JBoss 7 | Restart |
Wildfly 8 | Restart |
Wildfly 9 | Restart |
Wildfly 10 | Restart |
Railo | Restart |
SpringBoot | Restart |
Apache-PHP | Advanced ZDT |
Nginx-PHP | Advanced ZDT |
Apache-Ruby | Graceful Reload |
Nginx-Ruby | Graceful Reload |
NodeJS | Restart |
Python | Restart |
W celu wyeliminowania możliwych przestojów aplikacji w serwerze z Zasadą aktualizacji poprzez ponowne uruchamianie (Restart), zeskaluj ją, żeby mogła być uruchamiana na wielu kontenerach. W takim przypadku, wybrana aktualizacja zostanie wdrożona do instancji sekwencyjnie, z domyślnym 30-sekundowym opóźnieniem.
Testowanie automatycznego wdrażania z Git
Sprawdźmy, jak proces ten faktycznie działa. Wprowadź drobne zmiany do kodu w repo i upewnij się, że wszystko zostało zautomatyzowane:
- Przy niektórych elementach z repozytorium projektu kliknij Edytuj plik, a następnie Zachowaj zmiany – w naszym przykładzie zmodyfikujemy tekst na naszej stronie startowej HelloWorld.
- W ten sposób uruchomiony zostanie odpowiedni webhook, który wdroży wprowadzone zmiany do środowiska hostingowego – szczegóły znajdziesz w sekcji Ustawienia > Webhooks w repozytorium.
Po kliknięciu ciągu, zobaczysz listę Ostatnio przesłane, zainicjowaną przez webhook oraz wyniki tych działań. - Ostatni krok to powrót do strony aplikacji i odświeżenie jej. Pamiętaj, że Maven potrzebuje trochę czasu, aby zbudować i wdrożyć projekt oparty na Java.
To wszystko! Jak widzisz zmiany zostały zastosowane i rozwiązanie działa tak, jak tego oczekiwaliśmy.
Teraz uaktualnij kod, zatwierdź zmiany, wykonaj komendy jak zwykle i wszystkie zmiany zostaną automatycznie przesłane do środowiska UniCloud. Brak konieczności przełączania się pomiędzy procesami lub dokonywania ręcznych aktualizacji eliminuje możliwość popełnienia błędu przez człowieka. Przyśpiesza to również czas wprowadzenia aplikacji na rynek. Sprawdź, jak to działa w Twoim projekcie.