在軟體的開發過程中,自動化的編譯和部署能夠帶來很多的優勢。下面我們聊聊如何自動釋出雲應用程式到 azure 上的 cloud services。
打包要釋出的內容
首先使用 msbuild 編譯 *.ccproj 檔案,我們需要使用生成產物中的:
app.publish\xxx.cspkg
app.publish\yyy.cscfg
下載 publishsettings 檔案
使用你的 Azure 賬號登入下面的地址,就可以下載 publishsettings 檔案(國際版):
https://manage.windowsazure.com/publishsettings/index
下載到的檔案的名字大概是這個樣子:
xxx1-31-2017-credentials.publishsettings
前面的 xxxx 是你的 subscription 名稱。
另一種方法是使用 powershell 命令 Get-AzurePublishSettingsFile 下載 publishsettings 檔案,過程和上面差不多。
安裝powershell的azure module
訪問 https://azure.microsoft.com/en-us/downloads/#cmd-line-tools, 點選 “Command-line tools->PowerShell” 下面的 “Windows install” 下載安裝包。
執行安裝包,安裝 azure modules。
建立自動釋出的指令碼
匯入 azure module
Import-Module Azure
設定指令碼中使用的變數
$package = app.publish\xxx.cspkg $configuration = app.publish\yyy.cscfg # subscription 名稱 $subscription = "your subscription name"; # service 名稱 $service = "your service name"; # storage account $storage = "your storage account"; # slot 名稱,一般會先發到 staging中,檢查後再進行切換 $slot = "Staging"; # 為每次釋出提供一個說明資訊 $deploymentLabel = “your demplyment label”
匯入 publish settings
publish settings 檔案中記錄了 subscription 資訊以及用於登入的驗證資訊,所以先要把這些資訊匯入進來。
Import-AzurePublishSettingsFile publishsettings-file-path
最好在匯入前能夠先檢查一下,看這個檔案對應的 subscription 是不是已經被匯入過了。
$thisSubscriptionExist = $False $subs = Get-AzureSubscription if($subs.Count -gt 0) { Foreach ($sub in $subs) { if($sub.SubscriptionName -eq $subscription) { $thisSubscriptionExist = $True } } }
如果不存在才執行匯入操作,否則直接進行下一步就行了。
if(!$thisSubscriptionExist) { Import-AzurePublishSettingsFile $subscriptionSetting // 為subscription 新增一個storage account Set-AzureSubscription -CurrentStorageAccount $storage -SubscriptionName $subscription }
設定當前的 subscription
從上一步中我們可以發現,你機器上可能同時儲存了多個 subscription 的資訊。那麼當我們執行釋出操作時,預設會使用哪個 subscription 的資訊呢?這裡有一個當前 subscription 的概念,釋出操作會使用當前 subscription 的資訊進行釋出。因此在釋出操作之前一定要設定本次釋出使用的 subscription 為當前 subscription。
Select-AzureSubscription -SubscriptionName $subscription –Current
檢查 deployment 是否存在
在執行部署前需要先檢查 deployment 是否存在,這會影響到後面的部署方式。如果 deployment 不存在,執行 New-AzureDeployment 命令。如果 deployment 已經存在,執行 Set-AzureDeployment 命令。
$deployment = Get-AzureDeployment -ServiceName $service -Slot $slot -ErrorVariable a -ErrorAction silentlycontinue if ($deployment.Name -ne $null) { # deployment已經存在,使用Set-AzureDeployment命令進行更新。 } else { # 需要使用New-AzureDeployment命令新建 deployment }
新建 deployment
New-AzureDeployment -Slot $slot -Package $package -Configuration $configuration -label $deploymentLabel -ServiceName $service; $completeDeployment = Get-AzureDeployment -ServiceName $service -Slot $slot; //檢查部署是否成功 $completeDeploymentID = $completeDeployment.deploymentid;
更新已經存在的部署
Set-AzureDeployment -Upgrade -Slot $slot -Package $package -Configuration $configuration -label $deploymentLabel -ServiceName $service -Force; $completeDeployment = Get-AzureDeployment -ServiceName $service -Slot $slot; //檢查部署是否成功 $completeDeploymentID = $completeDeployment.deploymentid;
從網站上檢視釋出結果
釋出完成後,我們也可以從網站上檢視一下發布的結果。
Deployment label 是我們在釋出指令碼中設定的,一般會寫入釋出日期和版本號。
Deployment ID 是標識本次部署的 GUID。
總結,powershell 的 azure 模組已經提供了很完善的命令供我們進行自動化的釋出使用,我們只要把這些命令組織成指令碼就可以了。