Wdrażanie projektu Symfony za pomocą Jenkins: najlepsze praktyki

Zarządzam kilkoma projektami Symfony 2/3 na moim serwerze Jenkins, które wdrażam na serwerze live. To jest moja obecna konfiguracja:

Budowa

  • checkout using Git plugin
  • Usuń bazę danych, jeśli istnieje
  • executing composer install (prod mode, optimize autoloader)
  • wykonuję bower install Aby pobrać moje aktywa
  • W 2007 roku firma została założona przez firmę Microsoft, która od 2007 roku zajmuje się projektowaniem i dystrybucją oprogramowania.]}
  • wykonywanie tworzenia bazy danych stuff
  • wykonywanie testów jednostkowych

Archiwizacja

Po zbudowaniu, i archiwizować artefakty budowania Bez vendor, node_modules i bower_components foldery jako plik zip za pomocą wtyczki" Kompresuj artefakty".

The deployment

Używam wtyczki" promowane buduje "i wtyczki" Publish over SSH "w połączeniu: jeśli chcę" przejść na żywo " z kompilacji, publikuję artefakty (mój plik zip) przez SSH do mojego live system w katalogu o nazwie staging_dir. Po załadowaniu pliku wykonuję kilka poleceń SSH:

  • Ustaw system na żywo w trybie konserwacji
  • rozpakuj zamek artefaktów w moim staging_dir
  • wykonaj composer install w systemie live (taka sama konfiguracja jak podczas kompilacji)
  • (bower install i gulp budowanie nie jest konieczne, ponieważ używamy zasobów, które utworzyliśmy podczas budowania)
  • migracja bazy danych
  • przenieś bieżące aktywne pliki systemowe do backup folder
  • skopiuj pliki z staging_dir
  • Ustaw system na żywo w trybie "produkcji" (wyłącz Tryb konserwacji)

Najlepsze praktyki?

Chciałbym teraz zebrać kilka najlepszych praktyk dla wdrożenia:

  • czy wolisz przenieść folder vendor do systemu live zamiast wykonywać composer install tam ponownie?
  • A co z aktywami? Czy bower install i gulp budujesz ponownie na systemie live czy korzystasz z opublikowanych aktywa?
  • Jak radzić sobie z hasłami podczas wykonywania promocji NA ŻYWO?
  • ... inne rzeczy, o których zapomniałem.
Author: David Müller, 2016-02-11

1 answers

Ja i kilku kolegów zajmujemy się tym od dłuższego czasu. Kiedy zaczynaliśmy, dość trudno było znaleźć dobre posty dotyczące tego tematu. Dlatego chciałbym podzielić się tym, co uznaliśmy za "najlepsze" dla nas.

Szczegóły projektu

Jeden z naszych klientów ma dużą i ciężką platformę do zarządzania procesem biznesowym (coś w rodzaju ERP & CRM). Platforma została początkowo opracowana przy użyciu Symfony 2, a teraz zaktualizowaliśmy ją do Symfony 3. Na upewnij się, że wszystko działa poprawnie projekt ma mnóstwo przypadków testowych. Używamy również:

  1. Doctrine Migrations , abyśmy mogli bezpiecznie aktualizować bazę danych na serwerach produkcyjnych, kiedy tylko będzie to konieczne.
  2. Phing
  3. Bower
  4. Assetic
  5. PHPUnit
  6. Git
  7. Jenkins

Testowanie

Gdy ktoś przełączy się na nasz serwer git, hook informuje Jenkinsa i uruchamia build. Raz praca kończy się pomyślnie ręcznie uruchamiamy wdrożenie. Odbywa się to poprzez zalogowanie się do maszyny klienta i uruchomienie opracowanego przez nas skryptu.

Wdrożenie

Podchodziliśmy do tego tak samo jak ty-prześlij archiwum po zakończeniu zadania jenkins. Okazało się to jednak dość problematyczne, ponieważ w niektórych przypadkach archiwum może zostać uszkodzone (np. z powodu problemów z połączeniem sieciowym pomiędzy instancją jenkins a serwerem produkcyjnym). Również zajęło znacznie dłużej, aby przesłać plik z naszego serwera na serwer klienta. Dlatego zdecydowaliśmy się użyć Gita i wyciągnąć stamtąd niezbędną wersję. Korzystanie z git okazało się bardziej niezawodne i zapewnia absolutną kopię projektu po stronie klienta. Poza tym powrót do poprzedniej wersji jest tylko o jedną git checkout:)

Ponieważ większość z nas miała już doświadczenie z ant i php postanowiliśmy użyć Phing i stworzyć skrypt build i zautomatyzować większość regularne zadania. W skrypcie budowania dodaliśmy większość typowych zadań, które uruchamiamy cały czas, takich jak instalacja, aktualizacja, Wyczyść pamięć podręczną, zainstaluj zasoby itp. Następnie udostępniliśmy ten skrypt na każdym serwerze produkcyjnym.

Gdy zadanie kompilacji Jenkinsa powiedzie się i ręcznie wydamy i oznaczymy wersję produktu, uruchamiamy phing update na komputerze klienta przez SSH (ten krok mógł być zautomatyzowany, ale celowo Nie ze względu na pewne wymagania projektu). Co? polecenie to wykonałoby:

  1. Pobierz najnowszą wersję z naszego serwera git
  2. If current version latest tagged version (with hash 19a6d9) przechodzi do następnego kroku
  3. Nie jest to jednak możliwe.]}
  4. git fetch origin 19a6d9
  5. git checkout 19a6d9
  6. phing composer:install
  7. W 2007 roku firma została założona przez firmę Microsoft.]}
  8. phing assets (Działa bower install, assetic polecenia i kompiluje wszystkie js / css do one.css i one.js)
  9. phing cache:clean
  10. phing maintenance:off (włącza platformę)

Nasze zadanie phing update jest również otoczone przez trycatch i w przypadku, gdy faza aktualizacji uderzy w cegłę, automatycznie przejdzie do fazy wycofywania. Jest to wykonywane za pomocą polecenia phing rollback PREVIOUS_VERSION, które wykonuje:

  1. git checkout PREVIOUS_VERSION - przywraca fs do poprzedniej wersji git
  2. phing composer:install
  3. phing database:rollback PREVIOUS_VERSION
  4. phing assets
  5. phing report (to zgłasza problem z aktualizacją naszego problemu tracker z dołączonym plikiem dziennika)

Odpowiedzi na twoje pytania

  1. Czy wolisz przenieść bower_components i vendor folder do systemu live zamiast wykonywać bower install i composer install tam ponownie?

    • wybrałbym bower install i composer install, ponieważ po pierwszym razem wszystko będzie już w pamięci podręcznej. Każde następne uruchomienie byłoby niemal natychmiastowe lub co najmniej znacznie szybsze niż ponowne przesyłanie wszystkich zasobów ponownie i ponownie przez ftp. To może uratować masz nieco przepustowości i co najważniejsze czas . Jeśli zdecydujesz się zrobić podobną konfigurację do mojej, możesz unikać compiling JS / css na instancji Jenkins, jak będziesz to robił na serwerze prod.
  2. Jak radzić sobie z hasłami podczas wykonywania promocji NA ŻYWO?

      Nie wiesz, o co pytasz?

Podsumowanie

Konfiguracja zależy głównie od wymagań projektu, zasobów, które VPS, hosting współdzielony, git, ssh itp.) oraz proces wydania. Jak widzicie, nasze rozmieszczenie nieco różni się od tego, co robicie. To nie czyni go złym ani dobrym - po prostu odpowiada naszym potrzebom. Jeśli to, co już masz, działa dla Ciebie i rozwiązuje wszystkie Twoje problemy - powinieneś trzymać się tego i spróbować go zoptymalizować. W przypadku, gdy dopiero zaczynasz, to jest to, o co powinieneś być najbardziej ostrożny:

  1. Pełna ... kopie zapasowe ! Posiadanie kopii zapasowej produkcyjnego systemu plików jest świetne, ale powinieneś mieć również kopię zapasową bazy danych. W trakcie rozwoju projektu prawdopodobnie pojawią się nowe funkcje, które zmienią bazę danych. Niektóre z tych zmian mogą być niezgodne wstecz. Więc pamiętaj, aby wykonać kopię zapasową wszystkiego, bo możesz mieć kopię zapasową fs bez db do pracy, a tym samym nie być w stanie wycofać.

  2. Rollback-stwórz skrypt, który wykona wszystkie niezbędne kroki, aby cofnąć projekt do poprzedniej wersji. Jeśli jesteś pod dużą presją lub rzeczy są wrażliwe na czas, możesz nieumyślnie popełnić błąd i złamać kopię zapasową lub coś innego... Dlatego stwórz skrypt, który zrobi to za Ciebie.

  3. Przetestuj proces wdrażania lokalnie lub na maszynie testowej, aby upewnić się, że wszystko naprawdę działa, zanim zrobisz to na rzeczywistym serwerze produkcyjnym.

Mam nadzieję, że pomoże Ci to znaleźć najlepsze rozwiązanie dla Twojego wydania i wdrożenia proces. Jeśli zdarzy ci się znaleźć lepsze rozwiązanie, napisz je jako odpowiedź - na pewno będzie to pomocne!

 22
Author: tftd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 22:20:22