logo头像

Edward.K Thinking

Azure DevOps 自動化建立Database版本差異化Script 簡化版

在之前打通自動化雲端部署到地端-自動化建立Database版本差異化Script這篇文章中介紹如何在DevOps中去自動化佈署或是建立佈署差異化的DB Script。在這本文中提到透過SQLpackage方式,且搭配相關參數來設定自動化的Script,雖然,並無錯誤,SQLpackage的指令太多,並非很容易去記住要怎樣應用


要讓這簡化的方式,就是產生publish.xml的DB佈署檔案,並且透過這個publish.xml把這些擾人的指令藉由UI介面就可以設定好,維護上也會比較簡單

建立publish.xml


要建立publish.xml非常簡單,在SQL Project內選擇發行資料庫,就會跳出要發行資料庫的介面設定


這時候選擇進階,就可以看到所有參數的設定。就可以依照自己的發行策略去訂定相關要佈署的條件。當都設定完成時候,會到前面視窗,把這資訊給儲存起來


就會產生一個佈署的publish.xml,在做自動化之前,則可以先透過此介面的產生指令碼發行測試一下跑出來的結果是否是自己所需要的

建立自動化佈署


因為已經是SQL Project,所以,在Azure DevOps的CI部分,就只要把專案給編譯完成,產生一個dacpac檔案。


當你有了dacpac後,重點就在於佈署的Scrip,在Azure DevOps依舊還是沒有一個好用的DB Task提供給我們去佈署DB或是產生差異化DB 佈署Script,所以,依舊採用PowerShell方式,是最通用也是最簡易的方式


因此這個Powershell寫法就簡單多了,如果今天是要產生差異化檔案,主要就是透過新版本的dacpac與資料庫結構進行比對,看那些是需要進行佈署的Script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#SQLpackage Path
$SQLPackagePath='sqlpackage.exe'

#Dacpac & release script Path
$DacpacPath=$args[0]
#擺放比較後差異化的Script檔案位置
$DBDifferentScript='D:\Diff\DB.sql'
"DACPAC Path:"+$DacpacPath

#DB Server Info
$DBServer='XXX'
$DBName='DBName'
$DBUserName='username'
$DBPwd='password'

#SQLPackage
$CompareCmd='/Profile:'+$args[1]

$SQLPackageCmd=' /action:Script /q:true /sourcefile:'+$DacpacPath+' /TargetServerName:'+$DBServer+' /targetdatabasename:'+$DBName+' /TargetUser:'+$DBUserName+' /TargetPassword:'+$DBPwd+' /outputpath:'+$DBDifferentScript+' /p:VerifyDeployment=false'
$SQLPackagePath=$SQLPackagePath+' --% '+$SQLPackageCmd+' '+$CompareCmd

#Run SQLPackage Command
Invoke-Expression $SQLPackagePath

其中,$args[0]是外部傳入dacpac檔案的位置,$args[1]則是外部傳入publish.xml的位置。這樣就可以簡單的完成指令了,如果今天不是要做差異化檔案,要直接就佈署到DB呢,也只要改動這個ps1的Script中的’$SQLPackageCmd`,改成

1
$SQLPackageCmd='/action:Publish /q:true /sourcefile:'+$DacpacPath+' /TargetServerName:'+$DBServer+' /targetdatabasename:'+$DBName+' /TargetUser:'+$DBUserName+' /TargetPassword:'+$DBPwd

就可以自動化佈署DB了。這樣就更加簡單可以進行DB自動化佈署了

參考資料


上一篇