1. 程式人生 > 其它 >使用PowerShell自動部署ASP.NetCore程式到IIS

使用PowerShell自動部署ASP.NetCore程式到IIS

Windows PowerShell 是一種命令列外殼程式和指令碼環境,使命令列使用者和指令碼編寫者可以利用 .NET Framework的強大功能。有關於更多PowerShell的資訊,可參閱百度詞條

接下我們就要藉助PowerShell來自動部署ASP.NetCore程式。

開啟PowerShell

開啟開始選單,輸入 PowerShell 進行搜尋就可以看到它了

WebAdministration

首先我們要引入PowerShell中的WebAdministration模組,這樣就可以對IIS進行相關的操作了

Import-Module WebAdministration

DotNetCore.WindowsHosting

要在IIS中執行ASP.NetCore程式,首先要安裝DotNetCore.WindowsHosting,如果已經安裝,可以跳過該步驟

下載DotNetCore.WindowsHosting並安裝它

Invoke-WebRequest -Uri "https://aka.ms/dotnetcore.2.0.0-windowshosting" -OutFile "DotNetCore.WindowsHosting.exe"
Start-Process "DotNetCore.WindowsHosting.exe" -Wait

安裝完DotNetCore.WindowsHosting之後,要重啟IIS服務

Invoke-Expression "net stop was /y"
Invoke-Expression "net start w3svc"

可以使用以下命令來檢測ASPNetCoreModule是否已安裝

Get-WebGlobalModule -Name AspNetCoreModule -ErrorAction Ignore

程式部署,IIS設定

在IIS中部署程式要做兩件事件,1. 建立一個應用程式池,2. 建立一個網站並使用這個應用程式池

接下來要建立一個應用程式池,名稱為TestApp

New-Item -path IIS:AppPoolsTestApp

把應用程式池的.Net版本設定為無託管程式碼

Set-ItemProperty -Path IIS:AppPoolsTestApp -Name managedRuntimeVersion -Value ''

建立了應用程式池之後,就要建立一個網站,並使用剛建立的應用程式池TestApp,將網站的名稱設定為TestSite,並指向你的網站路徑如C:TestSite

New-Website -name TestSite -PhysicalPath "C:TestSite" -ApplicationPool TestApp -Port 8080

最後就可以開啟瀏覽器進行訪問了

Invoke-Expression "cmd.exe /C start http://localhost:8080"

完整指令碼

以上是在用PowerShell部署到IIS時的關鍵命令,知道了這些就可以來寫一個完整自動部署指令碼了。以部署ZKEACMS為例,建立一個名為ZKEACMS.ps1的檔案,並將以下程式碼貼上到檔案中儲存。

該指令碼中包含了對IIS的檢測,DotNetCore.WindowsHosting的檢測和安裝,線上下載程式並解壓等:

Add-Type -AssemblyName System.IO.Compression.FileSystem
Import-Module WebAdministration
$WebPath=[environment]::CurrentDirectory + "ZKEACMS";
Write-Host "Welcome to use ZKEACMS, visit our website(http://www.zkea.net) for more information"
Write-Host "ZKEACMS will install to $WebPath"
Write-Host "After installation, you can visit the site with http://localhost:8080"
Write-Host "Installation started. Press Ctrl+C to stop."

Write-Host "Checking IIS status..."
$iis = Get-Service W3SVC -ErrorAction Ignore
if($iis){
    if($iis.Status -eq "Running") {
        Write-Host "IIS Service is running"
    }
    else {
        Write-Host "IIS Service is not running"
    }
}
else {
	Write-Host "Checking IIS failed, please make sure IIS is ready."	
}
$aspNetCoreModule = Get-WebGlobalModule -Name AspNetCoreModule -ErrorAction Ignore
if($aspNetCoreModule)
{
	Write-Host "IIS ASPNetCoreModule is ready:"
	Write-Host $aspNetCoreModule.Name $aspNetCoreModule.Image 
}
else
{
	Write-Host "Downloading DotNetCore.WindowsHosting."
	if(Test-Path -Path "DotNetCore.WindowsHosting.exe")
	{
		Remove-Item -Path "DotNetCore.WindowsHosting.exe" -Force
	}
	Invoke-WebRequest -Uri "https://aka.ms/dotnetcore.2.0.0-windowshosting" -OutFile "DotNetCore.WindowsHosting.exe"
	
	Write-Host "Installing DotNetCore.WindowsHosting."
	Start-Process "DotNetCore.WindowsHosting.exe" -Wait
	if(Test-Path -Path "DotNetCore.WindowsHosting.exe")
	{
		Remove-Item -Path "DotNetCore.WindowsHosting.exe" -Force
	}
}

Write-Host "Downloading ZKEACMS application package."
if(Test-Path -Path "ZKEACMS.zip")
{
	Remove-Item -Path "ZKEACMS.zip" -Force
}
Invoke-WebRequest -Uri "http://cdn.zkeasoft.com/core/cms.zip" -OutFile "ZKEACMS.zip"

Write-Host "Unzip ZKEACMS application package."
if(Test-Path "ZKEACMS")
{
	Remove-Item -Path "ZKEACMS" -Force -Recurse
}
[System.IO.Compression.ZipFile]::ExtractToDirectory("ZKEACMS.zip" ,"ZKEACMS")

Write-Host "Setting up IIS."
if(!(Test-Path IIS:AppPoolsZKEACMS))
{
	New-Item -path IIS:AppPoolsZKEACMS
}
Set-ItemProperty -Path IIS:AppPoolsZKEACMS -Name managedRuntimeVersion -Value ''
if(Test-Path IIS:SitesZKEACMS)
{
	Remove-Website ZKEACMS
}
New-Website -name ZKEACMS -PhysicalPath $WebPath -ApplicationPool ZKEACMS -Port 8080
Invoke-Expression "net stop was /y"
Invoke-Expression "net start w3svc"
Invoke-Expression "cmd.exe /C start http://localhost:8080"
if(Test-Path -Path "ZKEACMS.zip")
{
	Remove-Item -Path "ZKEACMS.zip" -Force
}
Write-Host "ZKEACMS installed successfully."

執行指令碼

執行指令碼的方式很簡單,可以在PowerShell的控制檯中直接使用指令碼的名稱即可(注意路徑)

./ZKEACMS.ps1

或者可以直接滑鼠右鍵該指令碼檔案,然後選擇選單中的使用 PowerShell 執行

如果你的指令碼在網路上,可以直接在控制檯中使用以下指令碼來執行而不用下載它,例如可以使用以下指令碼來線上安裝ZKEACMS:

@powershell -NoProfile -ExecutionPolicy unrestricted -Command "&([scriptblock]::Create((Invoke-WebRequest -useb 'http://cdn.zkeasoft.com/core/win-zkeacms.ps1')))"

原文地址:http://www.zkea.net/codesnippet/detail/post-87