Konfigurowanie cyklu wdrażania / kompilacji / CI dla projektów PHP

200

Jestem samotnym programistą przez większość czasu, pracując nad wieloma dużymi projektami, głównie opartymi na PHP. Chcę profesjonalizować i automatyzować sposób obsługi zmian w bazie kodu oraz stworzyć proces ciągłej integracji, który umożliwi przejście do pracy w zespole bez konieczności wprowadzania zasadniczych zmian.

To, co teraz robię, to mam lokalne środowisko testowe dla każdego projektu; Używam SVN do każdego projektu; zmiany są testowane lokalnie, a następnie przenoszone do wersji online, zwykle przez FTP. Dokumentacja API jest generowana ręcznie z kodu źródłowego; Testy jednostkowe to coś, w co powoli się pakuję i nie jest to jeszcze część mojej codziennej rutyny.

„Cykl kompilacji”, który przewiduję, wykonałby następujące czynności:

  • Zestaw zmian zostaje sprawdzony w SVN po przetestowaniu lokalnym.

  • Zaczynam proces kompilacji. Wersja SVN HEAD zostaje sprawdzona, w razie potrzeby zmodyfikowana i przygotowana do przesłania.

  • Dokumentacja API jest generowana automatycznie - jeśli nie skonfigurowałem jej jeszcze szczegółowo, używając domyślnego szablonu, skanuję całą bazę kodu.

  • Nowa wersja jest wdrażana w zdalnej lokalizacji za pośrednictwem FTP (w tym zmiana nazwy katalogu, chmodding, importowanie baz danych i tym podobne). To jest coś, co już bardzo lubię phingować , ale jestem otwarty na alternatywy.

  • Przeprowadzane są testy jednostkowe rezydujące w predefiniowanej lokalizacji. Jestem informowany o ich niepowodzeniu lub sukcesie za pomocą wiadomości e-mail, RSS lub (najlepiej) HTML, które mogę pobrać i umieścić na stronie internetowej.

  • (opcjonalnie) plik tekstowy „changelog” użytkownika końcowego we wstępnie zdefiniowanej lokalizacji jest aktualizowany o wstępnie zdefiniowaną część komunikatu zatwierdzenia („Można teraz filtrować jednocześnie zarówno„ foo ”, jak i„ bar ” czas) Ten komunikat niekoniecznie jest identyczny z komunikatem zatwierdzenia SVN, który prawdopodobnie zawiera znacznie więcej informacji wewnętrznych.

  • Rzeczy takie jak metryki kodu, sprawdzanie stylu kodu itp. Nie są teraz moim głównym celem, ale na dłuższą metę z pewnością będą. Rozwiązania, które wprowadzają to po wyjęciu z pudełka, są bardzo uprzejmie rozpatrywane.

Szukam

  • Informacje zwrotne i doświadczenia od osób, które są lub były w podobnej sytuacji i pomyślnie wprowadziły rozwiązanie tego problemu

  • Szczególnie dobre samouczki krok po kroku i instrukcje, jak to skonfigurować

  • Rozwiązania zapewniające jak największą automatyzację , na przykład poprzez tworzenie szkieletowego API, przypadków testowych i tak dalej dla każdego nowego projektu.

i również

  • Zalecenia produktu . To, co do tej pory wiem, to phing / ant dla kompilacji oraz phpUnderControl lub Hudson dla części raportującej. Lubię je wszystkie, o ile widzę, ale oczywiście nie mam z nimi szczegółowego doświadczenia.

Jestem zalany pracą, więc mam silną skłonność do prostych rozwiązań. Z drugiej strony, jeśli brakuje jakiejś funkcji, będę płakać z powodu jej zbytniej ograniczenia. :) Rozwiązania typu „wskaż i kliknij” są również mile widziane. Jestem również do rekomendacji produktów komercyjnych, które mogą współpracować z projektami PHP.

Moja konfiguracja

Pracuję lokalnie w systemie Windows (a dokładniej 7) i większość projektów klienckich jest uruchamiana na stosie LAMP, często na hostingu współdzielonym (= brak zdalnego SSH). Szukam rozwiązań, które mogę uruchomić we własnym środowisku. Jestem gotowy do skonfigurowania maszyny wirtualnej z systemem Linux do tego celu, nie ma problemu. Rozwiązania hostowane są dla mnie interesujące tylko wtedy, gdy zapewniają wszystkie opisane aspekty lub są wystarczająco elastyczne, aby współdziałać z innymi częściami procesu.

Bounty Przyjmuję odpowiedź, która według mnie da mi największy przebieg. Jest tu wiele doskonałych informacji, chciałbym zaakceptować więcej niż jedną odpowiedź. Dziękuję wszystkim!

Pekka 웃
źródło

Odpowiedzi:

76

Przeszedłem przez buildbot , CruiseControl.net , CruiseControl i Hudson . Mimo że naprawdę podobało mi się CruiseControl *, było to po prostu zbyt kłopotliwe z bardzo złożonymi przypadkami zależności. buildbot nie jest łatwy do skonfigurowania, ale ma ładną aurę (lubię python, to wszystko). Ale Hudson wygrał z poprzednimi trzema, ponieważ:

  1. Jest po prostu łatwy w konfiguracji
  2. Łatwo go dostosować
  3. Wygląda dobrze i ma ładną funkcjonalność
  4. Otrzymał aktualizacje typu „wskaż i kliknij” dla siebie i wszystkich zainstalowanych wtyczek. To naprawdę fajna funkcja, którą doceniam coraz bardziej

Zastrzeżenie: Zawsze używałem Linuksa jako podstawy dla wyżej wymienionych serwerów kompilacji (CC.net działał na mono ), ale wszystkie powinny - zgodnie z dokumentami - działać na różnych platformach.

Konfigurowanie serwera Hudson

Wymagania wstępne:

  • Java (1.5 będzie Ci dobrze służyć)
  • Dostęp do odczytu do serwera subversion (mam osobne konto dla użytkownika Hudson)

Odtąd jest to po prostu:

java -jar hudson.war

Spowoduje to uruchomienie małej instancji serwera bezpośrednio z konsoli i powinieneś móc przeglądać instalację na swoim http://localhost:8080, jeśli nie masz nic innego uruchomionego wcześniej na tym porcie (możesz określić inny port, przekazując--httpPort=ANOTHER_HTTP_PORT opcję do powyżej polecenia) i wszystko poszło dobrze w procesie „instalacji”.

Jeśli przejdziesz do dostępnego katalogu wtyczek ( http://localhost:8080/pluginManager/available), znajdziesz wtyczki do obsługi wyżej wymienionych zadań (obsługa Subversion jest domyślnie instalowana).

Jeśli to cię zaostrzy, powinieneś zainstalować serwer aplikacji Java, taki jak tomcat lub jetty . Instrukcje instalacji są dostępne dla wszystkich głównych serwerów aplikacji

Aktualizacja : Kohsuke Kawaguchi skonstruował instalator usługi Windows dla Hudson

Utworzenie projektu w Hudson

Łącza w poniższej instrukcji zakładają działającą instancję Hudsona zlokalizowaną na http://localhost:8080

  1. Wybierz nowe zadanie ( http://localhost:8080/view/All/newJob) z menu po lewej stronie
  2. Nadaj nazwę pracy i zaznacz Build a free-style software projectna liście
  3. Naciśnięcie przycisku „ok” spowoduje przejście do strony konfiguracji zadania. Wszystkie opcje mają oprócz nich mały znak zapytania. Naciśnięcie tego przycisku spowoduje wyświetlenie tekstu pomocy dotyczącego opcji.
  4. W grupie opcji „Zarządzanie kodami źródłowymi” korzystasz z Subversion. Hudson akceptuje zarówno dostęp do adresu URL, jak i dostęp do modułu lokalnego
  5. W grupie opcji „Buduj wyzwalacze” użyjesz „Ankiety SCM”. Zastosowana tutaj składnia to cron, więc odpytywanie repozytorium subversion będzie co 5 minut*/5 * * * *
  6. Proces budowania projektu jest określony w grupie opcji „Kompiluj”. Jeśli masz już plik kompilacji mrówki ze wszystkimi potrzebnymi celami, masz szczęście. Po prostu wybierz „Wywołaj mrówkę” i wpisz nazwę celu. Grupa opcji obsługuje również polecenia maven i powłoki, ale dostępna jest również wtyczka do phing .
  7. Zaznacz dodatkowe akcje kompilacji w „Akcjach po kompilacji”, takie jak powiadomienia e-mail lub archiwizacja artefaktów kompilacji.

Aby skonfigurować procesy, dla których Hudson nie ma wtyczek, możesz albo wywołać je bezpośrednio za pomocą skryptu powłoki z poziomu kompilacji, albo możesz napisać własną wtyczkę

Pułapki:

  • Jeśli masz przy sobie artefakty budowania, pamiętaj, aby Hudson sprzątał po sobie w regularnych odstępach czasu.
  • Jeśli masz skonfigurowanych ponad 20 projektów, nie wyświetlaj statusu ich kompilacji jako domyślnej strony głównej w Hudson

Powodzenia!

Steen
źródło
2
Myślę, że wystąpił błąd w składni crona. Trwałoby to w piątej minucie każdej godziny. Jeśli chcesz sondować repozytorium co 5 minut, musisz użyć * / 5
Brian Wigginton
2
@BrianWigginton: masz całkowitą rację. Próbowałem nawet poprawić post, ale nie mogę go zapisać, ponieważ mam „odwołanie do niepoprawnej nazwy hosta”, a mianowicie „localhost”. Mam nadzieję, że ludzie patrzą tutaj na korekty.
Steen,
22

Termin, którego szukasz, to „ciągła integracja”.

Oto przykład osoby korzystającej z GIT + phpundercontrol: http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

CruiseControl (który jest serwerem CI), może używać Hosted SVN / GIT jako źródła. Możesz więc używać go nawet z GitHub, Beanstalk lub czymś innym.

Następnie możesz zintegrować to z następującym oprogramowaniem:

  • PHPUnit
  • php-codeniffffer
  • phpdocumentor
  • PHP Gcov
  • PHPXref
  • Yasca
  • itp.

Możesz również spróbować tego hostowanego CI: http://www.php-ci.net/hosting/create-project

Pamiętaj jednak, że narzędzia te wymagają niestandardowego wsparcia, jeśli sam je zintegrujesz.

Czy myślałeś również o zarządzaniu projektami i zarządzaniu łatkami?

Możesz użyć Redmine do zarządzania projektami. Ma zintegrowaną obsługę ciągłej integracji, ale tylko po stronie klienta (nie jako serwer CI).

Spróbuj użyć hostowanego SVN / GIT / etc. rozwiązanie, ponieważ będą one obejmować kopie zapasowe i utrzymywać serwery w ruchu, dzięki czemu można skupić się na programowaniu.

Samouczek dotyczący konfiguracji Hudsona znajduje się na stronie: http://toptopic.wordpress.com/2009/02/26/php-and-hudson/

Michiel
źródło
2
Dzięki za link. Mam nadzieję, że produkty, które znam, to więcej wskazówek w stylu samouczka, takich jak ten, który dostarczyłeś.
Pekka
Cześć, czy od października 2012 r. Php-ci.net nie działa lub został już wycofany z usługi? Nie mogę się połączyć z tym adresem, ani nie mogę znaleźć nowych informacji z ubiegłego roku.
Ryan
@ Ryan, nie wiem co się stało. Wiem, że możesz spróbować innych. Może mógłbyś spróbować: CircleCI lub sprawdzić ten temat: Hosted Continuous Integration for PHP?
Michiel
@ Ryan, nie, to nie w dół, używam tego od jakiegoś czasu. Przeprowadzili się do phptesting.org
omrakhur
6

Korzystam z serwera ciągłej integracji Bamboo Atlassian do mojego głównego projektu PHP (wraz z ich innymi produktami, takimi jak rybie oko (przeglądanie repozytoriów), jira (tracker problemów) i koniczyna (pokrycie kodu)).

Obsługuje SVN, a teraz obsługuje Git i ma świetny interfejs użytkownika. Jest dostępny dla systemów Linux, Windows i Mac i może działać autonomicznie na własnym serwerze tomcat, co jest idealne dla osób (takich jak ja), które nie lubią poświęcać dni na konfigurowanie swoich narzędzi). Chociaż może się to wydawać drogie, będąc samodzielnym programistą, kupiłem licencję zestawu startowego za 10 USD (10 USD według oprogramowania). Jest to idealne rozwiązanie dla małych zespołów i warto je zobaczyć.

Steven Rosato
źródło
Jak skonfigurować bambusa, aby obsługiwał phing? Obecnie używam mrówki, ale wydaje się, że phing jest bardziej odpowiedni do depooymentu php. Dzięki
Vincent
5

PHPTesting PHPCI Jest to miły, ciągły serwer integracyjny zbudowany w php.

Plus, to darmowe i otwarte oprogramowanie. :)

ma liczbę wtyczek ..

PHPCI zawiera wtyczki integracyjne dla:

  • Atoum
  • Behat
  • Ognisko
  • Kodecepcja
  • Kompozytor
  • E-mail
  • Chrząknięcie
  • IRC
  • PHP
  • Szarpie
  • MySQL
  • PD zalezy
  • PostgreSQL
  • Sniffer kodu PHP
  • Detektor kopiowania / wklejania PHP
  • Specyfikacja PHP
  • Jednostka PHP
  • Polecenia powłoki
  • Tar / Zip
MarmiK
źródło
Chociaż lubię PHPCI, nie polecam tego. Jest niesamowicie wadliwy i zawodny. To smutne, że wspólna podstawowa funkcjonalność nie jest odpowiednio testowana jednostkowo, więc podstawowa rzecz, taka jak dodanie adresu URL projektu, jest trudna bez bałaganu.
Tek
@Tek, jaka jest twoja strategia CI dla PHP?
omrakhur
1
@ omrakhur Niestety utknąłem z PHPCI. Całe pozostałe oprogramowanie jest o wiele bardziej nieporęczne i zajmuje dużo czasu. Wszystko ma swoje zalety i wady. Musisz tylko wybrać to, co dla ciebie najlepsze.
Tek
3

Jestem głównie administratorem systemu, ale czasami również koduję PHP. W ramach pobocznego projektu stworzyłem kilka skryptów, które ułatwią i bezboleśnie skonfigurują pełne środowisko PHP CI za pomocą Jenkinsa. Uruchamia również przykładowy projekt, dzięki czemu można zobaczyć, jak skonfigurowany jest każdy krok kompilacji.

Jeśli chcesz to wypróbować, wszystko czego potrzebujesz to Debian / Ubuntu i dostęp do powłoki.

http://yauh.de/articles/379/setting-up-a-ci-environment-for-php-projects-using-jenkins-ci

Aktualizacja Aby dodać trochę treści do mojej odpowiedzi:

Możesz po prostu skonfigurować Jenkins CI dla PHP za pomocą Ansible. Od wersji 1.4 obsługuje role, które można pobrać z ich strony społecznościowej galaxy.ansibleworks.com i wykona za Ciebie ciężkie prace. Nazywa się jenkins-php .

Stephan
źródło
3

Sugerowałbym użycie Jenkins http://jenkins-ci.org/ jest bezpłatny i jest open source.

Jest dość prosty w konfiguracji, działa na wielu platformach i dobrze integruje się z innymi narzędziami ciągłej integracji, takimi jak SonarQube (+ SQUALE) do pomiaru zadłużenia technicznego i Thucydides do testowania automatyzacji.

Zdecydowanie sugeruję użycie GIT lub GIT Hub do kontroli wersji zamiast SVN. Z mojego punktu widzenia jest to po prostu lepszy system kontroli wersji, który pomoże Ci później skalować wysiłki programistyczne.

Ponieważ pracujesz głównie przy projekcie PHP, możesz użyć innych narzędzi.

PHPUnit - Do testowania jednostkowego

PHP CodeSniffer - Sprawdź standardy kodowania

PHP Depend - pokazuje zależności kodu PHP

XDEBUG - do testowania wydajności

Wszystkie te narzędzia są uruchamiane przez zadanie Jenkins i pomagają w jakości i wydajności kodu.

Powodzenia i ciesz się!

AgileDeveloper
źródło
3

Nie używam wielu produktów, a nawet rodzajów produktów, z których korzystasz, ale dam ci moje doświadczenie.

Pracuję w środowisku TEST równolegle z moim środowiskiem PROD. Nie mam lokalnych testów jako takich. Jeśli zbyt trudno jest dostać się do prawdziwego środowiska TEST, to naprawiam proces kompilacji. Nie widzę sensu w testowaniu lokalnym, ponieważ środowiska są różne. AKTUALIZACJA: Jedyne, co robię lokalnie, to uruchamianie „php -l” przed przesłaniem czegokolwiek. Zatrzymuje głupie błędy.

Proces kompilacji działa z wszystkim, co znajduje się w bieżącym obszarze roboczym, w tym z niezatwierdzonym kodem. To nie jest filiżanka herbaty dla wszystkich, ale często chodzę na TEST. Wszystko zobowiązuje się przed przejściem do PROD.

Część mojego procesu kompilacji (podobnego do twojego) tworzy dwa pliki META. Jedna zawiera ostatnie (zwykle) 100 zmian, a także podaje mi aktualny numer listy zmian. Pokazuje mi, jakie zmiany zostały zainstalowane. Drugi zawiera CLIENTSPEC (w kategoriach Perforce), który pokazuje mi dokładnie, jakie gałęzie zostały użyte w tej kompilacji. Razem dają mi powtarzalne kompilacje.

Nie buduję bezpośrednio do środowiska docelowego, ale do obszaru pomostowego na serwerze. Używam SSH, więc ma to sens. To daje mi kilka zalet. Co najważniejsze, pozwala uniknąć śmierci w połowie dużego przesyłania. Daje mi również miejsce do przechowywania plików META, a wszystkie pliki kompilacji są automatycznie archiwizowane (dzięki czemu mogę wrócić do dowolnej kompilacji). Skrypt rejestruje również aktualizację (więc w strumieniu dziennika znajduje się wpis i widzę pre- i post-) i uruchamia wszystkie demony (używam daemontools, więc „svc -t”). Wszystkim tym lepiej na maszynie docelowej.

Innym problemem są zmiany DB. Prowadzę skrypt główny schematu DB, który aktualizuję przy każdej zmianie schematu. Każda ze zmian przechodzi również do skryptu zmiany.sql, który jest przesyłany wraz z kompilacją do obszaru pomostowego. Skrypt jest uruchamiany jako część skryptu instalacyjnego.

Phil Wallach
źródło
Dzięki za wkład, Phil, to bardzo, bardzo interesująca konfiguracja i myślę, że mogę użyć jej części. W moim przypadku jednak bardzo często nie mam dostępu SSH do zdalnego końca, więc potrzebuję dużo „inteligencji” lokalnie, dlatego myślę, że będę potrzebował produktu CI takiego jak Hudson.
Pekka
2

Mam od niedawna ten sam rodzaj procesu, a używam beanstalk dla svn hosting.

Na płatnych kontach są dwie fajne funkcje (myślę, że zaczynają się od 15 USD):

  • Wdrożenie pozwala użytkownikowi tworzyć cele FTP dla serwerów pomostowych i produkcyjnych, które można wdrożyć jednym kliknięciem (w tym zmianę wersji i gałęzi)
  • webhooki pozwalają użytkownikowi ustawić adres URL, który jest wywoływany przy każdym zatwierdzeniu / wdrożeniu, przekazując między innymi numer wersji, opis i użytkownika. Można to wykorzystać do aktualizacji dokumentów, uruchamiania testów jednostkowych i aktualizacji dzienników zmian.

Jestem pewien, że istnieją inne hostowane lub samoobsługowe serwery SVN z tymi dwiema funkcjami, ale mam doświadczenie z Beanstalk i działa bardzo, bardzo dobrze

Istnieje również interfejs API, który, jak sądzę, mógłby zostać wykorzystany do zintegrowania wdrażania dalej w twoim procesie.

Adam Hopkinson
źródło
Pozdrawiam @adam. Nie szukam w tym względzie usług hostowanych, ponieważ obawiam się, że będą one zawsze zbyt ograniczone w stosunku do tego, czego potrzebuję. Ale to, co mówisz, brzmi interesująco, a API może być punktem łączącym resztę. Spojrzę na to.
Pekka
Bez obaw, pomyślałbyś, że możesz tak powiedzieć. Na razie mi to odpowiada, ponieważ nie do końca rozumiem svn (i jestem jednoosobową drużyną), a ponadto oferują pełny eksport repo, jeśli chcesz się przenieść.
Adam Hopkinson
2

Rozważ fazend.com , darmową platformę CI hostowaną, która automatyzuje procedury konfiguracji i instalacji. Nie musisz konfigurować kontroli wersji, śledzenia błędów, serwera CI, środowiska testowego itp. Wszystko odbywa się na żądanie.

yegor256
źródło
Mmm, to wygląda bardzo interesująco! Ale jak przetrwają? Czy wszystko jest za darmo? Jak płacą za serwer i opłaty E3?
Pekka
@Pekka Ten projekt jest sponsorowany przez firmę opracowującą oprogramowanie, dlatego usługa jest bezpłatna
yegor256,