Jak zsynchronizować numer wersji SVN z moją witryną internetową ASP.NET?

93

Stack Overflow ma numer wersji subversion na dole:

Wersja SVN: 679

Chcę używać takiego automatycznego wersjonowania z moimi .NET Web Site/Applicationprojektami / rozwiązaniami, Windows Forms, WPD.

Jak to zaimplementować?

Zack Peterson
źródło
@Balloon Jeśli używasz TortoiseSVN, możesz użyć pakietu programu SubWCRev . Pyta o kopię roboczą i podaje tylko najwyższy numer wersji. Wprawdzie wydaje się, że jest to podejście klienta do problemu po stronie serwera, ale ponieważ jest to fajny program wiersza poleceń, powinieneś być w stanie dość łatwo przechwycić jego dane wyjściowe do użycia.
nickf
Jeśli nie używasz TortoiseSVN dla SubWCRev, jak powiedziałem tutaj , możesz użyć svnversion, która robi to samo.
nickf

Odpowiedzi:

31

Wygląda na to, że Jeff używa CruiseControl.NET w oparciu o przeglądanie transkrypcji podcastów. Wydaje się, że ma to zautomatyzowane możliwości wdrażania, od kontroli źródła do produkcji. Czy to może być miejsce, w którym ma miejsce wstawianie?

saint_groceon
źródło
2
Jeśli nie korzystasz z CruiseControl.Net, sprawdź moją odpowiedź (bezwstydna wtyczka!) - stackoverflow.com/questions/163/… ; o)
Andrew
link jest uszkodzony @saint_groceon
Cacho Santa
27

Robimy to z xUnit.net dla naszych automatycznych kompilacji. Używamy CruiseControl.net(i wypróbowujemy TeamCity). Zadanie programu MSBuild, które uruchamiamy w celu ciągłej integracji, automatycznie zmienia numer kompilacji za nas, więc wynikowy plik kompilacji ZIP zawiera odpowiednio wersjonowany zestaw bibliotek DLL i EXE.

Nasz plik MSBuild zawiera odniesienie do UsingTask dla biblioteki DLL, która zastępuje wyrażenia regularne: (możesz używać tej biblioteki DLL, ponieważ jest ona również objęta licencją MS-PL)

  <UsingTask
     AssemblyFile = "3rdParty \ CodePlex.MSBuildTasks.dll"
     TaskName = "CodePlex.MSBuildTasks.RegexReplace" />

Następnie wyodrębniamy numer kompilacji, który jest automatycznie dostarczany przez system CI. Jeśli chcesz, możesz również poprosić dostawcę kontroli źródła o podanie numeru wersji źródła, ale okazało się, że numer kompilacji w systemie CI jest bardziej przydatny, ponieważ nie tylko można zobaczyć wyniki integracji według numeru kompilacji CI, który również zapewnia łącze z powrotem do zestawu zmian, które zostały uwzględnione w kompilacji.

 <! - Kaskadowe próby znalezienia numeru kompilacji ->

 <PropertyGroup Condition = "'$ (BuildNumber)' == ''">
   <BuildNumber> $ (BUILD_NUMBER) </BuildNumber>
 </PropertyGroup>
 <PropertyGroup Condition = "'$ (BuildNumber)' == ''">
   <BuildNumber> $ (ccnetlabel) </BuildNumber>
 </PropertyGroup>
 <PropertyGroup Condition = "'$ (BuildNumber)' == ''">
   <BuildNumber> 0 </BuildNumber>
 </PropertyGroup>

(Próbujemy BUILD_NUMBER, który pochodzi z TeamCity, a następnie ccnetlabel, który pochodzi z CC.net, a jeśli żadne z nich nie jest obecne, domyślnie ustawiamy 0, abyśmy mogli ręcznie przetestować automatyczny skrypt kompilacji).

Następnie mamy zadanie, które ustawia numer kompilacji w pliku GlobalAssemblyInfo.cs, który łączymy ze wszystkimi naszymi projektami:

 <Target Name = "SetVersionNumber">
   <RegexReplace
       Pattern = 'AssemblyVersion \ ("(\ d + \. \ D + \. \ D +) \. \ D +" \)'
       Replace = 'AssemblyVersion ("$ 1. $ (BuildNumber)")'
       Files = „GlobalAssemblyInfo.cs” />
   <Exec Command = "attribute -r xunit.installer \ App.manifest" />
 </Target>

To znajduje atrybut AssemblyVersion i zastępuje numer wersji abcd abcBuildNumber. Zwykle zostawiamy źródło zaznaczone w drzewie z ustalonymi pierwszymi trzema częściami numeru budującego, a czwartą ustawioną na zero (np. Dzisiaj jest to 1.0.2.0).

W procesie kompilacji upewnij się, że zadanie SetVersionNumber poprzedza zadanie kompilacji. Na koniec używamy naszego zadania Zip, aby spakować wyniki kompilacji, abyśmy mieli historię plików binarnych dla każdej automatycznej kompilacji.

Brad Wilson
źródło
25

Możesz to zrobić, dodając następujące elementy w dowolnym miejscu kodu

$Id:$

Na przykład @Jeff zrobił:

<div id="svnrevision">svn revision: $Id:$</div>

a po zameldowaniu serwer zastąpił $ Id: $ aktualnym numerem wersji. Znalazłem również to odniesienie .

Jest też $ Data: $ , $ Wersja: $ , $ Wersja: $

Nick Berardi
źródło
Musisz upewnić się, że pliki mają ustawiony atrybut svn: words, w przeciwnym razie $ Id $ itd. Nie zostaną automatycznie zastąpione. Zobacz stronę. (Przewiń w dół do svn: słowa kluczowe)
Michael Stum
1
Właśnie wypróbowałem to, używając $ Rev $ i działa - do pewnego stopnia. Problem polega na tym, że wydaje się, że aktualizuje słowo kluczowe tylko wtedy, gdy plik, w którym się pojawia, zostanie zmieniony. Oznacza to, że jeśli w projekcie zostaną wprowadzone zmiany, które nie wpływają na plik z $ Rev $ w nim (w moim przypadku, moja strona główna ASP.NET), projekt będzie miał wyższą wersję niż jest wyświetlana użytkownikowi . Czy ktoś ma jakieś przemyślenia na ten temat? Czy istnieje sposób, aby SVN zawsze aktualizował słowa kluczowe w pliku?
Chris Roberts,
5
Czy nie spowoduje to po prostu wstawienia numeru wersji ostatniej zmiany w tym konkretnym pliku? Próbowałem skonfigurować repozytorium z dwoma plikami i zmieniłem jedno, próbowałem eksportować i pobierać, a drugi plik pozostał na 1 w obu przypadkach.
Lasse V. Karlsen
lassevk jest poprawne, zmienia się to tylko wtedy, gdy zmienia się sam plik.
Bruno Lopes
Używając VisualSVN i TortoiseSVN, dodanie $ Id: $ spowodowało właśnie renderowanie strony „$ Id: $”. Warto zauważyć, na jakim serwerze / kliencie działa ta odpowiedź.
Travis
17

Jeśli używasz ASP.Net MVC(tak jak robi to StackOverflow), napisałem łatwy do wykonania 3-stopniowy przewodnik, jak automatycznie pobrać i wyświetlić najnowszą wersję SVN . Przewodnik został zainspirowany myśleniem o tym właśnie pytaniu! : o)

Andrzej
źródło
Brzmi świetnie, chociaż Link się zepsuł!
Peter C,
1
Było to dla nas świetne rozwiązanie do zautomatyzowania wyświetlania wersji na podstawie naszych wersji SVN. Zaletą jest to, że nie wymaga połączenia z serwerem SVN.
Ben Elder,
link jest uszkodzony lub witryna nie działa
Cacho Santa
1
Dzięki @cacho, naprawiono - to był błąd serwera [sic]; o)
Andrew
10

@Balloon Jeśli używasz TortoiseSVN, możesz użyć pakietu programu SubWCRev . Pyta o kopię roboczą i podaje tylko najwyższy numer wersji. Wprawdzie wydaje się, że jest to podejście klienta do problemu po stronie serwera, ale ponieważ jest to fajny program wiersza poleceń, powinieneś być w stanie dość łatwo przechwycić jego dane wyjściowe do użycia.

nickf
źródło
9

$reva inne podobne są wersjami poszczególnych plików, więc nie zmienią się, dopóki plik się nie zmieni. Numer na stronie to (najprawdopodobniej zakładam tutaj) numer wersji svn dla całego projektu. Różni się to od wersji plików, na które inni wskazywali.

W tym przypadku zakładam, że CCNET pobiera numer wersji projektu i przepisuje część strony internetowej o tym numerze. Każde rozwiązanie CI powinno być w stanie to zrobić, skonfiguruj to samodzielnie za pomocą CCNET i Teamcity (chociaż nie strony internetowe, ale automatyczne wersjonowanie wersji wdrożeniowych / montażowych).

Aby to zrobić, użyj rozwiązania CI, które je obsługuje, lub użyj procesu kompilacji (MSbuild / Nant) do przechowywania tej wersji i zapisania jej w plikach przed jej „wdrożeniem”.

James Pogran
źródło
5

Aby dodać do odpowiedzi @ BradWilson: „Jeśli chcesz, możesz również poprosić swojego dostawcę kontroli źródła o podanie numeru wersji źródła”

Aby połączyć Subversion i MSBuild: Projekt zadań społeczności MSBuild

sty
źródło