Spuštění skriptů Windows PowerShellu ze souborů projektu MSBuild
Toto téma popisuje, jak spustit skript Windows PowerShell jako součást procesu sestavení a nasazení. Skript můžete spustit místně (jinými slovy na buildovacím serveru) nebo vzdáleně, například na cílovém webovém nebo databázovém serveru.
Existuje mnoho důvodů, proč můžete chtít spustit skript Windows PowerShell po nasazení. Můžete například chtít:
- Přidejte do registru vlastní zdroj událostí.
- Vygenerujte adresář systému souborů pro nahrání.
- Vyčistěte adresáře sestavení.
- Zápis položek do vlastního souboru protokolu.
- Odesílat e-maily zvoucí uživatele do nově zřízené webové aplikace.
- Vytvořte uživatelské účty s příslušnými oprávněními.
- Konfigurace replikace mezi instancemi SQL Server
Toto téma vám ukáže, jak spouštět Windows PowerShell skripty místně i vzdáleně z vlastního cíle v souboru projektu Microsoft Build Engine (MSBuild).
Toto téma je součástí série kurzů založených na požadavcích na podnikové nasazení fiktivní společnosti s názvem Fabrikam, Inc. Tato série kurzů používá ukázkové řešení – řešení Contact Manager – k reprezentaci webové aplikace s realistickou úrovní složitosti, včetně aplikace ASP.NET MVC 3, služby WCF (Windows Communication Foundation) a databázového projektu.
Metoda nasazení, která je jádrem těchto kurzů, je založená na přístupu založeném na rozdělených souborech projektu popsaném v tématu Vysvětlení souboru projektu, ve kterém je proces sestavení řízen dvěma soubory projektu – jedním obsahujícím pokyny k sestavení, které platí pro každé cílové prostředí, a jedním obsahujícím nastavení sestavení a nasazení specifické pro prostředí. V době sestavení se soubor projektu specifického pro prostředí sloučí do souboru projektu nezávislého na prostředí, aby se vytvořila úplná sada pokynů k sestavení.
Přehled úkolů
Pokud chcete spustit skript Windows PowerShell v rámci automatizovaného procesu nasazení nebo v jednom kroku, budete muset provést tyto úlohy vysoké úrovně:
- Přidejte Windows PowerShell skript do řešení a do správy zdrojového kódu.
- Vytvořte příkaz, který vyvolá váš skript Windows PowerShell.
- Umisněte všechny vyhrazené znaky XML v příkazu.
- Vytvořte cíl ve vlastním souboru projektu MSBuild a spusťte příkaz pomocí úlohy Exec .
V tomto tématu se dozvíte, jak tyto postupy provést. Úlohy a návody v tomto tématu předpokládají, že už znáte cíle a vlastnosti nástroje MSBuild a že rozumíte tomu, jak použít vlastní soubor projektu MSBuild k řízení procesu sestavení a nasazení. Další informace najdete v tématech Principy souboru projektu a Principy procesu sestavení.
Vytváření a přidávání skriptů Windows PowerShell
Úlohy v tomto tématu používají ukázkový skript Windows PowerShell s názvem LogDeploy.ps1 k ilustraci spouštění skriptů z nástroje MSBuild. SkriptLogDeploy.ps1 obsahuje jednoduchou funkci, která zapisuje jednořádkovou položku do souboru protokolu:
function LogDeployment
{
param([string]$filepath,[string]$deployDestination)
$datetime = Get-Date
$filetext = "Deployed package to " + $deployDestination + " on " + $datetime
$filetext | Out-File -filepath $filepath -Append
}
LogDeployment $args[0] $args[1]
SkriptLogDeploy.ps1 přijímá dva parametry. První parametr představuje úplnou cestu k souboru protokolu, do kterého chcete přidat položku, a druhý parametr představuje cíl nasazení, který chcete zaznamenat do souboru protokolu. Když skript spustíte, přidá do souboru protokolu řádek v tomto formátu:
Deployed package to TESTWEB1 on 02/11/2012 09:28:18
Pokud chcete LogDeploy.ps1 skript zpřístupnit nástroji MSBuild, musíte provést následující:
- Přidejte skript do správy zdrojového kódu.
- Přidejte skript do řešení v sadě Visual Studio 2010.
Skript nemusíte nasazovat s obsahem řešení bez ohledu na to, jestli chcete skript spustit na serveru sestavení nebo na vzdáleném počítači. Jednou z možností je přidat skript do složky řešení. Vzhledem k tomu, že v příkladu aplikace Contact Manager chcete jako součást procesu nasazení použít skript Windows PowerShell, je vhodné přidat skript do složky Publikovat řešení.
Obsah složek řešení se zkopíruje do serverů sestavení jako zdrojový materiál. Netvoří ale žádnou součást výstupu projektu.
Spuštění skriptu Windows PowerShell na buildovacím serveru
V některých scénářích můžete chtít spouštět Windows PowerShell skripty na počítači, který sestavuje vaše projekty. Můžete například použít Windows PowerShell skript k vyčištění složek sestavení nebo zápisu položek do vlastního souboru protokolu.
Z hlediska syntaxe je spuštění skriptu Windows PowerShell ze souboru projektu MSBuild stejné jako spuštění skriptu Windows PowerShell z běžného příkazového řádku. Musíte vyvolat spustitelný soubor powershell.exe a pomocí přepínače příkazů –zadat příkazy, které chcete Windows PowerShell spustit. (V Windows PowerShell v2 můžete použít také přepínač –file.) Příkaz by měl mít tento formát:
powershell.exe –command "& { [Path to script] 'parameter1' 'parameter2' ... }"
Příklad:
powershell.exe –command
"& { C:\LogDeploy.ps1 'C:\DeployLogs\log.txt' 'TESTWEB1' }"
Pokud cesta ke skriptu obsahuje mezery, musíte cestu k souboru uzavřít do jednoduchých uvozovek, kterým předchází ampersand. Nemůžete použít dvojité uvozovky, protože jste je už použili k uzavření příkazu:
powershell.exe –command
"& { &'C:\Path With Spaces\LogDeploy.ps1'
'C:\Path With Spaces\log.txt'
'TESTWEB1' }"
Při vyvolání tohoto příkazu z nástroje MSBuild je potřeba vzít v úvahu několik dalších aspektů. Nejprve byste měli zahrnout příznak –NonInteractive , abyste zajistili, že se skript spustí tiše. Dále byste měli zahrnout příznak –ExecutionPolicy s odpovídající hodnotou argumentu. Určuje zásady spouštění, které Windows PowerShell použít na váš skript, a umožňuje přepsat výchozí zásady spouštění, což může bránit spuštění skriptu. Můžete si vybrat z těchto hodnot argumentů:
- Hodnota Unrestricted umožní Windows PowerShell spustit váš skript bez ohledu na to, jestli je skript podepsaný.
- Hodnota RemoteSigned umožní Windows PowerShell spouštět nepodepsané skripty, které byly vytvořeny v místním počítači. Skripty vytvořené jinde však musí být podepsané. (V praxi je velmi nepravděpodobné, že byste vytvořili Windows PowerShell skript místně na buildovacím serveru.)
- Hodnota AllSigned umožní Windows PowerShell spouštět pouze podepsané skripty.
Výchozí zásada spouštění je Omezená, což Windows PowerShell brání ve spuštění jakýchkoli souborů skriptu.
Nakonec je potřeba utéct všechny vyhrazené znaky XML, které se vyskytují v příkazu Windows PowerShell:
Nahrazení jednoduchých uvozovek '
Nahradit dvojité uvozovky "
Nahraďte ampersandy &
Když provedete tyto změny, bude příkaz vypadat takto:
powershell.exe –NonInteractive –ExecutionPolicy Unrestricted
–command "& { &'[Path to script]'
'[parameter1]'
'[parameter2]' } "
V souboru vlastního projektu MSBuild můžete vytvořit nový cíl a pomocí úlohy Exec spustit tento příkaz:
<Target Name="WriteLogEntry" Condition=" '$(WriteLogEntry)'!='false' ">
<PropertyGroup>
<PowerShellExe Condition=" '$(PowerShellExe)'=='' ">
%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
</PowerShellExe>
<ScriptLocation Condition=" '$(ScriptLocation)'=='' ">
C:\Path With Spaces\LogDeploy.ps1
</ScriptLocation>
<LogFileLocation Condition=" '$(LogFileLocation)'=='' ">
C:\Path With Spaces\ContactManagerDeployLog.txt
</LogFileLocation>
</PropertyGroup>
<Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted
-command "& {
&'$(ScriptLocation)'
'$(LogFileLocation)'
'$(MSDeployComputerName)'} "" />
</Target>
V tomto příkladu si všimněte, že:
- Všechny proměnné, jako jsou hodnoty parametrů a umístění spustitelného souboru Windows PowerShell, jsou deklarovány jako vlastnosti nástroje MSBuild.
- Jsou zahrnuty podmínky, které uživatelům umožní přepsat tyto hodnoty z příkazového řádku.
- Vlastnost MSDeployComputerName je deklarována jinde v souboru projektu.
Když tento cíl spustíte jako součást procesu sestavení, Windows PowerShell spustí příkaz a zapíše položku protokolu do souboru, který jste zadali.
Spuštění skriptu Windows PowerShell ve vzdáleném počítači
Windows PowerShell dokáže spouštět skripty ve vzdálených počítačích prostřednictvím Vzdálené správy systému Windows (WinRM). K tomu je potřeba použít rutinu Invoke-Command . To vám umožní spustit skript na jednom nebo více vzdálených počítačích bez kopírování skriptu do vzdálených počítačů. Všechny výsledky se vrátí do místního počítače, ze kterého jste skript spustili.
Poznámka
Než použijete rutinu Invoke-Command ke spuštění Windows PowerShell skriptů ve vzdáleném počítači, musíte nakonfigurovat naslouchací proces WinRM tak, aby přijímal vzdálené zprávy. Můžete to provést spuštěním příkazu winrm quickconfig na vzdáleném počítači. Další informace najdete v tématu Instalace a konfigurace pro vzdálenou správu systému Windows.
V okně Windows PowerShell byste ke spuštění skriptuLogDeploy.ps1 na vzdáleném počítači použili tuto syntaxi:
Invoke-Command –ComputerName 'REMOTESERVER1'
–ScriptBlock { &"C:\Path With Spaces\LogDeploy.ps1"
'C:\Path With Spaces\Log.txt'
'TESTWEB1' }
Poznámka
Existují různé jiné způsoby, jak použít Invoke-Command ke spuštění souboru skriptu, ale tento přístup je nejjednodušší, když potřebujete zadat hodnoty parametrů a spravovat cesty s mezerami.
Když tento příkaz spustíte z příkazového řádku, musíte vyvolat spustitelný soubor Windows PowerShell a pomocí parametru –command zadat pokyny:
powershell.exe –command
"& {Invoke-Command –ComputerName 'REMOTESERVER1'
–ScriptBlock { &'C:\Path With Spaces\LogDeploy.ps1'
'C:\Path With Spaces\Log.txt'
'TESTWEB1' } "
Stejně jako předtím musíte při spuštění příkazu z nástroje MSBuild zadat několik dalších přepínačů a umistit všechny rezervované znaky XML:
powershell.exe -NonInteractive -executionpolicy Unrestricted
-command "& Invoke-Command
–ComputerName 'REMOTESERVER1'
-ScriptBlock { &'C:\Path With Spaces\LogDeploy.ps1'
' C:\Path With Spaces\Log.txt '
'TESTWEB1' } "
Nakonec stejně jako předtím můžete použít úlohu Exec v rámci vlastního cíle MSBuild ke spuštění příkazu:
<Target Name="WriteLogEntry" Condition=" '$(WriteLogEntry)'!='false' ">
<PropertyGroup>
<PowerShellExe Condition=" '$(PowerShellExe)'=='' ">
%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
</PowerShellExe>
<ScriptLocation Condition=" '$(ScriptLocation)'=='' ">
C:\Path With Spaces\LogDeploy.ps1
</ScriptLocation>
<LogFileLocation Condition=" '$(LogFileLocation)'=='' ">
C:\Path With Spaces\ContactManagerDeployLog.txt
</LogFileLocation>
</PropertyGroup>
<Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted
-command "& invoke-command -scriptblock {
&'$(ScriptLocation)'
'$(LogFileLocation)'
'$(MSDeployComputerName)'}
""/>
</Target>
Když tento cíl spustíte jako součást procesu sestavení, Windows PowerShell spustí skript v počítači, který jste zadali v argumentu –název_počítače.
Závěr
Toto téma popisuje, jak spustit skript Windows PowerShell ze souboru projektu MSBuild. Tento přístup můžete použít ke spuštění skriptu Windows PowerShell, a to buď místně, nebo ve vzdáleném počítači, jako součást automatizovaného nebo jednokrokového procesu sestavení a nasazení.
Další čtení
Pokyny k podepisování skriptů Windows PowerShell a správě zásad spouštění najdete v tématu Spouštění skriptů Windows PowerShell. Pokyny ke spouštění příkazů Windows PowerShell ze vzdáleného počítače najdete v tématu Spouštění vzdálených příkazů.
Další informace o řízení procesu nasazení pomocí vlastních souborů projektu MSBuild najdete v tématech Principy souboru projektu a Principy procesu sestavení.