有人能为我提供dbhell migartion的PowerShell示例吗?

时间:2018-06-13 06:53:42

标签: sql-server asp.net-core migration dbup

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

1 个答案:

答案 0 :(得分:1)

因此,当我尝试为CI流程执行相同的操作(即TeamCity和Octopus Deploy)时,我发现了这个问题,并认为我会添加一个答案来提供帮助,因此希望人们不会浪费那么多时间我将来会这样做。

我有一个.NET Core 2.1应用程序,该应用程序基本上按照其read the docs page上列出的方式使用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 Core运行时。

您可能需要注意如何注入配置:我使用以下代码从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命令可以直接调用,而不必将其包装在invoke命令中:我发现我的设置Octopus在invoke命令中表现不佳(错误:术语'dotnet c: \ temp \ DbUpDemo \ DbUpDemo.dll无法识别为cmdlet,函数,脚本文件或可运行程序的名称。请检查名称的拼写,或者是否包含路径,请验证路径是否正确并尝试再次。)但是直接调用dotnet命令(而不是将其包装在调用中)确实很吸引人。

还有一个注意事项:在示例中,我使用一个名为InstallationDirectory的章鱼变量,此运行脚本步骤和上一步(这是部署程序包步骤)将使用该变量。