Lubię myśleć, że tam są dwie przestrzenie problem:
artefakty budynek (idealnie środowiskowych agnostykiem jako że oznacza QA może hash artefaktu, prowadzą swoje badania na ten artefakt i jeśli chodzi czas na wdrożenie, sprawdzenie popiołu i wiesz, że to była kontrola jakości. Jeśli twoja kompilacja generuje różne artefakty w zależności od tego, czy w przypadku env lub env w etapie kontroli jakości, czy w env produkcji, musisz wykonać więcej pracy, aby zapewnić artefakt do produkcji został przetestowany przez QA i wystawiony na inscenizację)
wysyłka artefaktów do n środowisko.Tam, gdzie to środowisko wymaga konfiguracji artefaktów, proces wysyłki powinien uwzględniać tę konfigurację, poprzez umieszczenie odpowiednich plików konfiguracyjnych w docelowym środowisku i zezwolenie artefaktom na pobranie ich lub pęknięcie otwartych artefaktów, skonfigurowanie ich i zamknięcie. (ale w sposób powtarzalny i deterministyczny)
Maven jest przeznaczony do pierwszej przestrzeni problemowej. "Droga Maven" polega na tworzeniu agnostycznych artefaktów i publikowaniu ich w binarnym magazynie artefaktów. Jeśli spojrzysz na cykle życia Maven, zobaczysz, że fazy zatrzymują się po tym, jak artefakt zostanie przetransferowany do repozytorium Maven (binarnego magazynu artefaktów). W skrócie, Maven widzi swoją pracę jako wykonaną w tym momencie. Ponadto istnieją fazy cyklu życia dla jednostki test
ing i integration-test
, z których oba powinny być możliwe z artefaktem agnostycznym środowiska, ale to nie jest pełny zestaw testów, których potrzebujesz ... Zamiast wykonywać testy, będziesz musiał w rzeczywistości rozmieść utworzone artefakty w środowisku rzeczywistym.
Wiele osób próbuje porwać Mavena, aby przekroczyć jego cel (łącznie ze mną). Na przykład masz cargo-maven-plugin
i ship-maven-plugin
, które dotykają aspektów wykraczających poza grę mavenów (np. Po tym, jak artefakt trafi do repozytorium maven). Spośród nich osobiście uważam, że ship-maven-plugin
(który napisałem, hency mój poprzedni "mnie wliczony") jest najbliżej używać "po maven", ponieważ domyślnie jest przeznaczony do pracy, a nie na wersji -SNAPSHOT
projektu, który Sprawdziłem na dysku, ale raczej na wydanej wersji tego samego projektu, że ciągnie ze zdalnego repozytorium, np
mvn ship:ship -DshipVersion=2.5.1
IMO, ładunek skierowany jest do użytku na całym fazy w cyklu życia integration-test
, ale znowu możesz go przejąć do innych celów.
Jeśli produkuje się oprogramowanie opakowane w folię termokurczliwą, tj. Takie, jakie użytkownik kupuje i instaluje w swoim systemie, sam program instalacyjny jest przeznaczony do skonfigurowania aplikacji dla środowiska użytkowników końcowych. Dobrze jest mieć kompilację Mavena, która produkuje instalator, ponieważ rzeczywisty instalator jest (przynajmniej w pewnym stopniu) agnostykiem środowiska. Ok, może to być instalator tylko dla systemu Microsoft Windows lub instalator tylko dla systemu Linux, ale nie dba o to, którzy użytkownicy będą go używać.
W dzisiejszych czasach koncentrujemy się raczej na oprogramowaniu jako usłudze, dlatego wdrażamy je na serwerach, które kontrolujemy. Bardziej kuszące jest ciągnięcie do "ciemnej strony Mavena", gdzie profile budowania są wykorzystywane do poprawiania wewnętrznej konfiguracji artefaktów budowania (w końcu mamy tylko trzy środowiska, w których wdrażamy) i poruszamy się szybko, więc nie chcemy Poświęć trochę czasu, aby aplikacja podniosła konfigurację specyficzną dla środowiska z zewnętrznego do zbudowanego artefaktu (brzmi znajomo?). Powodem, dla którego nazywam to ciemną stroną, jest to, że naprawdę walczysz tak, jak maven chce pracować ... Zawsze zastanawiasz się, czy słoik w lokalnym repozytorium został zbudowany z innym profilem aktywnym, więc musisz skończyć z pełnym czyste buduje cały czas. Kiedy przychodzi czas na przejście z QA na inscenizację lub przejście do produkcji, musisz wykonać pełną kompilację oprogramowania ... A wszystkie testy urządzenia i integracji zostaną ponownie uruchomione (lub kończysz je pomijając skręcić pomijanie zdrowia, które mogą zapewnić na artefaktach, które budują), więc w efekcie sprawiasz, że życie staje się trudniejsze i bardziej skomplikowane ... Tylko po to, by umieścić kilka profili w maven pom.xml
... Pomyśl tylko, jeśli podążyłem za mavenem, po prostu wziąłeś artefakt z repozytorium i przesunąłeś go wzdłuż różnych środowisk, niezmodyfikowany, niezmieniony, oraz podpisami MD5, SHA1 (i miejmy nadzieję, GPG), aby udowodnić, że jest to ten sam artefakt.
Więc, pytasz, w jaki sposób kodujemy wysyłkę do produkcji ...
Istnieje wiele sposobów rozwiązania tego problemu. Wszystkie z nich dzielą podobny zestaw podstawowych zasad, a mianowicie
zachować przepis do wysyłki do środowiska w układzie sterowania źródłem
przepis powinien idealnie się z dwóch części, środowisko agnostyk strony, oraz część specyficzna dla środowiska.
Możesz użyć dobrych starych skryptów basha lub użyć bardziej "nowoczesnych" narzędzi, takich jak szef kuchni i lalek, zaprojektowanych dla tego drugiego problemu.
Zalecenia
Powinieneś używać odpowiedniego narzędzia do właściwej pracy.
Gdyby mnie, tutaj jest to, co chciałbym zrobić:
uwalnia Cut z Maven Release Plugin
Wbudowane artefakty powinny zawsze być środowisko agnostykiem.
Zbudowane artefakty powinny zawierać "domyślne wartości domyślne" dla wszystkich opcji konfiguracji. Innymi słowy, powinny szybko się wysadzić, jeśli nie ma wymaganej opcji konfiguracji bez rozsądnej wartości domyślnej lub powinny działać w rozsądny sposób, jeśli opcja opcjonalna jest nieokreślona. Przykładem wymaganą opcję konfiguracji może być dane do bazy danych (chyba że aplikacja jest szczęśliwy do biegu z DB w pamięci)
wybrać stronę w wojnie kucharz vs lalkowego (nie ma znaczenia, która strona Jeśli masz i nastawisz się na ANT, szef może ci lepiej odpowiadać, jeśli lubisz magię zarządzania uzależnieniami, kukiełka może ci pasować)
Deweloperzy powinni mieć prawo głosu w definiowaniu szefa kuchni/skrypty lalkowe do wdrożenia, przynajmniej agnostyczna część tych skryptów.
Operations powinna określić szczegółowe dane środowisko produkcyjne rozmieszczania kucharz/lalkowego
trzymać te wszystkie skrypty w SCM.
Użyj Jenkinsa lub dowolnego CI, aby zautomatyzować jak najwięcej kroków. Promowana kompilacja wtyczki dla Jenkinsa jest twoim przyjacielem.
Twoją końcową grą jest to, że każde zatwierdzenie, pod warunkiem, że przejdzie wszystkie wymagane testy, * może * zostać automatycznie wdrożone do produkcji (lub może z bramą osoby mówiącej "śmiało") ... nie należy mówić że faktycznie robisz to dla każdego zatwierdzenia, tylko, że mógłbyś
Myślę, że to pytanie byłoby lepiej dostosowane do http://programmers.stackexchange.com/ (chociaż może to być zbyt otwarte nawet dla tego teren). –
Proponuję użyć wtyczki do wydania Maven, co najpierw uprości sprawę i oczywiście pójdzie z rozwiązaniem CI (takim jak Jenkins), aby zautomatyzować te rzeczy. – khmarbaise
Zapoznaj się z https://github.com/sofdes/config-generation-maven-plugin, za pomocą którego możesz wygenerować konfigurację dla wszystkich środowisk w spójny sposób, a następnie wybrać odpowiedni katalog konfiguracyjny dla swojego środowiska. Dla config odczytać wszystkie pliki tekstowe - właściwości, ścieżki do właściwości, skrypty, wygenerowane skrypty względem wygenerowanych skryptów. Zasadniczo powinieneś być w stanie bootować całe środowiska używając spójnych plików, nawet jeśli te środowiska mają bardzo różne struktury katalogów (lub nawet systemy operacyjne). – user1016765