W przeciwieństwie do innych, myślę, że istnieje wiele powodów, dla których zawsze możesz chcieć najnowszej wersji. Zwłaszcza jeśli wykonujesz ciągłe wdrażanie (czasami mamy około 5 wydań dziennie) i nie chcesz wykonywać projektu wielomodułowego.
To, co robię, polega na tym, aby Hudson / Jenkins wykonał następujące czynności dla każdej kompilacji:
mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true
To znaczy używam wtyczki wersji i wtyczki scm do aktualizacji zależności, a następnie rejestruję ją w celu kontroli źródła. Tak, pozwalam CI na sprawdzanie SCM (co i tak musisz zrobić dla wtyczki maven release).
Będziesz chciał skonfigurować wtyczkę wersji, aby aktualizowała tylko to, co chcesz:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>1.2</version>
<configuration>
<includesList>com.snaphop</includesList>
<generateBackupPoms>false</generateBackupPoms>
<allowSnapshots>true</allowSnapshots>
</configuration>
</plugin>
Używam wtyczki wydania, aby wykonać wydanie, które zajmuje się -SNAPSHOT i sprawdza, czy istnieje wersja -SNAPSHOT (co jest ważne).
Jeśli zrobisz to, co ja, otrzymasz najnowszą wersję dla wszystkich kompilacji migawek i najnowszą wersję dla kompilacji wersji. Twoje kompilacje będą również odtwarzalne.
Aktualizacja
Zauważyłem kilka komentarzy z pytaniem o specyfikę tego przepływu pracy. Powiem, że nie używamy już tej metody i główny powód, dla którego wtyczka wersji maven jest wadliwa i ogólnie jest wadliwa.
Jest wadliwy, ponieważ aby uruchomić wtyczkę wersji w celu dostosowania wersji, wszystkie istniejące wersje muszą istnieć, aby pom działał poprawnie. Oznacza to, że wtyczka wersji nie może zaktualizować się do najnowszej wersji czegokolwiek, jeśli nie może znaleźć wersji wymienionej w pom. Jest to w rzeczywistości dość denerwujące, ponieważ często usuwamy stare wersje ze względu na miejsce na dysku.
Naprawdę potrzebujesz oddzielnego narzędzia od maven, aby dostosować wersje (więc nie zależy od poprawnego działania pliku pom). Napisałem takie narzędzie w skromnym języku, jakim jest Bash. Skrypt zaktualizuje wersje takie jak wtyczka wersji i sprawdzi pom ponownie kontrolę źródła. Działa również 100 razy szybciej niż wtyczka wersji mvn. Niestety nie jest napisany w sposób do użytku publicznego, ale jeśli ludzie są zainteresowani, mógłbym to zrobić i umieścić to w gistubie lub githubie.
Wracając do przepływu pracy, ponieważ niektóre komentarze pytały o to, co robimy:
- Mamy około 20 projektów w ich własnych repozytoriach z własnymi zadaniami Jenkinsa
- Po wydaniu używana jest wtyczka maven release. Przepływ pracy jest opisany w dokumentacji wtyczki. Wtyczka maven wydaje się do bani (a ja jestem uprzejma), ale działa. Pewnego dnia planujemy zastąpić tę metodę czymś bardziej optymalnym.
- Kiedy jeden z projektów zostanie wydany, Jenkins następnie uruchomi specjalne zadanie, nazwiemy aktualizację zadaniem wszystkich wersji (skąd Jenkins wie, że wydanie jest skomplikowane, częściowo dlatego, że wtyczka maven jenkins wydaje się dość gówniana).
- Zadanie aktualizacji wszystkich wersji wie o wszystkich 20 projektach. W rzeczywistości jest to agregator pom, który jest specyficzny dla wszystkich projektów w sekcji modułów w kolejności zależności. Jenkins uruchamia nasz magiczny groovy / bash foo, który ściągnie wszystkie projekty, zaktualizuje wersje do najnowszej wersji, a następnie sprawdzi poms (ponownie wykonane w kolejności zależności na podstawie sekcji modułów).
- Dla każdego projektu, jeśli pom zmienił się (z powodu zmiany wersji w pewnej zależności), jest on rejestrowany, a następnie natychmiast pingujemy jenkins, aby uruchomić odpowiednie zadanie dla tego projektu (ma to na celu zachowanie kolejności zależności kompilacji, w przeciwnym razie jesteś na łasce harmonogramu odpytywania SCM).
W tym momencie uważam, że dobrze jest, aby wydanie i wersja automatyczna były odrębnym narzędziem od ogólnej wersji.
Teraz myślisz Maven rodzaju bani z powodu wyżej wymienionych problemów, ale to faktycznie byłoby dość trudne z narzędziem budowy, który nie posiada deklaratywny łatwe do analizowania wysuwaną składni XML (aka).
W rzeczywistości dodajemy niestandardowe atrybuty XML poprzez przestrzenie nazw, aby pomóc podpowiedzieć skryptom bash / groovy (np. Nie aktualizuj tej wersji).