[TFS 2015] 實作 Build vNext + Release + SqlPackage 自動部署測試資料庫

續上篇,[TFS 2015] 實作 Build vNext + Release 自動部署至內部網站

我使用了 Build vNext + Release 將網站部署到了測試環境,缺少了網站所需要的資料庫,這裡我整理了一些手自動部署的方法

自動部署資料庫,要看團隊內的開發流程不適合使用,使用時要注意一下

本文連結

伺服器環境

  • Windows 2012 Datacenter x64 中文版
  • TFS 2015 Update 2.1 中文版

開發環境

  • Windows 10 x64 中文版
  • VS 2015 Update 1 英文版
  • SQL Server DataProject

手動部署

透過資料庫專案發行資料庫

如下圖:

 

透過網站應用程式 Publish 發行資料庫

如下圖:

目標網站必須要有 Web Deploy Service
https://dotblogs.com.tw/yc421206/archive/2013/03/15/96849.aspx
https://dotblogs.com.tw/yc421206/2014/01/21/141965
http://www.iis.net/learn/publish/using-web-deploy/configure-the-web-deployment-handler

UI介面無法進行自動化

 

使用指令碼部署

這裡我整理幾個我知道的方法

透過 MsBuild.exe 發行資料庫

為了排版所以斷行,msbuild 後面接的參數要在同一行,

set msbuild="%ProgramFiles(x86)%\MSBuild\14.0\Bin\msbuild.exe"
%msbuild% SQL Project Name.sqlproj 
/target:SqlDeploy 
/p:UseSandboxSettings=False 
/p:TargetDatabaseName=Database Name 
/p:TargetConnectionString="Data Source=(localdb)\mssqllocaldb;Integrated Security=True;Pooling=False" 
/p:DeployScriptFileName=ScriptFileName.sql 
/p:IncludeCompositeObjects=True 
/p:BlockOnPossibleDataLoss=True 
/p:CompareUsingTargetCollation=False 
/p:CreateNewDatabase=True 
/p:DeployDatabaseInSingleUserMode=False 
我要用 MsBuild 產生*.dacpac 檔,讓 SqlPackage 吃

 

透過 MsDeploy.exe 發行資料庫

由於犯懶,所以沒實作它,請參考以下:
https://technet.microsoft.com/zh-tw/library/dd569036(v=ws.10).aspx

 

透過 SqlPackage.exe 發行、比對資料庫

不同版本的 SqlPackage.exe 路徑會不一樣,要選擇正確的路徑

發行資料庫

為了排版所以斷行,sqlPackage 後面接的參數要在同一行

/SourceFile:這個參數吃 *.dacpac,Sql Server Database Build 會產生 ProjectName.dacpac

將以下內容存放在  TFS or Build Agent 的路徑下 C:\TfsBuildTasks\SqlDeployTask\Deploy.bat

@echo off
set server=%1
set databaseName=%2
set id=%3
set password=%4
set sourceFile=%5
set args=%6

set sqlPackage="%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage.exe"

echo sqlPackage = %sqlPackage%
echo server = %server%
echo databaseName = %databaseName%
echo id = %id%
echo sourceFile = %sourceFile%

%sqlPackage% 
/Action:Publish 
/SourceFile:%sourceFile% 
/TargetConnectionString:"data source=%server%;initial catalog=%databaseName%;User Id=%id%;Password=%password%;" 
%args%
用這個方法不需要再 Build一次,只需要把 ProjectName.dacpac  餵給 SourceFile 參數即可

調用時傳入相關參數,這裡我用『批次指令碼』 調用 Deploy.bat

 

比對資料庫

把 /Action:Publish 換成 /Action:Script

將以下內容存放在  TFS or Build Agent 的路徑下 C:\TfsBuildTasks\SqlDeployTask\Compare.bat

@echo off
set server=%1
set databaseName=%2
set id=%3
set password=%4
set sourceFile=%5
set outputFile=%6

set sqlPackage="%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage.exe"

echo server = %1
echo databaseName = %2
echo id = %3
echo sourceFile = %5
echo outputFile = %6
echo sqlPackage = %sqlPackage%

%sqlPackage% 
/Action:Script 
/Quiet:true 
/TargetServerName:"%server%" 
/TargetDatabaseName:"%databaseName%" 
/TargetUser:"%id%" 
/TargetPassword:"%password%" 
/SourceFile:"%sourceFile%" 
/OutputPath:"%outputFile%" 
/p:ScriptDatabaseCompatibility=false 
/p:BlockOnPossibleDataLoss=false 
/p:ExcludeObjectTypes=DatabaseRoles

 

調用時傳入相關參數,這裡我用『批次指令碼』 調用 Compare.bat

自動部署資料庫,要看團隊內的開發流程不適合使用,使用時要注意一下,我自己的做法是搭配 Release 的簽核機制

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo