Ja i moja grupa jesteśmy horrendalni, jeśli chodzi o zwiększanie numerów wersji zestawu i często wysyłamy zestawy w wersjach 1.0.0.0. Oczywiście powoduje to wiele bólów głowy.
Nasze praktyki są coraz lepsze dzięki naszej platformie CI i naprawdę chciałbym ustawić automatyczne zwiększanie wartości w assemblyinfo.cs
pliku, tak aby wersje naszych zestawów były automatycznie aktualizowane wraz ze zmianami kodu w tym zestawie.
Wcześniej ustawiłem (zanim znaleźliśmy Hudson ) sposób na zwiększenie wartości za pomocą jednego z nichmsbuild
lub z linii poleceń (nie pamiętam), ale z Hudsonem, który zaktualizuje repozytorium SVN i uruchomi INNĄ kompilację. Spowodowałoby to powolną nieskończoną pętlę, gdy Hudson sonduje SVN co godzinę.
Czy zwiększenie numeru wersji przez Hudsona to zły pomysł? Jaki byłby inny sposób na zrobienie tego?
Idealnie byłoby, gdyby moje kryteria rozwiązania były takie, które:
- Zwiększa numer kompilacji
assemblyinfo.cs
przed kompilacją - Zwiększa numer kompilacji tylko w zmienionych zespołach. Może to nie być możliwe, ponieważ Hudson czyści folder projektu za każdym razem, gdy tworzy kompilację
- Zatwierdza zmieniony plik assemblyinfo.cs do repozytorium kodu (obecnie VisualSVN )
- Nie powoduje, że Hudson wyzwoli nową kompilację podczas następnego skanowania w poszukiwaniu zmian
Pracując nad tym w mojej głowie, mogłem łatwo znaleźć rozwiązanie większości tego problemu za pomocą plików wsadowych / poleceń, ale wszystkie moje pomysły spowodowałyby, że Hudson uruchomiłby nową kompilację przy następnym skanowaniu. Nie szukam kogoś, kto zrobi wszystko za mnie, po prostu wskaż mi właściwy kierunek, może technikę, która pozwoli Hudsonowi zignorować pewne zatwierdzenia SVN itp.
Wszystko, co do tej pory znalazłem, to tylko artykuł wyjaśniający, jak uzyskać automatyczne zwiększanie numeru wersji, nic nie bierze pod uwagę platformy CI, która mogłaby zostać spleciona w nieskończoną pętlę.
źródło
Oto, co zrobiłem, aby oznaczyć atrybut AssemblyFileVersion.
Usunięto AssemblyFileVersion z AssemblyInfo.cs
Dodaj nowy, pusty plik o nazwie AssemblyFileInfo.cs do projektu.
Zainstaluj zestaw narzędzi zadań społeczności MSBuild na maszynie kompilacji Hudson lub jako zależność NuGet w projekcie.
Edytuj plik projektu (csproj), to tylko plik msbuild i dodaj następujący plik.
Gdzieś będzie
<PropertyGroup>
podająca wersję. Zmień to tak, by czytało npHudson dostarcza te zmienne env, które widzisz tam, gdy projekt jest budowany w hudson (zakładając, że został pobrany z subversion).
U dołu pliku projektu dodaj
Używa MSBuildCommunityTasks do generowania AssemblyFileVersion.cs w celu uwzględnienia atrybutu AssemblyFileVersion przed skompilowaniem projektu. Jeśli chcesz, możesz to zrobić dla dowolnego / wszystkich atrybutów wersji.
W rezultacie za każdym razem, gdy wydasz kompilację hudson, otrzymany zestaw otrzyma AssemblyFileVersion 1.0.HUDSON_BUILD_NR.SVN_REVISION np. 1.0.6.2632, co oznacza szóstą kompilację # w hudson, zbudowaną z wersji 2632 Subversion.
źródło
Oto eleganckie rozwiązanie, które wymaga trochę pracy z góry podczas dodawania nowego projektu, ale bardzo łatwo obsługuje ten proces.
Pomysł polega na tym, że każdy projekt łączy się z plikiem rozwiązania, który zawiera tylko informacje o wersji zestawu. Tak więc proces kompilacji musi tylko zaktualizować jeden plik, a wszystkie wersje zespołu są pobierane z jednego pliku podczas kompilacji.
Kroki:
Po dodaniu pliku jako łącza zapisuje on dane w pliku projektu, a po kompilacji pobiera informacje o wersji zespołu z tego jednego pliku.
W kontroli źródła dodajesz plik bat lub plik skryptu, który po prostu zwiększa plik SharedAssemblyProperties.cs, a wszystkie projekty zaktualizują informacje o zespole z tego pliku.
źródło
Hudson można skonfigurować tak, aby ignorował zmiany w określonych ścieżkach i plikach, tak aby nie wyświetlał monitów o nową kompilację.
Na stronie konfiguracji zadania w obszarze Zarządzanie kodami źródłowymi kliknij przycisk Zaawansowane . W polu Wykluczone regiony należy wprowadzić co najmniej jedno wyrażenie regularne, aby dopasować wykluczenia.
Na przykład, aby zignorować zmiany w pliku version.properties , możesz użyć:
To zadziała dla języków innych niż C # i pozwoli ci przechowywać informacje o wersji w subversion.
źródło
.NET robi to za Ciebie. W pliku AssemblyInfo.cs ustaw wersję zestawu na major.minor. * (Na przykład: 1.0. *).
Podczas tworzenia projektu wersja jest generowana automatycznie.
Wydaje mi się, że numery kompilacji i wersji są generowane na podstawie daty, przy użyciu epoki systemu Unix. Kompilacja jest oparta na bieżącym dniu, a wersja na podstawie liczby sekund, które upłynęły od północy.
źródło
Nigdy nie widziałem, aby funkcja 1.0. * Działała w VS2005 lub VS2008. Czy jest coś, co należy zrobić, aby ustawić VS na zwiększanie wartości?
Jeśli AssemblyInfo.cs jest zakodowane na stałe w 1.0. *, To gdzie jest przechowywana rzeczywista kompilacja / wersja?
Po umieszczeniu 1.0. * W AssemblyInfo, nie możemy użyć następującej instrukcji, ponieważ ProductVersion ma teraz nieprawidłową wartość - używa 1.0. *, A nie wartości przypisanej przez VS:
Westchnienie - wydaje się, że to jedna z tych rzeczy, o które wszyscy pytają, ale jakoś nigdy nie ma solidnej odpowiedzi. Wiele lat temu widziałem rozwiązania do generowania numeru wersji i zapisywania go w AssemblyInfo jako część procesu po kompilacji. Miałem nadzieję, że ten rodzaj tańca nie będzie potrzebny w VS2008. Może VS2010?
źródło
Zakładam, że można to również zrobić za pomocą szablonu tekstowego, w którym tworzy się atrybuty zespołu w locie ze środowiska, tak jak poniżej AssemblyVersion.tt.
źródło
W ramach kontynuacji odpowiedzi MikeSa chciałem dodać, że aby to działało, należy zainstalować VS + Visual Studio Visualization and Modeling SDK, a także zmodyfikować plik projektu. Należy również wspomnieć, że używam Jenkinsa jako serwera kompilacji działającego na serwerze Windows 2008 R2 z modułem wersji, gdzie otrzymuję BUILD_NUMBER.
Plik mojego szablonu tekstowego version.tt wygląda następująco
W grupach właściwości mam następujące elementy
po zaimportowaniu Microsoft.CSharp.targets mam to (w zależności od tego, gdzie instalujesz VS
Na moim serwerze kompilacji mam następujący skrypt, aby uruchomić transformację tekstu przed rzeczywistą kompilacją, aby uzyskać ostatni numer zestawu zmian na TFS
W ten sposób mogę śledzić kompilacje ORAZ zestawy zmian, więc jeśli nic nie sprawdzałem od ostatniej kompilacji, ostatnia cyfra nie powinna się zmieniać, jednak mogłem dokonać zmian w procesie budowania, stąd potrzeba przedostatniej liczby . Oczywiście, jeśli wykonasz wiele zameldowań przed kompilacją, zobaczysz tylko ostatnią zmianę odzwierciedloną w wersji. Myślę, że można by to połączyć.
Jestem pewien, że możesz zrobić coś bardziej wyszukanego i zadzwonić do TFS bezpośrednio z szablonu tt, jednak to działa dla mnie.
Mogę wtedy pobrać moją wersję w takim czasie wykonywania
źródło
Moje rozwiązanie nie wymaga dodawania zewnętrznych narzędzi ani języków skryptowych - z dużym prawdopodobieństwem będzie działać na komputerze, na którym się kompiluję. Rozwiązuję ten problem w kilku częściach. Najpierw utworzyłem plik BUILD.BAT, który konwertuje parametr Jenkins BUILD_NUMBER na zmienną środowiskową. Używam funkcji „Wykonaj polecenie wsadowe systemu Windows” Jenkinsa, aby uruchomić plik wsadowy kompilacji, wprowadzając następujące informacje dotyczące kompilacji Jenkins:
W środowisku kompilacji mam plik build.bat, który zaczyna się w następujący sposób:
Gdy to zrobiłem, kliknąłem prawym przyciskiem myszy projekt do zbudowania w okienku Eksplorator rozwiązań programu Visual Studio i wybrałem Właściwości, wybierz opcję Zdarzenia kompilacji i wprowadziłem następujące informacje jako wiersz polecenia przed kompilacją zdarzenia, który automatycznie tworzy plik .cs zawierające informacje o numerze kompilacji na podstawie aktualnych ustawień zmiennych środowiskowych:
Może być konieczne dostosowanie się do gustu budowy. Raz buduję projekt ręcznie, aby wygenerować początkowy plik Version.cs w katalogu Właściwości głównego projektu. Na koniec ręcznie dołączam plik Version.cs do rozwiązania Visual Studio, przeciągając go do okienka Eksplorator rozwiązań poniżej karty Właściwości dla tego projektu. W przyszłych kompilacjach program Visual Studio odczytuje następnie ten plik .cs w czasie kompilacji Jenkins i pobiera z niego prawidłowe informacje o numerze kompilacji.
źródło
Mamy więc projekt z jednym rozwiązaniem, które zawiera kilka projektów, które mają zestawy o różnych numerach wersji.
Po zbadaniu kilku z powyższych metod właśnie zaimplementowałem krok kompilacji, aby uruchomić skrypt Powershell, który wykonuje wyszukiwanie i zamianę w pliku AssemblyInfo.cs. Nadal używam numeru wersji 1.0. * W kontroli źródła, a Jenkins po prostu ręcznie aktualizuje numer wersji przed uruchomieniem msbuild.
Dodałem opcję -Encoding "UTF8", ponieważ git zaczął traktować plik .cs jako pliki binarne, jeśli tego nie zrobiłem. To prawda, to nie miało znaczenia, ponieważ tak naprawdę nigdy nie popełniłem wyniku; po prostu wyszło, gdy testowałem.
Nasze środowisko CI ma już możliwość kojarzenia kompilacji Jenkinsa z konkretnym zatwierdzeniem git (dzięki wtyczce Stash!), Więc nie martwię się, że nie ma git commit z dołączonym numerem wersji.
źródło
To jest prostszy mechanizm. Wymaga to po prostu dodania kroku kompilacji zadania Windows Batch przed krokiem MSBuild i użycia prostego programu znajdź i zamień (FART).
Krok wsadowy
Jeśli używasz kontroli źródła innej niż svn, zmień opcję --svn na odpowiednią dla swojego środowiska scm.
Pobierz Fart
źródło
Zdecydowałem się użyć kilku metod przy użyciu wstępnie kompilowanego skryptu Powershell ( https://gist.github.com/bradjolicoeur/e77c508089aea6614af3 ), aby zwiększyć przyrost przy każdej udanej kompilacji, a następnie w Global.asax mam coś takiego:
Nadal uważam, że cały proces jest zbyt skomplikowany i zamierzam przyjrzeć się bardziej wydajnej metodzie osiągnięcia tego samego wyniku. Chciałem tego głównie do przekazania wersji do SVN, a następnie do Jenkina bez zbyt wielu dodatkowych narzędzi.
źródło