7

Staramy się zautomatyzować proces budowania na naszych serwerach pomostowych, ale mamy do czynienia z przeszkodą, choć dość niewielką. Używamy funkcji publikowania wbudowanej w VS2010, zobowiązując się do Subversion, a następnie aplikacja 3rd party (Beanstalk) automatycznie pobiera zaktualizowane pliki i przesyła je do serwera testowego.Aplikacja ASP.NET Web Application (MVC) Automatyzacja wdrożenia i subversion

jakie napotkasz problemem jest to, że tylko wydaje się mieć następujące możliwości:

  • (Lesser z 2 zło) Jeżeli zdecydujemy się użyć „Zamień pasujących plików z lokalnymi kopiami”, to działa świetnie, z jednym wyjątkiem: ta opcja nie usuwa żadnych plików, które zostały usunięte z projektu. Doprowadzi to do problemów ze śmieciami i/lub bezpieczeństwa w przypadku nieużywanych plików pochodzących z dawnych czasów.
  • Jeśli zdecydujemy się użyć opcji "Usuń wszystkie istniejące pliki przed publikacją", spowoduje to usunięcie całej struktury folderów, w tym ukrytych folderów .SVN używanych przez Subversion do śledzenia aktualizacji itp. Wydaje się to najlepszym rozwiązaniem z punktu widzenia dokładności , ale naprawdę niszczy lokalne środowisko SVN, które jest pośrednikiem tej automatyzacji.

Moje pytanie: czy istnieje łatwa do wykonania operacja lub zupełnie inna opcja wdrożenia, którą przeoczyliśmy (nie chcemy publikować bezpośrednio na serwerze z VS, ponieważ chcemy śledzić, kto/co/kiedy nastąpi wdrożenie?) Jedyne, co napotkałem, to ręczne usunięcie zawartości pliku przed opublikowaniem, pozostawiając nienaruszoną strukturę folderów, a następnie wdrażanie przy użyciu opcji "Zamień pasujące pliki na kopie lokalne". Niestety, wprowadza to zupełnie nowe znaczenie słowa "automatyzacja".

Jakieś pomysły, jak najlepiej to osiągnąć?

+1

Idealne rozrządu. Szukam również rozwiązania. Czy próbowałeś mieszać w konfiguracjach rozwiązań i zdarzeniach po ich zakończeniu? –

+0

Wcale nie - teraz wszystkie wdrożenia są wykonywane ręcznie, co może wymagać dużego nakładu pracy przy dużym zestawie zmian. Po prostu nie mogę uwierzyć, że nie ma lepszej opcji wbudowanej, która zapewnia dokładną kompilację bez niszczenia folderów. – Keith

Odpowiedz

4

Możesz rozważyć użycie NAnt lub czegoś podobnego do zadań, które chcesz zautomatyzować, np. Budowanie i publikowanie w Subversion. To jest większość mojego pliku kompilacji dla projektu WebApplication. Dla MVC może być inaczej. Jeśli tak, jestem pewien, że możesz użyć tego jako punktu wyjścia. W żadnym wypadku nie jestem ekspertem NAnt, więc mogą istnieć pewne niedociągnięcia, ale to zdecydowanie działa dla mnie.

Musiałem dodać cel PublishToFileSystem do każdego pliku .csproj, który chciałem opublikować. Źródło tego może be found here.

Build file also available on Pastebin

<?xml version="1.0"?> 
<project name="deploy" default="all"> 
    <property name="nant.settings.currentframework" value="net-4.0" /> 
    <!-- Any of these can be passed through the command line --> 
    <property name="sourceDirectory" value="${project::get-base-directory()}" /> 
    <property name="publishDirectory" value="${sourceDirectory}\build" /> 
    <property name="MSBuildPath" value="${framework::get-assembly-directory(framework::get-target-framework())}\msbuild.exe" /> 
    <!-- The build configuration to use when publishing and transforming the web.config file. This is useful when you have multiple environments for which you create builds --> 
    <property name="buildConfiguration" value="Release" /> 
    <!-- Set these as needed --> 
    <property name="svn.username" value="" /> 
    <property name="svn.password" value="" /> 

    <target name="SvnPrep"> 
     <property name="svn.dir" value="${publishDirectory}\.svn" /> 
     <property name="svn.update" value="true" readonly="false" /> 
     <echo>env.svn.path = svn</echo> 
     <echo>svn.dir = ${svn.dir}</echo> 
     <mkdir dir="${publishDirectory}" unless="${directory::exists(publishDirectory)}" /> 
     <!-- Check if there's a .svn dir already. If not: checkout, else: update. --> 
     <if test="${not directory::exists(svn.dir)}"> 
      <exec program='svn.exe' workingdir="${publishDirectory}" verbose="true"> 
       <arg line='co ${svn.builduri} --username ${svn.username} --password ${svn.password} --non-interactive ./' /> 
      </exec> 
      <property name="svn.update" value="false" readonly="false" /> 
     </if> 
     <if test="${svn.update}"> 
      <exec program='svn.exe' workingdir="${publishDirectory}\" verbose="true"> 
       <arg line='up --username ${svn.username} --password ${svn.password} --non-interactive --force ./' /> 
      </exec> 
     </if> 
     <!-- Force any conflicts to be resolved with the most recent code --> 
     <exec program='svn.exe' workingdir="${publishDirectory}\" verbose="true"> 
      <arg line='resolve --accept theirs-full -R ./' /> 
     </exec> 
    </target> 

    <target name="DeleteFiles"> 
     <!-- Delete only the files (retain directory structure) in the directory to which you are going to publish/build. NAnt excludes svn directories by default. --> 
     <delete includeemptydirs="false"> 
      <fileset basedir="${publishDirectory}"> 
       <include name="**/*.*" /> 
      </fileset> 
     </delete> 
    </target> 
    <target name="Publish"> 
     <!-- I know there's an MSBuild task, I don't know why I didn't use it, but this works. --> 
     <!-- Build and publish frontend --> 
     <exec program="${MSBuildPath}"> 
      <arg line='"${sourceDirectory}\YourProject.csproj"' /> 
      <arg value='"/p:Platform=AnyCPU;Configuration=${buildConfiguration};PublishDestination=${publishDirectory}"' /> 
      <arg value="/target:PublishToFileSystem" /> 
     </exec> 
     <!-- Transform the correct web.config and copy it to the build folder. PublishToFileSystem doesn't transform the web.config, unfortunately. --> 
     <exec program="${MSBuildPath}"> 
      <arg line='"${sourceDirectory}\YourProject.csproj"' /> 
      <arg value='"/p:Platform=AnyCPU;Configuration=${buildConfiguration};PublishDestination=${publishDirectory}"' /> 
      <arg value="/target:TransformWebConfig" /> 
     </exec> 
     <copy file="${sourceDirectory}\YourProject\obj\${buildConfiguration}\TransformWebConfig\transformed\Web.config" tofile="${publishDirectory}\YourProject\web.config" overwrite="true" />  
    </target> 

    <target name="SvnCommit">  
     <!-- add any new files --> 
     <exec program='svn.exe' workingdir="${publishDirectory}" verbose="true"> 
      <arg line='add --force .' /> 
     </exec> 
     <!-- delete any missing files, a modification of this http://stackoverflow.com/questions/1071857/how-do-i-svn-add-all-unversioned-files-to-svn --> 
     <!-- When there's nothing to delete it looks like this fails (to NAnt) but it is actually fine, that's why failonerror is false -->  
     <exec program='cmd.exe' workingdir="${publishDirectory}\" verbose="true" failonerror="false" 
      commandline='/C for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^\!"`) do svn del "%i %j"' > 
     </exec> 
     <exec program='svn.exe' workingdir="${publishDirectory}" verbose="true"> 
      <arg line='commit -m "Automated commit from build runner"' /> 
     </exec> 
    </target> 

    <target name="ShowProperties"> 
     <script language="C#" prefix="util" > 
      <code> 
       <![CDATA[ 
       public static void ScriptMain(Project project) 
       { 
        foreach (DictionaryEntry entry in project.Properties) 
        { 
         Console.WriteLine("{0}={1}", entry.Key, entry.Value); 
        } 
       } 
       ]]> 
      </code> 
     </script> 
    </target> 

    <target name="all"> 
     <call target="ShowProperties" /> 
     <call target="SvnPrep" /> 
     <call target="DeleteFiles" /> 
     <call target="Publish" /> 
     <call target="SvnCommit" /> 
    </target> 
</project> 
+0

Wygląda obiecująco, będę musiał zaglądać w to, kiedy będę miał szansę. Dziękuję Ci. – Keith

+0

Pierwsze kroki z NAnt i innymi narzędziami do automatyzacji mogą być czasochłonne, ale ostatecznie warto. Daj mi znać, jak to działa lub jeśli masz inne pytania. –

+0

+1 ładna odpowiedź @Alex dlaczego ma to miejsce w folderze źródłowym zamiast w oddzielnej lokalizacji w svn? pobierał go, gdy ktoś robi aktualizację svn, a dodatkowo masz udostępnioną konfigurację dla każdego, kto ma dostęp do źródła @Keith, czy go użyłeś, jak to się stało, jakąkolwiek różnicę skończyłeś? – eglasius

0

Występujemy również poza SVN i wystąpił ten sam problem. Naszym rozwiązaniem jest zasadniczo rozgałęzienie projektu "znaczących" ulepszeń - sytuacji, w których dodawaliśmy i usuwaliśmy pliki, nie tylko naprawiając małe błędy i wprowadzając poprawki, które zazwyczaj można obsługiwać za pomocą xcopy. układ svn wygląda następująco:

--project 
---production 
----20100101 
----20100213 
[etc, etc] 

Procedura mądry, to jest całkiem prosta - jeśli nie są na tyle duże zmiany, sprawdź w kompilacji artefaktów jak właściwe.

Inną rzeczą, którą możesz chcieć wypróbować, szczególnie, jeśli nie możesz dostać swoich bitów produkcyjnych, aby "przełączać" gałęzie z łatwością, byłoby użycie czegoś bardziej wyszukanego, takiego jak powershell, do wykonania polecenia usuwania plików, które mogłoby odfiltrować *. foldery svn.

+1

Problem z odgałęzieniem polega na dodaniu ręcznego kroku do procesu, który chcemy w pełni zautomatyzować. Dzięki za wejście, ale zdecydowanie nie jest to kierunek, którego szukamy - chcielibyśmy ręcznie usunąć pliki na razie, dopóki nie znajdziemy czegoś ładniejszego. – Keith

+0

Hrm, biorąc pod uwagę tę i inne odpowiedzi, możesz spróbować czegoś, co automatycznie śledzi zmiany, a nie polegać na czymś, co zrywa wszędzie ślady. Mercurial przychodzi na myśl. –

0

Powiedziałbym "na szczęście", co przynosi zupełnie nowe znaczenie automatyzacji słowa :) To, co opisujesz, znane jest jako Automatyzacja Zwolnień Aplikacji, zwane także Automatyzacją wdrożenia. Jeśli naprawdę chcesz wiedzieć, kto zrobił co i gdzie, jaki był wynik, itp., To szukasz produktu takiego jak Nolio ASAP (http://www.noliosoft.com). Daj mi znać, jeśli to pomoże, ponieważ z tego, co opisujesz, wygląda na idealne dopasowanie.

+ Daniel

+1

Nie dokładnie to, czego szukamy, ponieważ nie wydaje się integrować z Subversion (przynajmniej nie wspomina o tym wprost). Wygląda jednak na bardzo dobry produkt, ale mamy już pełne rozwiązanie wdrożeniowe, z niewielkim problemem opisanym powyżej. – Keith

0

Czemu publikowania witryny do folderu, który jest obsługiwany przez Subversion?

Sposób w jaki zrobię to działa bezpośrednio z plikami w folderach obsługiwanych przez SVN. Jak tylko popełnię cokolwiek, zostanie on pociągnięty przez łodygę fasoli do obszaru postoju. W ten sposób usunięte pliki są zawsze usuwane z repozytorium i nie musisz się o to martwić. Wszystko jest zawsze zsynchronizowane.

Jeśli uważasz, że umieszcza zbyt wiele plików w obszarze przemieszczania, możesz nadal używać skryptów i poleceń programu Visual Studio do publikowania witryny. Ale nie jestem pewien, jak dobrze Beanstalk integruje się z tym scenariuszem. Znam CC.net i wiele innych alternatyw.

+1

Po pierwsze, używamy naszego serwera pośredniczącego do "stage" tego, co zostanie wdrożone do produkcji, czyli kodu PRECOMPILED ... Po drugie, używamy transformacji config do zarządzania ciągami połączeń i ustawieniami aplikacji, które różnią się między różnymi środowiskami. Posiadanie Beanstalk wyciągnąć aktualną wersję web.config bezpośrednio z SVN nie będzie działać. – Keith

Powiązane problemy