Ja i kilku kolegów zajmujemy się tym od dłuższego czasu. Kiedy zaczynaliśmy, trudno było znaleźć dobre posty dotyczące tego tematu. Dlatego chciałbym podzielić się z nami tym, co według nas działa "najlepiej".
Szczegóły projektu
Jeden z naszych klientów ma duży i ciężki platformę używaną do zarządzania jego procesu biznesowego (coś jak ERP & CRM). Platforma została pierwotnie opracowana przy użyciu Symfony 2, a teraz mamy zaktualizowaną wersję Symfony 3. Aby mieć pewność, że wszystko działa poprawnie, projekt zawiera mnóstwo przypadków testowych. Używamy również:
- Doctrine Migrations dzięki czemu mogliśmy bezpiecznie aktualizować bazę danych na serwerach produkcyjnych, gdy jest to konieczne.
- Phing
- Bower
- Assetic
- PHPUnit
- Git
- Jenkins
Testowanie
Gdy ktoś zobowiązuje się do naszego serwera git, hak pozwala Jenkins wiedzieć i kompilacja jest uruchamiana. Gdy zadanie zakończy się pomyślnie, ręcznie uruchomimy wdrożenie. Odbywa się to poprzez zalogowanie się na komputerze klienta i uruchomienie skryptu, który opracowaliśmy.
Wdrożenie
Użyliśmy podejść do tego tak samo jak ty - Prześlij archiwum Jenkins po zakończeniu pracy. To jednak okazało się dość problematyczne, ponieważ w niektórych przypadkach archiwum mogło zostać zerwane (tj. Z powodu problemów z połączeniem sieci między instancją Janiki a serwerem produkcyjnym). Również przesłanie pliku z naszego serwera na serwer klienta zajęło znacznie więcej czasu. Dlatego zdecydowaliśmy się użyć gita i pobrać z niego niezbędną wersję. Korzystanie z git okazało się bardziej niezawodne i zapewnia absolutną kopię projektu po stronie klienta. Również cofnięcia do poprzedniej wersji to tylko jedna git checkout
dala :)
Ponieważ większość z nas już doświadczenie z ant
i php
zdecydowaliśmy się użyć Phing i utworzyć skrypt kompilacji i automatyzację większości zwykłych zadań. W skrypcie kompilacji dodaliśmy większość typowych zadań uruchamianych przez cały czas, takich jak instalowanie, aktualizowanie, czyszczenie pamięci podręcznej, instalowanie zasobów itd. Następnie udostępniliśmy ten skrypt na każdym serwerze produkcyjnym.
Gdy Jenkins budować zadaniem jest udany, a my ręcznie zwolniony & oznaczone wersję produktu, chcielibyśmy uruchomić phing update
na komputerze klienta SSH (krok ten mógł zostać zautomatyzowane, ale był celowo nie należytej do niektórych wymagań projektu).Co to polecenie zrobi to:
- Pobierz najnowszą wersję znakowany z naszego serwera git
- Jeśli prąd wersja < najnowszy wersji oznaczonych (z hash
19a6d9
) przechodzi do następnego etapu
phing maintenance:on
(ustawia platformę w trybie offline)
git fetch origin 19a6d9
git checkout 19a6d9
phing composer:install
phing database:upgrade
(która biegnie kilka poleceń, w tym tworzenie kopii zapasowych bazy danych i doctrine:migrations:migrate
)
phing assets
(biegnie bower install
, assetic
poleceń i kompiluje wszystkie js/css do one.css
i one.js
)
phing cache:clean
phing maintenance:off
(włącza platformę)
Nasze zadanie phing update
jest również otoczone przez trycatch
, a w przypadku, gdy faza aktualizacji trafi w cegłę, automatycznie przejdzie do fazy przywracania. Odbywa się to poprzez phing rollback PREVIOUS_VERSION
polecenia która robi:
git checkout PREVIOUS_VERSION
- przywraca fs do poprzedniego git wersji
phing composer:install
phing database:rollback PREVIOUS_VERSION
phing assets
phing report
(ta informuje wystąpił problem z aktualizację do naszego narzędzia do śledzenia problemów z załączonym plikiem dziennika)
Odpowiedzi na pytania
Wolisz przenieść folder z bower_components
i vendor
do systemu żywo zamiast wykonania bower install
i composer install
tam znowu?
- pójdę z
bower install
i composer install
, ponieważ po raz pierwszy będziesz już wszystko w pamięci podręcznej. Każde kolejne uruchomienie byłoby niemal natychmiastowe lub co najmniej znacznie szybsze niż ponowne przesyłanie wszystkich zasobów raz za razem za pośrednictwem ftp. To może zaoszczędzić ci nieco przepustowości i, co najważniejsze, czasu. Jeśli zdecydujesz się na podobną konfigurację do mojej, możesz chcieć uniknąć compiling
js/css na instancji Jenkins, jak będziesz to robił na serwerze prod.
W jaki sposób obchodzić się z hasłami podczas wykonywania promocji na żywo?
- Nie jesteś pewien, o co pytasz?
Wnioski
Konfiguracja zależy głównie od wymagań projektowych, zasoby masz dostępne (tj VPS, dzielonego hostingu, Git, ssh, etc) oraz proces uwalniania. Jak widać, nasze wdrożenie różni się nieco od tego, co robisz. To nie czyni go złym ani dobrym - to po prostu pasuje do naszych potrzeb. Jeśli to, co już masz, działa dla Ciebie i rozwiązuje wszystkie problemy - powinieneś trzymać się go i próbować zoptymalizować. W przypadku, gdy dopiero zaczynasz to, co powinno być najbardziej ostrożnym:
PEŁNE ... KOPIE ZAPASOWE! Posiadanie kopii zapasowej produkcyjnego systemu plików jest świetne, ale powinieneś także mieć kopię zapasową bazy danych. Podczas kursu rozwoju twojego projektu prawdopodobnie będziesz miał nowe funkcje, które zmieniają bazę danych. Niektóre z tych zmian mogą być niekompatybilne wstecz. Należy więc wykonać kopię zapasową wszystkiego lub może się zdarzyć, że utworzona zostanie kopia zapasowa fs bez bazy danych db, co uniemożliwi wycofanie.
Cofnij - utwórz skrypt, który wykonuje wszystkie niezbędne kroki, aby wycofać projekt do poprzedniej wersji. Jeśli jesteś pod dużą presją lub rzeczy są wrażliwe na czas, możesz niechcący popełnić błąd i zepsuć kopię zapasową lub coś innego ... Zrób skrypt, który zrobi to za ciebie.
Przetestuj proces wdrażania lokalnie lub na maszynie testowej, aby mieć pewność, że wszystko działa prawidłowo, zanim wykonasz ją na rzeczywistym serwerze produkcyjnym.
Mam nadzieję, że to pomoże Ci znaleźć najlepsze rozwiązanie dla Twojego procesu wdrażania uwolnienie &. Jeśli znajdziesz lepsze rozwiązanie, opublikuj to jako odpowiedź - na pewno będzie pomocne!
David, zmagam się z dość podobną konfiguracją. Jak przesłać przez SSH plik zip utworzony przez wtyczkę "Kompresuj artefakty". Jest przechowywany w katalogu głównym każdej kompilacji i domyślnie wtyczka Publish szuka plików w katalogu obszaru roboczego. Jak wybrać automatycznie plik zip? – MarcSitges
Czy możesz wysłać swój plik Jenkinsfile? Byłby to świetny przykład dla innych osób, które dopiero zaczynają się uczyć Jenkinsa. –