在多个分片上运行脚本的VSTS构建任务

时间:2018-04-15 16:16:51

标签: azure-devops azure-sql-database azure-pipelines-build-task

我们使用Azure SQL数据库,并使用弹性库具有“分片”结构。我们正在开始过渡到Visual Studio Team Services,并希望使用他们的构建和发布流程来部署到开发和生产环境。

是否有构建任务将在我们所有的分片上执行SQL脚本(确保它成功运行并遵循一些重试条件)。脚本将是幂等的。

如果我们还可以拥有一个将从我们的EF实体模型生成SQL脚本的任务,那么奖励积分。如果没有,我的计划是找到一种方法来创建脚本作为构建过程的一部分,让版本执行它。

1 个答案:

答案 0 :(得分:1)

我可以帮助您使用构建/发布过程从EF模型生成SQL脚本。要达到你需要的目的:

  1. 将您的EF升级到6.2或更高版本。

  2. 获取" migrate.exe"来自" /packages/EntityFramework.6.2.0/tools /"并放入您的项目(不要忘记将属性更改为"始终复制"因此在构建过程中将与其他DLL一起复制)

  3. 创建将运行migrate.exe并在目标数据库上应用SQL scripr的PowerShell脚本。您的脚本可能如下所示

  4. param 
    (
        [string] [Parameter(Mandatory=$true)] $dbserver,
        [string] [Parameter(Mandatory=$true)] $dbname,
        [string] [Parameter(Mandatory=$true)] $dbserverlogin,
        [string] [Parameter(Mandatory=$true)] $dbserverpassword,
        [string] [Parameter(Mandatory=$true)] $rootPath,
        [string] [Parameter(Mandatory=$true)] $buildAliasName
    )
    
    & "$rootPath\migrate.exe" Context.dll /connectionProviderName="System.Data.SqlClient" /connectionString="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$dbname;Persist Security Info=False;User ID=$dbserverlogin;Password=$dbserverpassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" /startUpDirectory=$rootPath /verbose /scriptFile=1.SQL
    Write-Host "Running migration script..."
    & "SQLCMD" -S "$dbserver.database.windows.net" -U $dbserverlogin@$dbserver -P $dbserverpassword -d $dbname  -i 1.SQL
    

    其中Context.dll是包含EF数据上下文的程序集。脚本将运行migrate.exe,它将生成输出脚本到1.SQL文件。之后,它将使用SQLCMD.exe运行此脚本。请注意,默认情况下,使用VSTS中的HOSTED代理可以使用SQLCMD.exe。如果您正在使用" HOSTED 2017"比你需要指定SQLCMD.exe的完整路径(在写这条路径的时候是c:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE