首页 > 解决方案 > 有人可以为我提供 dbUP 迁移的 powershell 示例吗?

问题描述

我已经为.net core 2.0 中的数据库迁移制作了一个控制台应用程序。它运行完美,但现在我想在 jenkins 中使用 CI/CD 进行迁移。有人可以指导我。如果可能的话,powershell 运行 .net 核心控制台应用程序的例子会很棒。

标签: sql-serverasp.net-coremigrationdbup

解决方案


因此,当我为我的 CI 流程(即 TeamCity 和 Octopus Deploy)寻找做同样的事情时,我发现了这个问题,我想我会添加一个答案来帮助你,希望人们不会像我一样浪费太多时间这在未来。

我有一个 .NET Core 2.1 应用程序,它基本上以他们阅读文档页面上列出的方式使用 DbUp,然后使用以下命令构建:

dotnet.exe publish DbUpDemo\DbUpDemo.csproj --configuration Release

因为我没有进行自包含部署,所以我没有指定运行时,这意味着不会创建 exe,而是我们需要通过 dll 运行应用程序。

发布的结果被压缩(在我的例子中使用 octo),然后发布到服务器。

要使用 powershell 运行 DbUp,您需要在脚本文件(.ps1 扩展名)中包含以下行:

$dbUpDllPath = "\DbUpDemo.dll";
$dotNetCommand = "dotnet " + $dbUpDllPath;

iex $dotNetCommand

这假定脚本从与 dll 相同的目录运行:如果脚本与 dll 位于不同的文件夹中,您可以在 $dbUpDllPath 中设置完整路径(例如,如果您已将发布的文件夹解压缩到 c:\ temp\DbUpDemo 您将使用 $dbUpDllPath = "c:\temp\DbUpDemo\DbUpDemo.dll";)

您可以将此脚本添加到您的源代码管理中并确保在发布期间包含它(我没有这样做,因为我在将代码发布到服务器后使用在 Octopus 中运行脚本步骤)

有几点需要注意:

如果在发布期间未指定运行时,则需要确保在服务器上安装了适当的 .NET 核心运行时。

您可能需要注意注入配置的方式:我使用以下代码从 appsettings.json 文件中获取连接字符串:

 IConfiguration config = new ConfigurationBuilder()
                                .SetBasePath(Directory.GetCurrentDirectory())
                                .AddJsonFile("appsettings.json", true, true)
                                .Build();

string connectionString = config.GetConnectionString("DatabaseToUpdate");

这取决于当前目录中存在的 appsettings.json 文件,我发现如果脚本不包含在与 dll 和 json 文件相同的文件夹中,它将无法工作。一种方法是在执行之前设置脚本的位置

        Set-Location "c:\temp\DbUpDemo";

        $dbUpDllPath = "\DbUpDemo.dll";
        $dotNetCommand = "dotnet " + $dbUpDllPath;

        iex $dotNetCommand

或者,您可以将连接字符串作为参数传递给 dotnet 命令。


如果您使用运行脚本步骤,八达通特定用户的最后一件事可以使用以下脚本:

Set-Location $OctopusParameters['InstallationDirectory'];
Get-Location | Write-Host

$dbUpDllPath = $OctopusParameters['InstallationDirectory'] + "\DbUpDemo.dll";
dotnet $dbUpDllPath | Write-Host

需要注意的是,可以直接调用 dotnet 命令,而不必将其包装在调用命令中:我发现我的设置 Octopus 与调用命令不兼容(错误:术语 'dotnet c:\temp\ DbUpDemo\DbUpDemo.dll' 未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包含路径,请验证路径是否正确,然后重试。)但是直接调用 dotnet 命令(而不是将其包装在调用中)很有魅力。

另附注:在示例中,我使用了名为 InstallationDirectory 的 Octopus 变量,此运行脚本步骤和上一步(这是部署包步骤)使用该变量。


推荐阅读