開發管線中的 SqlPackage

SqlPackage 是命令列公用程式,可將數種資料庫開發工作自動化,而且能夠併入 CI/CD 管線。

虛擬環境

注意

建議針對管線自動化使用 SqlPackage 的獨立安裝,而非使用與其他應用程式配套的 SqlPackage 可執行檔,包括SQL Server Management Studio 或 Visual Studio。 SqlPackage 的獨立安裝會更頻繁地更新,而且不會繫結至其他應用程式的發行頻率。

在 Windows 上,SqlPackage 的獨立安裝位於路徑 C:\Program Files\Microsoft SQL Server\160\DAC\bin (DacFx.msi) 或 %USERPROFILE%\.dotnet\tools (dotnet 工具)。 在 Linux 上,SqlPackage 的獨立安裝可在路徑 ~/.dotnet/tools (dotnet 工具) 取得。 在 Windows 和 Linux 環境中,如果您下載適用於 .NET Core 的自封式.zip SqlPackage,您可以將可執行檔解壓縮到您選擇的位置。

受控虛擬環境

用於 GitHub Actions 所裝載的執行器與 Azure Pipelines VM 映像的虛擬環境,是在 runner-images \(英文\) GitHub 存放庫中管理的。 SqlPackage 包含在數個環境中,包括 windows-latestubuntu-latestrunner-images 中每個 SqlPackage 版本發行後的數週內會更新到映像中。

自我裝載虛擬環境

如果您在自我裝載的虛擬環境中使用 SqlPackage,例如自我裝載的 Azure DevOps 代理程式,建議您定期更新應用程式,以維護最新版本環境。

追蹤部署

有一些與 SqlPackage 相關的檔案可以擷取為管線成品,以建立管線執行重現性並改善部署追蹤。 實作和使用案例會因您的特定架構和自動化環境而有所不同。

  • Dacpac 檔案
  • 任何動作的診斷檔案輸出:在任何 SqlPackage 動作上使用 /DiagnosticsFile: 參數,請參閱下列範例
  • 在發佈動作之前,從指令碼動作輸出: 在叫用發行動作之前,請先使用指令碼 SqlPackage 動作

其他 SqlPackage 範例

檢查 SqlPackage 版本

在疑難排解工作期間,請務必了解正在使用的 SqlPackage 版本。 若要擷取此資訊,可以為管線新增步驟,以搭配 /version 參數執行 SqlPackage。 下面所提供的範例是以 Microsoft 與 GitHub 受控環境為基礎,自我裝載的環境針對工作目錄可能會有不同的安裝路徑。

Azure Pipelines

當 Azure 管線中利用 script \(英文\) 關鍵字時,便可以為 Azure 管線新增步驟以輸出 SqlPackage 版本號碼。

- script: SqlPackage /version
  workingDirectory: C:\Program Files\Microsoft SQL Server\160\DAC\bin\
  displayName: 'get sqlpackage version'

GitHub 動作

在 GitHub 動作工作流程中利用 run \(英文\) 關鍵字,便可以為 GitHub 動作新增步驟以輸出 SqlPackage 版本號碼。

- name: get sqlpackage version
  working-directory: C:\Program Files\Microsoft SQL Server\160\DAC\bin\
  run: ./SqlPackage /version

GitHub 動作輸出顯示組建編號 15.0.4897.1

取得管線代理程式中的 SqlPackage 診斷

SqlPackage 的診斷資訊可透過 /DiagnosticsFile 參數在命令列中使用,可用於 Azure Pipelines 和 GitHub Actions 等虛擬環境中。 診斷資訊會寫入工作目錄中的檔案。 檔案名由 /DiagnosticsFile 參數決定。

Azure Pipelines

/DiagnosticsFile 參數新增至 Azure Pipeline SqlAzureDacpacDeployment 組態中的 [其他 SqlPackage 引數] 欄位,會導致 SqlPackage 診斷資訊寫入指定的檔案。 在 SqlAzureDacpacDeployment 工作之後,您可以發佈管線成品,以在虛擬環境外部提供診斷檔案,如下列範例所示。

- task: SqlAzureDacpacDeployment@1
  inputs:
    azureSubscription: '$(azuresubscription)'
    AuthenticationType: 'server'
    ServerName: '$(servername)'
    DatabaseName: '$(databasename)'
    SqlUsername: '$(sqlusername)'
    SqlPassword: '$(sqladminpassword)'
    deployType: 'DacpacTask'
    DeploymentAction: 'Publish'
    DacpacFile: '$(Build.Repository.LocalPath)\$(dacpacname).dacpac'
    AdditionalArguments: '/DiagnosticsFile:$(System.DefaultWorkingDirectory)/output.log'
    IpDetectionMethod: 'AutoDetect'

- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(System.DefaultWorkingDirectory)/output.log'
    artifact: 'Diagnostic File'
    publishLocation: 'pipeline'

管線執行後,您可以從 [已發佈成品] 底下的 [執行摘要] 頁面下載診斷檔案。

GitHub 動作

/DiagnosticsFile 參數新增至 GitHub Action sql-action 組態中的 「arguments」 欄位會導致 SqlPackage 診斷資訊寫入指定的檔案。 在 sql-action 工作之後,您可以發佈成品,以在虛擬環境外部提供診斷檔案,如下列範例所示。

- name: Azure SQL Deploy
  uses: Azure/sql-action@v2
  with:
    # The connection string, including authentication information, for the Azure SQL Server database.
    connection-string: ${{ secrets.AZURE_SQL_CONNECTION_STRING }}
    # Path to DACPAC file to deploy
    path: .\DatabaseProjectAdventureWorksLT\bin\Release\DatabaseProjectAdventureWorksLT.dacpac
    action: publish
    # additional SqlPackage arguments
    arguments: /DiagnosticsFile:DatabaseProjectAdventureWorksLT/DiagnosticLog.log

- uses: actions/upload-artifact@v2
  with:
    name: 'DiagnosticLog.txt'
    path: 'DatabaseProjectAdventureWorksLT/DiagnosticLog.log'

更新管線代理程式上的 SqlPackage

在某些情況下,管線環境中安裝的目前 SqlPackage 版本可能不足。 如果無法直接修改環境,則可以使用其他步驟在管線執行期間安裝較新版本的 SqlPackage。 請務必先執行安裝步驟,再執行管線中的任何 DacPac 或 BacPac 作業。 此工作可以與檢查版本的步驟結合,以確保升級如預期般完成。

Azure Pipelines

PowerShell 工作用於 Azure Pipeline 時,可以將步驟新增至 Azure Pipeline,以下載所需的 MSI,並以無訊息方式安裝。

- task: PowerShell@2
  displayName: 'upgrade sqlpackage'
  inputs:
    targetType: 'inline'
    script: |
      # use evergreen or specific dacfx msi link below
      wget -O DacFramework.msi "https://aka.ms/dacfx-msi"
      msiexec.exe /i "DacFramework.msi" /qn

下一步