Automatyczne wdrażanie przy użyciu CI server

W naszym projekcie wdrożenie jest zawsze uciążliwe, głównie z powodu błędów popełnionych przez zespół zarządzający wydaniami. Albo zepsują konfigurację, albo w jakiś sposób zainstalują złą wersję. Używamy TeamCity jako naszego serwera CI i tworzy on artefakty w postaci plików zip (dll i exe), które są zwykle przekazywane zespołowi wydań. Moje pytanie brzmi, czy istnieje sposób na automatyzację całego procesu wdrażania?

Czy istnieje komercyjne narzędzie, które to obsługuje?

Będziemy chcesz wykonać następujące czynności:

  • Zaktualizuj pliki konfiguracyjne o wartości specyficzne dla środowiska.

  • Zainstaluj usługi windows na serwerze.

  • Prześlij pakiet interfejsu użytkownika (WPF) do scentralizowanej lokalizacji(która jest ściągana przez inną aplikację, coś w rodzaju launchera).

  • Zmień ciągi połączeń DB.

Wykonaj wszystkie powyższe czynności dla różnych środowisk(takich jak int,UAT i prod)

DB deployment since jest oddzielnym bestia jako taka nie musi być w tym pokryta.

Wszelkie najlepsze praktyki, narzędzia lub rozwiązania będą bardzo pomocne.

Dzięki, - Mike

Author: Mike, 2012-01-18

6 answers

Korzystałem z TeamCity w kilku dość dużych projektach i zautomatyzowałem każdy aspekt wdrożeń poza bazą danych. Główne kroki, których używam dla każdego projektu to:

  1. Zainstaluj agenta TeamCity na serwerze produkcyjnym
  2. niech build wykona wszystko poza kontrolą źródeł (masz wszystko w kontroli źródeł, prawda?).
  3. Wykonaj krok budowania, który buduje i publikuje Twoje rozwiązanie. Można to osiągnąć, dodając następujące argument wiersza poleceń do wywołania MSBuild:

    / p: Configuration=[Your Config];DeployOnBuild = True;PackageAsSingleFile=False

    Twoje opublikowane pliki (i przerobione pliki konfiguracyjne) zostaną zapisane w następującym katalogu:

    [Twój katalog projektu] \ obj\[Twój Config] \ Package\PackageTmp

  4. Używanie języka skryptowego (w moim przypadku Powershell) do kopiowania opublikowanych artefaktów do katalogu wdrażania i wprowadzania zmian specyficznych dla środowiska, o których wspomniałeś. Np. wyodrębnianie archiwów, kopiowanie plików, uruchamianie / zatrzymywanie stron internetowych itp..

  5. Uruchom dowolne automatyczne testy (np. nUnit, Selenium itp...)

Uważam, że najlepszą strategią jest posiadanie zdarzenia post-build. Net, które wywołuje odpowiedni skrypt powershell przekazujący odpowiednie szczegóły, takie jak ścieżka rozwiązania i nazwa konfiguracji (alternatywnie, miałem również TeamCity przekazać nazwę środowiska do skryptu Powershell) tak, że wie, co musi zrobić (np. Staging, Produkcja itp...). Powinieneś zauważyć, że język skryptowy taki jak Powershell może zrobić Wszystko , co osoba może zrobić (i około 100x szybciej i 100% niezawodnie).

W Powershell jest tak wiele treści, że możesz po prostu wygooglować wszystko, co musisz zrobić w Powershell, a otrzymasz przykład. Np. "PowerShell deploy WPF"," powershell upload FTP " itp...

W poprzedniej pracy musiałem zdalnie wdrożyć usługi windows i stwierdziłem, że z wystarczającymi badaniami, Udało mi się uzyskać MSI dla usługi, aby odinstalować istniejącą usługę i zainstalować nową całkowicie po cichu (tzn. bez okien dialogowych). To bardzo pomoże w dążeniu do automatyzacji. Mogę to rozwinąć, jeśli chcesz.

Poniżej znajduje się przykład skryptu PowerShell post build, którego zazwyczaj używam:

zauważ, jak używam domyślnych wartości parametrów, dzięki czemu mogę wykonać skrypt bezpośrednio z mojego edytora Powershell, aby symulować i testować różne konfiguracje na mojej lokalnej maszynie.

param(
    [string]$configurationName="Debug",
    [string]$sourceDirectory="C:\SVN\<Your local solution location>")
Set-StrictMode -v latest
$ErrorActionPreference = "Stop"

# Load required functions
$private:scriptFolder = & { (Split-Path $MyInvocation.ScriptName -Parent) }
. (Join-Path $scriptFolder DebugBuild.ps1)
. (Join-Path $scriptFolder StagingBuild.ps1)
. (Join-Path $scriptFolder ProductionBuild.ps1)
. (Join-Path $scriptFolder CommonBuildFunctions.ps1)

#Execute appropriate build
switch ($configurationName) {
    "Debug" { RunDebugBuild $sourceDirectory }
    "Staging" { RunStagingBuild $sourceDirectory }
    "Production" { RunReleaseBuild $sourceDirectory }
}

aby uruchomić publikację na maszynach programistycznych, skonfigurowałem profil vs publish dla rozwiązania, które jest zaangażowane w SVN, aby inni programiści mogli z niego korzystać. Ten profil jest publikowany bezpośrednio w lokalnym katalogu wdrażania.

 9
Author: Brian Hinchey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 08:11:49

Używamy TeamCity do naszych wdrożeń oprócz CI i działa naprawdę dobrze. Oto kilka rzeczy, które mogą pomóc:

  • Jeśli używasz VS2010, sprawdź SlowCheetah plugin . Może on wykonać transformację pliku konfiguracyjnego, aby zrobić to, czego potrzebujesz, aby zastąpić ciągi połączeń DB i inne zmienne wrażliwe na środowisko. Transformacje te następują automatycznie podczas budowania w oparciu o wybraną konfigurację budowania.
  • Zobacz MSDeploy . While it gets większość uwagi zajmuje się wdrażaniem aplikacji internetowych, może robić wiele innych rzeczy, takich jak instalowanie usług systemu windows i synchronizacja plików z katalogiem docelowym. Podczas gdy większość ludzi instaluje go jako dodatek do usług IIS, można go zainstalować jako oddzielną usługę, która nie ma zależności od usług IIS.

Jeśli nie używasz VS2010 (lub nie chcesz używać SlowCheetah), oto jak poradzisz sobie z ustawieniami konfiguracyjnymi:

  • Stwórz konfigurację aplikacji dla każdego innego środowiska (I ' m zakładając, że skonfigurować konfigurację kompilacji dla każdego środowiska). Dodaj nazwę konfiguracji na końcu pliku konfiguracyjnego, więc w Prod mamy App.config.Prod i QA mamy App.config.QA.
  • Umieść pełną konfigurację dla każdego środowiska w odpowiednim pliku konfiguracyjnym dla to środowisko.
  • Jako część kompilacji (używamy celu" BeforeBuild " w pliku projektu), użyj msbuild do skopiowania aplikacji specyficznej dla środowiska.config nad rzeczywistym. Oto zwyczaj msbuild target używamy do tego celu:

    <PropertyGroup>
        <EnvironmentAppConfig>App.config.$(Configuration)</EnvironmentAppConfig>
    </PropertyGroup>
    
    <Target Name="ReplaceAppConfig">
        <Message    Condition="Exists('$(ProjectDir)$(EnvironmentAppConfig)')" 
                    Text="Copying $(EnvironmentAppConfig) -> App.config" Importance="high" />
    
        <Message    Condition="!Exists('$(ProjectDir)$(EnvironmentAppConfig)')"
                    Text="No $(EnvironmentAppConfig) found. Leaving App.config as is." Importance="high" />
    
        <Copy   SourceFiles="$(ProjectDir)$(EnvironmentAppConfig)"
                DestinationFiles="$(ProjectDir)App.config"
                Condition="Exists('$(ProjectDir)$(EnvironmentAppConfig)')" />
    
    </Target>
    

Daj znać, jeśli będziesz potrzebował innych szczegółów.
 3
Author: Joel Beckham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-17 23:04:29

TeamCity + Octopus deploy

Octopus for Windows service automated deployes

 1
Author: RobertRevolver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-17 15:33:00

Nasz zespół ds. wydania używa Anthill Pro - to również potrafi zrobić CI, ale po prostu używa go do wdrażania pakietów (w naszym przypadku głównie kodu strony www). Fajną rzeczą w Anthill jest cała konfiguracja klienta (agenta) - serwera, więc z pewnym wysiłkiem przemierza firewalle, NAT itp. I ma zatwierdzenie i planowanie przepływu pracy.

Jeśli chodzi o configs, to jest to inna bestia-niestety zarówno devs, jak i release team muszą je zmienić i jakoś scalić wynik. Zastanów się, czy chcesz Dodaj nowy klucz konfiguracji, ale zespół wydający musi dodać ustawienia produkcyjne dla połączenia DB. Sztuczka polega na tym, że deweloperzy nie powinni znać łańcucha połączenia dB produkcji. Tak więc nie jest to zautomatyzowane(w naszym przypadku tak czy inaczej).

 0
Author: Artemiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-17 22:21:07

Jestem częściowy do TeamCity, który jest produktem Jetbrains, firma, która sprawia, że podstawowe ReSharper(Nie, Nie pracuję dla nich, drat szczęście). TeamCity, przynajmniej jak ostatnio sprawdzałem, to darmowy produkt dla maksymalnie 20 użytkowników i 20 konfiguracji kompilacji. Ma kilka ładnych funkcji auto-build I blame. Wspaniale, naprawdę.

 0
Author: MrBoJangles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-17 22:24:13

Wspominasz o komercyjnym narzędziu...

TFS, a konkretnie Team Build, w pełni wspiera budowanie kodu i jego wdrażanie. Za każdym razem, gdy tworzymy aplikację internetową, jest ona automatycznie wdrażana na naszych serwerach Dev i QA. Po wdrożeniu mamy go uruchomić przez pakiet testów internetowych, aby upewnić się, że wszystko jest funkcjonalne. Wtedy prawdziwa zabawa zaczyna się od naszego zespołu QA;)

Chociaż nie wdrażamy się automatycznie do produkcji, z pewnością możemy to zrobić również.

 0
Author: NotMe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-17 22:26:23