2013-08-12 10 views
12

pytanie: co jest najlepszym rozwiązaniem dla wykonywania „mvn wdrożyć”, tak że część Deploy jest uruchamiany dopiero po wykonaniu wszystkich testów jednostkowych uda i żadne etapy przetwarzania są duplikowane?Maven wielomodułowy wdrożyć do repozytorium dopiero po udanej jednostki testuje

Miałem nadzieję, że prosta odpowiedź brzmi: Wykonaj polecenie maven "x" (lub użyj flagi) w taki sposób, że wdrożenie można uruchomić bez wywoływania wcześniejszych celów w domyślnym cyklu życia.

Niestety wygląda na to, że nie ma prostej odpowiedzi. Podałem szczegóły na ścieżce, którą podążyłem do tej pory.

Mamy trzy następujące wymagania:

  • Execute maven wdrożyć cel, aby wdrożyć wszystkie artefakty wielomodułowego do zdalnego repozytorium.
  • Wdrażaj, jeśli wszystkie testy jednostkowe we wszystkich projektach są zaliczane.
  • Nie powtarzaj żadnego przetwarzania.

Zaczęliśmy po prostu „mvn czystej deploy”, jednak zauważyliśmy kilka kwestii:

  • kompilacja zatrzyma się przed zakończeniem wszystkie testy jednostkowe :: więc dodaliśmy --fail-AT- flaga końcowa
  • Cel wdrożenia zostałby wykonany względem modułów, które się powiodły.

Wynika to w „uszkodzony” w stanie, w którym pilot repozytorium może ma tylko częściową rozmieszczenia (jeśli były moduły awarii później w produkcji).

Patrzyliśmy na 3 różne rozwiązania:

  1. inscenizacja artefakty przed wdrożeniem :: ten określono na zbyt ciężkie dla w pełni zautomatyzowanego procesu.
  2. Użyj profilu, aby zastąpić domyślny cykl życia, tak aby "mvn deploy -Pci-deploy" działał bez wywoływania jakichkolwiek wcześniejszych celów :: działało i było szybkie, ale jest oczywiście niekonwencjonalne.
  3. prostu działa „mvn czyste pakietowe”, a następnie tylko wtedy i tylko wtedy sukces Uruchom „mvn wdrożyć” :: wydaje się pracować i wydaje się tylko wziąć hitem, gdy cele są wywoływane (choć niektóre z nich są na tyle mądry, by nie przerabiają niezmienione roboczy)

stawiam to pytanie do społeczności ze szczegółami tła mam przewidzianych w celu ustalenia, czy istnieje lepsze podejście lub silna opinia na temat (potencjalnie) dokonanie jednego z następujących wniosków:

  • Nowy cel wdrożenia, który może działać oddzielnie i niezależnie od wszystkich innych celów związanych z cyklem życia z oczekiwaniami że: wszystkie wcześniejsze kroki zostały już uruchomione i że będą wdrażać identyczne wdrożenie do "mvn deploy"
  • flagę w celu wdrożenia, która skutecznie wyłącza poprzednie cele.

trochę bardziej po wyjęciu z pudełka i zdecydowanie przeciwko obecnej konwencji:

  • flagę że powie Maven uruchomić [jednostka] cel testu dla wszystkich modułów przed kontynuowaniem.

Uwagi:

  • Używamy Jenkins, ale dla celów tego pytania środowisko CI nie jest powikłaniem.
  • Próbowałem wprowadzić cel "mvn deploy: deploy", ale miał on wiele niejasnych błędów.
  • Nie rozważałem testów integracyjnych jako części wymagań.

Aktualizacja 8/20/2013

testowałem odroczony wtyczki wdrożyć i ustalił, że narzędzie działa zgodnie z oczekiwaniami, ale zajęło sposób na długo.

Dla naszej bazie kodu:

  • mvn czystej deploy: dla wszystkich celów zawartych w 2:44
  • mvn clean install 'odroczone-wdrożyć-plugin': na wszystkie cele realizowane w 15 min
  • pakiet mvn clean; mvn wdrożyć -Pci wdrożeniu własnego profilu kompilacji, który wyłącza wcześniejsze cele realizowane:
    • dla wszystkich celów (w tym wdrożeniu): 4:30
    • wdrożyć tylko: 1:45
  • mvn czyste pakiet; mvn wdrożyć -Dmaven.test.skip = true na tym samym obszarze roboczym wykonane:
    • dla wszystkich celów (w tym wdrożeniu): Tylko 4:40
    • Deploy: 1:54

Pakiet clean, po którym następuje wdrażanie pomijania testów, działa szybciej niż opóźnione wdrożenie i spełnił nasze pragnienie opóźnienia wdrożenia do momentu pomyślnego zakończenia testów.

Wygląda na to, że ma miejsce drobny przypadek czasu, gdy cykl życia wdrożenia jest wykonywany i kończy się każdy z poprzednich celów (proces, kompilacja, test, pakiet itp.). Jednak jedyną alternatywą jest zhackowanie niestandardowego wykonania, które oszczędza tylko 10 sekund.

Odpowiedz

27

Jest teraz nowa odpowiedź. Od wersji 2.8 wtyczki wdrożyć maven można to zrobić "natywnie". Aby uzyskać szczegółowe informacje, patrz: the jira issue.

Zasadniczo trzeba zmusić co najmniej v2.8 wtyczki

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-deploy-plugin</artifactId> 
    <version>2.8</version> 
</plugin> 

i użyć nowego parametru deployAtEnd. więcej informacji here. To ustawienie zwykle idzie w parze z installAtEnd wtyczki maven-install-

+0

Po ukończeniu sprawdzę i zaktualizuję odpowiedź. Dziękuję za odpowiedź! – Jared

+1

Do tej pory wspomniany problem został przeniesiony do https://issues.apache.org/jira/browse/MDEPLOY-157 –

+0

poprawiony. Dziękuję Ci – Hilikus

1

Dwie rzeczy.

  1. Wyłączenie wszystkich poprzednich faz nie jest dostępne jako opcja.Jest to podstawowa cecha maven, zmienisz standardowy cykl życia, więc wątpię, by ktokolwiek zaimplementował coś w wtyczce, aby umożliwić to.
  2. Odkąd mówisz, że używasz Jenkinsa, jest ustawienie w jenkins specjalnie dla przypadku wdrażania na końcu, aby zagwarantować, że nie ma w repo uszkodzony/stanu pośredniego

w „post-zbudować działania”

wdrożyć artefakty do repozytorium Maven. W porównaniu ze standardowym wdrożeniem mvn , ta funkcja umożliwia rozmieszczanie artefaktów po , co potwierdza, że ​​cała kompilacja zakończyła się pomyślnie. Zapobiega to typowemu problemowi w Maven, gdzie niektóre moduły są wdrażane, zanim krytyczna awaria zostanie wykryta w późniejszym czasie, powoduje niespójność stanu repozytorium. Należy pamiętać, że niezależnie od tej konfiguracji, zawsze możesz ręcznie wrócić do Jenkins i wdrożyć dowolne z ostatnich artefaktów do dowolnego repozytorium, po tym fakcie. Aby korzystać z tej funkcji, nie należy dezaktywować automatycznej archiwizacji artefaktów.

Nigdy nie używałem tego, więc nie mogę potwierdzić, czy to działa, po prostu wiem, że to nie dla tego konkretnego użytkowej przypadku

+0

Dzięki! Świetna rekomendacja. Pochylam się od konfiguracji Jenkinsa, ponieważ próbujemy zawrzeć wszystkie ustawienia w pom. – Jared

2

Jako alternatywa, ja również znaleźć ten http://code.google.com/p/maven-deferred-deploy-plugin/

Wtyczka maven iteruje przez wszystkie projekty w reaktorze, a wykonuje wdrożenie na każdym projekcie indywidualnie. Może być użyty do wyprodukowania pobliskiej konstrukcji atomowej reaktora przez opóźnienie wdrożenia artefaktu do zakończenia fazy instalacji.

Brzmi tak, jak prosiłeś. Nadal uważam, że moja druga odpowiedź jest łatwiejsza do wdrożenia, ponieważ używasz jenkins, po prostu zaznacz pole wyboru

+1

Zbadam to rozwiązanie. Brzmi dokładnie tak, jak chcę. Dla innych czytających to, zaznaczam tę odpowiedź jako odpowiedź, ponieważ odpowiada na moje pytanie. Możesz jednak przewinąć w dół i przejrzeć wcześniejszą odpowiedź, w której odnotowano użycie akcji Jenkins Post Build. – Jared

+0

Kontynuacja: wydaje się, że ta wtyczka musi zostać uruchomiona natychmiast po instalacji (mvn clean install org.apache.maven.plugins: maven-deferred-deploy-plugin: deploy :: SUCCESS), nie można wykonać celu wtyczki w izolacji (mvn org.apache.maven.plugins: maven-deferred-deploy-plugin: deploy :: FAILURE) – Jared

+0

jeśli dołączasz go do fazy instalacji, to nie działa? – Hilikus

Powiązane problemy