Может кто-нибудь предоставить мне пример для powershell для переноса dbUP?
Я сделал консольное приложение для миграции базы данных в.net core 2.0. Он работает отлично, но теперь я хочу перейти на CI/CD в jenkins для миграции. Может ли кто-нибудь направить меня к тому же. и, если возможно, пример для PowerShell для запуска консольного приложения ядра.net будет отличным.
1 ответ
Таким образом, я нашел этот вопрос, когда искал, чтобы сделать то же самое для моего процесса CI (который является TeamCity и Octopus Deploy) и решил, что добавлю ответ, чтобы помочь, надеюсь, что люди не будут тратить столько времени, как я на это в будущем.
У меня есть приложение.NET Core 2.1, которое в основном использует DbUp способом, указанным на странице чтения документов, а затем построено с помощью следующей команды:
dotnet.exe publish DbUpDemo\DbUpDemo.csproj --configuration Release
Поскольку я не делаю автономное развертывание, я не указал время выполнения, что означает, что exe-файл не будет создан, но вместо этого нам нужно будет запустить приложение через dll.
Результаты публикации архивируются (в моем случае, используя octo), а затем отправляются на сервер.
Для запуска DbUp с помощью powershell вам понадобятся следующие строки в файле скрипта (расширение.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.
И последнее, что нужно конкретным пользователям Octopus: если вы используете шаг запуска скрипта, вы можете использовать следующий скрипт:
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'не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.) но непосредственный вызов команды dotnet (вместо ее оборачивания в вызове) сработал.
Также примечание: в примере я использую переменную Octopus с именем InstallationDirectory, которая используется на этом шаге сценария запуска и на предыдущем шаге (который является этапом развертывания пакета).