Ich möchte Windows-Dienste von unserem Build-Server mit Team City auf Windows Server 2012 mit minimaler Server-Konfiguration bereitstellen.Bereitstellen von Windows-Diensten von Team City
Was ist eine der besten Möglichkeiten, dies zu tun?
Ich möchte Windows-Dienste von unserem Build-Server mit Team City auf Windows Server 2012 mit minimaler Server-Konfiguration bereitstellen.Bereitstellen von Windows-Diensten von Team City
Was ist eine der besten Möglichkeiten, dies zu tun?
Ich verwende normalerweise gerade Powershell oder Msbuild für diese. Ich versuche, die flockige msdeploy zu vermeiden. In msbuild Sie das sehr handliche msbuild Erweiterungspaket so verwenden können, so vorausgesetzt, Sie Dateien zu Ihrem Zielort kopieren (ist Robocopy für die handliche) dies den Rest wird:
<Project ToolsVersion="4.0" DefaultTargets="InstallService" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask AssemblyFile="..\packages\MSBuild.Extension.Pack.1.2.0\lib\net40\MSBuild.ExtensionPack.dll"
TaskName="MSBuild.ExtensionPack.Computer.WindowsService"/>
<PropertyGroup>
<MachineName Condition="$(MachineName)==''"></MachineName>
<ServiceName Condition="$(ServiceName)==''"></ServiceName>
<ServicePath Condition="$(ServicePath)==''"></ServicePath>
<User Condition="$(User)==''"></User>
<Password Condition="$(Password)==''"></Password>
<SuppressStart Condition="$(SuppressStart)==''"></SuppressStart>
</PropertyGroup>
<Target Name="CheckProperties" BeforeTargets="StopService">
<Message Text="MachineName: $(MachineName)"/>
<Message Text="ServiceName: $(ServiceName)"/>
<Message Text="ServicePath: $(ServicePath)"/>
<Message Text="User : $(User)"/>
<Message Text="SuppressStart : $(SuppressStart)"/>
</Target>
<Target Name="StopService" BeforeTargets="InstallService">
<MSBuild.ExtensionPack.Computer.WindowsService
TaskAction="CheckExists"
ServiceName="$(ServiceName)"
MachineName="$(MachineName)">
<Output TaskParameter="Exists" PropertyName="DoesExist"/>
</MSBuild.ExtensionPack.Computer.WindowsService>
<MSBuild.ExtensionPack.Computer.WindowsService
TaskAction="Stop"
ServiceName="$(ServiceName)"
MachineName="$(MachineName)"
Condition="$(DoesExist)=='True'">
</MSBuild.ExtensionPack.Computer.WindowsService>
</Target>
<Target Name="StartService" AfterTargets="InstallService">
<MSBuild.ExtensionPack.Computer.WindowsService
TaskAction="CheckExists"
ServiceName="$(ServiceName)"
MachineName="$(MachineName)">
<Output TaskParameter="Exists" PropertyName="DoesExist"/>
</MSBuild.ExtensionPack.Computer.WindowsService>
<MSBuild.ExtensionPack.Computer.WindowsService
TaskAction="Start"
ServiceName="$(ServiceName)"
MachineName="$(MachineName)"
Condition="$(DoesExist)=='True' And $(SuppressStart)=='False'"
RetryAttempts="20">
</MSBuild.ExtensionPack.Computer.WindowsService>
<Message Text="Service $(ServiceName) set not to start" Condition="$(SuppressStart)=='True'" Importance="High" />
</Target>
<Target Name="InstallService">
<PropertyGroup>
<ServiceExeExists Condition="Exists('$(ServicePath)')">True</ServiceExeExists>
</PropertyGroup>
<Message Text="Installing $(ServicePath) %(ServiceName.Identity)" Importance="high"/>
<MSBuild.ExtensionPack.Computer.WindowsService
TaskAction="CheckExists"
ServiceName="$(ServiceName)"
MachineName="$(MachineName)">
<Output TaskParameter="Exists" PropertyName="DoesExist"/>
</MSBuild.ExtensionPack.Computer.WindowsService>
<Message Text="Installed $(ServiceName) $(ServicePath) for $(User) and $(Password)" Importance="high"/>
<MSBuild.ExtensionPack.Computer.WindowsService
TaskAction="Install"
ServiceName="$(ServiceName)"
User="$(User)"
Password="$(Password)"
ServicePath="$(ServicePath)"
MachineName="$(MachineName)"
Condition="!$(DoesExist)"/>
<MSBuild.ExtensionPack.Computer.WindowsService
TaskAction="SetAutomatic"
ServiceName="$(ServiceName)"
MachineName="$(MachineName)"
Condition="!$(DoesExist)"/>
<Warning Text="%(ServiceName.Identity) service already exists" Condition="$(DoesExist)"/>
</Target>
</Project>
Wir sind mit dem MSDeploy Paket wie folgt definiert:
<sitemanifest>
<runCommand path='presync.cmd' waitInterval='30000'/>
<dirPath path='$winSvc' />
<runCommand path='postsync.cmd' waitInterval='30000'/>
</sitemanifest>
die presync.cmd
:
net stop Svc
installUtil /u /name=Svc $destPath\Svc.exe
die postsync.cmd
:
installUtil /name=Svc $destPath\Svc.exe
net start Svc
Alle Dateien werden durch Powershell-Skript.
was, wenn das Warteintervall nicht ist groß genug? – marko
http://technet.microsoft.com/en-us/library/ee619740(v=ws.10).aspx –
Ohne zu viel Erfahrung mit Msdeploy (verwendet es ein paar Mal, aber nie wirklich verstanden, wie es funktioniert " unter den Hauben "), muss ich zugeben, dass ich auch das Gefühl habe, dass es irgendwie flockig ist. Das sind nur Meinungen, aber ich benutze Msbuild mit Kopierbefehlen und ein paar Bat-Dateien. Ihre Lösung scheint robuster zu sein, benötigt aber, wie Sie selbst sagen, eine Art von Dateizugriff. In unserem Fall haben wir! Also diese Lösung funktioniert und ich werde es als eine Antwort markieren. Wissen Sie, wie lange "Dienst deinstallieren" oder "Dienst anhalten" wartet, bis der Dienst ordnungsgemäß beendet wird? Für immer? – marko
Hi Marko froh, ich könnte helfen, aus der Online-Dokumentation http://www.msbuildextensionpack.com/help/4.0.8.0/index.html sagt es, dass die Eigenschaft retryattempts auf 60 voreingestellt ist. –