在 Ubuntu 中构建 SQL 服务器数据库项目

Building SQL Server Database Project In Ubuntu

我正在构建一个 ASP.NET Core 2.0 Web API 应用程序,该应用程序托管在 Ubuntu 环境中。到目前为止,我在 Ubuntu.

中构建和 运行(对于 .NET Core 应用程序)取得了巨大成功

对于数据库,我的解决方案中包含一个 SqlProj。该项目包括表、SP 和 pre/post 部署脚本等典型内容。我正在使用以下命令(在我基于 Windows 的开发机器上)来构建和部署这个项目:

msbuild .\MyProject.DB.sqlproj /t:Build /t:Publish /P:SqlPublishProfilePath="./PublishProfiles/MyProject.DB.publish.xml"

当我采用这种方法时,一切都会正确构建和部署;但是,由于我将利用针对 Ubuntu 环境的 .NET Core CLI 命令 + CI/CD,我想做一些更像:

dotnet msbuild .\MyProject.DB.sqlproj /t:Build /t:Publish /P:SqlPublishProfilePath="./PublishProfiles/MyProject.DB.publish.xml"

在Windows中,我立即得到错误:

error MSB4019: The imported project "C:\Program Files\dotnet\sdk.1.4\Microsoft\VisualStudio\v11.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

基本上,我要问的是如何在 Ubuntu 环境中成功构建和部署 SqlProj 项目。我试过谷歌搜索,但到目前为止我的运气为零。我发现的所有类似问题都是针对那些正在编辑他们的 .proj 文件以针对他们的 VS 文件夹的 SSDT 的个人。所有这些人都在解决 Windows 中的问题。此方法在 Ubuntu 中不起作用,因为目标文件使用 Windows 注册表项。

编辑:我知道需要 SSDT 才能使用 MSBuild 执行此类部署。我没有发现 installing/using SSDT 在 Ubuntu 中甚至是可能的证据。如果不是,也许有其他解决方案?

仅供参考,我知道可以对 EF Core 使用代码优先方法。我正在尝试采用原始 SP 方法(以及利用索引)并改为使用 SqlProj 跟踪我的所有代码。这将全部存储并从 Git 存储库中 CI/CD 编辑。

无需安装 SSDT 即可使用此 NuGet 包进行部署 https://www.nuget.org/packages/Microsoft.Data.Tools.Msbuild 我不知道它是否会在 Ubuntu 上 运行 或完全与 dotnet cli

集成

我不能说这是否适用于 Ubuntu,但我们最近在未安装 SSDT 的 Windows 构建机器上使用 NuGet 包解决了这个问题上文提到的。突破来自拼凑下面文章中的细节,特别是将 SDK 与 MSBuild 一起使用需要设置环境变量才能工作。

https://blogs.msdn.microsoft.com/ssdt/2016/08/22/part-5-use-your-own-build-and-deployment-agent/

根据这些添加的信息,我们在解决方案文件夹的根目录中安装了 NuGet 包,然后在 PowerShell 中编写了构建脚本。该脚本首先设置环境变量,然后使用适当的输出目录在 SqlProj 文件上调用 MSBuild。我们并没有在那个时候专门发布,而是在我们的工作流中将工件发布到 Octopus Deploy 来进行实际部署。

同样,不确定它是否对 Ubuntu 有帮助,但认为额外的细节可能会有用。

我的 2020 年解决方案

我想在 2020 年重新审视这个问题,并更新我原来问题的答案。

我采用了不同的方法来构建部署 SQL 服务器项目。我目前的方法是构建一个使用 vs2017-win2016 代理的管道,并使用它来构建一个 .dacpac。从那里,您构建一个部署管道以将 dacpac(从您的工件丢弃)部署到 SQL 服务器实例。

这种方法更好地适应了 DevOps 方法并删除了与我以前的解决方案相关的手动过程。

您可以在此处阅读更多相关信息:

https://docs.microsoft.com/en-us/azure/devops/pipelines/apps/aspnet/build-aspnet-dacpac?view=azure-devops

作为替代方案,可以使用 dotnet cli 和 sqlpackage 实现此目的,如 here 所述,使用 MSBuild Sdk。

你基本上有一个数据库项目。我们称它为“DatabaseProject”。

您创建了一个新项目,它是一个您可以调用“DatabaseProject.Build”的 .NET 标准 C# 库。

然后你可以这样配置你DatabaseProject.Build.csproj:

<Project Sdk="MSBuild.Sdk.SqlProj/1.11.4">
   <PropertyGroup>
       <TargetFramework>netstandard2.0</TargetFramework>
       <Configurations>Debug;Release</Configurations>
   </PropertyGroup>
   <ItemGroup>
       <Content Include="..\DatabaseProject\**\*.sql" />
       <Content Remove="..\DatabaseProject\bin\*.sql" />
       <Content Remove="..\DatabaseProject\**\*.PostDeployment.sql" />
       <PostDeploy Include="..\DatabaseProject\**\*.PostDeployment.sql" />
   </ItemGroup>
</Project>

注意 使用的版本 V1.11.4 是支持 visual studio 附带的当前 .NET SDK 的版本在编辑此 post 时。查看 the github repo 以获取适用于您的项目的最新 nuget 版本。

使用 dotnet build 将生成一个 dacpac,您可以将其用于 dotnet publish 或 sqlpackage

然后您可以发布给您的 SqlServer 实例。 如果您像我一样在 CI 中使用 linux 运行ner,您可能需要 SqlServer 身份验证方法,然后 运行

sqlpackage /Action:Publish \    
/SourceFile:\"DatabaseProject.Build/bin/Debug/netstandard2.0/DatabaseProject.Build.dacpac\" \
/TargetServerName:MyDatabaseServerName \
/TargetDatabaseName:MyDatabaseName \
/TargetUser:Username\
/TargetPassword:Password

或使用由 visual studio 生成的配置文件:

sqlpackage /Action:Publish /Profile:\"DatabaseProject/PublishProfile/MyProfile.publish.xml\" /SourceFile:\"DatabaseProject.Build/bin/Debug/netstandard2.0/DatabaseProject.Build.dacpac\"

dotnet publish /p:TargetServerName=MyServerName /p:TargetDatabaseName=MyDatabseName /p:TargetUser=<username> /p:TargetPassword=<password>

如前所述,在 linux 代理上构建 DacPac 文件的最简单方法是通过 MSBuild.Sdk.SqlProj 转到与.sqlproj文件并行的数据库项目目录,在其下创建一个类似DB.Build的目录创建DB.Build.csproj copy.pase内容如下

<Project Sdk="MSBuild.Sdk.SqlProj/1.1.0"> <!-- This will pull in the required tools and dependencies to build a .dacpac with .NET Core -->
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <Content Include="..\src\DB\masterdata\**\*.sql" /> <!-- link in the new .csproj to the .sql scripts in your existing database project -->
    </ItemGroup>
</Project>

在 运行 之后您会看到 dacpac 文件出现在 DB.Build/bin/Release/netstandard2.0/DB.Build.dacpac

这是我的构建代理输出(Ubuntu Azure devops 上的代理)

Starting: SQL DB build Release
==============================================================================
Task         : .NET Core
Description  : Build, test, package, or publish a dotnet application, or run a custom dotnet command
Version      : 2.187.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/build/dotnet-core-cli
==============================================================================
Info: .NET Core SDK/runtime 2.2 and 3.0 are now End of Life(EOL) and have been removed from all hosted agents. If you're using these SDK/runtimes on hosted agents, kindly upgrade to newer versions which are not EOL, or else use UseDotNet task to install the required version.
/opt/hostedtoolcache/dotnet/dotnet build /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/RecommenderAPI.DB.Build.csproj -dl:CentralLogger,"/home/vsts/work/_tasks/DotNetCoreCLI_5541a522-603c-47ad-91fc-a4b1d163081b/2.187.0/dotnet-build-helpers/Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll"*ForwardingLogger,"/home/vsts/work/_tasks/DotNetCoreCLI_5541a522-603c-47ad-91fc-a4b1d163081b/2.187.0/dotnet-build-helpers/Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" --configuration Release /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=/home/vsts/work/1/recommender-service-cicd/DacPac/
Microsoft (R) Build Engine version 16.5.0+d4cbfca49 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 51.72 ms for /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/RecommenderAPI.DB.Build.csproj.
  Using package name RecommenderAPI.DB.Build and version 1.0.0
  Using SQL Server version Sql150
  Deleting existing file /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/obj/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac
  Writing model to /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/obj/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac
  RecommenderAPI.DB.Build -> /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/bin/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.71

Finishing: SQL DB build Release

Note: Make sure to restore you NuGet packages in step prior to build

A​​zure Data Studio 现在有一个扩展,允许您使用 dotnet 工具构建数据库项目 (sqlproj)。构建项目背后的大脑在于 SQL 服务器工具包,扩展从中获取所需的“BuildDirectory”DLL 和目标依赖项。

虽然没有记录,但如果您想在 Azure Data Studio 之外完全无头地设置它,您可以遵循他们的 CLI 指南,https://docs.microsoft.com/en-us/sql/azure-data-studio/extensions/sql-database-project-extension-build-from-command-line?view=sql-server-ver15, but instead extract the necessary files from the RHEL release in https://github.com/microsoft/sqltoolsservice/releases,然后遵循扩展文档的其余部分。这是一个演示该方法的有效 Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:6.0

WORKDIR /app

RUN apt-get update \
    && apt-get install -y curl

# SSDT dlls and targets file used by Azure Data Studio Extension can be found in the SQL Tools Service project
RUN curl -sSL -o /tmp/sqltools.tar.gz https://github.com/microsoft/sqltoolsservice/releases/download/v3.0.0-release.181/Microsoft.SqlTools.ServiceLayer-rhel-x64-net6.0.tar.gz

# Extract files that are required per https://docs.microsoft.com/en-us/sql/azure-data-studio/extensions/sql-database-project-extension-build-from-command-line?view=sql-server-ver15

RUN mkdir /tmp/sqltools && tar -xzf /tmp/sqltools.tar.gz -C /tmp/sqltools && \
  mkdir /app/BuildDirectory && cd /tmp/sqltools && cp \
    Microsoft.Data.SqlClient.dll \
    Microsoft.Data.Tools.Schema.Sql.dll \
    Microsoft.Data.Tools.Schema.SqlTasks.targets \
    Microsoft.Data.Tools.Schema.Tasks.Sql.dll \
    Microsoft.Data.Tools.Utilities.dll \
    Microsoft.SqlServer.Dac.dll \
    Microsoft.SqlServer.Dac.Extensions.dll \
    Microsoft.SqlServer.TransactSql.ScriptDom.dll \
    Microsoft.SqlServer.Types.dll \
    System.ComponentModel.Composition.dll \
    System.IO.Packaging.dll \
  /app/BuildDirectory && \
  rm -r /tmp/sqltools

#dotnet build your-database-project.sqlproj /p:NetCoreBuild=true /p:NETCoreTargetsPath="/app/BuildDirectory"

末尾的注释命令显示了您可以在包含数据库项目的目录中的容器内 运行。

这也可以与使用 sqlpackage 的容器相结合,以实现完整的 dacpac 构建和发布自动化工具集。