Run Entity Framework migrations (Update-Database)

Octopus.Script exported 2019-10-18 by rikrak belongs to ‘Entity Framework’ category.

Runs Update-Database to update the database to the latest Entity Framework migrations

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Path to EF Tools folder

EfToolsFolder

Please provide a full path to a folder where Migrate.exe (along with other EF files are contained, available from EF nuget package) on Tentacle

Base Directory

BaseDirectory = /bin

Path to where your application files are located. For ASP.NET applications this would be /bin

Site Path

NugetPackageStepName

Name of the previously-deployed package step that contains the applications files

Config File Name

configFileName = web.config

Name of your applications config file. For ASP.NET applications this would be web.config, for Windows Service applications this would be yourapplication.dll.config and for console applications this would be yourapplication.exe.config

Name of Assembly file with EF-Context

AssemblyDllName

Please provide a name of the assembly file where EF-context is stored

ConnectionStringName

ConnectionStringName

Name of the key in section in Web.Config

Script body

Steps based on this template will execute the following PowerShell script.

# A collection of functions that can be used by script steps to determine where packages installed
# by previous steps are located on the filesystem.
 
function Find-InstallLocations {
    $result = @()
    $OctopusParameters.Keys | foreach {
        if ($_.EndsWith('].Output.Package.InstallationDirectoryPath')) {
            $result += $OctopusParameters[$_]
        }
    }
    return $result
}
 
function Find-InstallLocation($stepName) {
    $result = $OctopusParameters.Keys | where {
        $_.Equals("Octopus.Action[$stepName].Output.Package.InstallationDirectoryPath",  [System.StringComparison]::OrdinalIgnoreCase)
    } | select -first 1
 
    if ($result) {
        return $OctopusParameters[$result]
    }
 
    throw "No install location found for step: $stepName"
}
 
function Find-SingleInstallLocation {
    $all = @(Find-InstallLocations)
    if ($all.Length -eq 1) {
        return $all[0]
    }
    if ($all.Length -eq 0) {
        throw "No package steps found"
    }
    throw "Multiple package steps have run; please specify a single step"
}

function Test-LastExit($cmd) {
    if ($LastExitCode -ne 0) {
        Write-Host "##octopus[stderr-error]"
        write-error "$cmd failed with exit code: $LastExitCode"
    }
}




$stepName = $OctopusParameters['NugetPackageStepName']

$stepPath = ""
if (-not [string]::IsNullOrEmpty($stepName)) {
    Write-Host "Finding path to package step: $stepName"
    $stepPath = Find-InstallLocation $stepName
} else {
    $stepPath = Find-SingleInstallLocation
}
Write-Host "Package was installed to: $stepPath"

$baseDirectory = $OctopusParameters['BaseDirectory']

$binPath = Join-Path $stepPath $baseDirectory

#Locate Migrate.exe
$efToolsFolder = $OctopusParameters['EfToolsFolder']
$originalMigrateExe = Join-Path $efToolsFolder "migrate.exe"

if (-Not(Test-Path $originalMigrateExe)){
    throw ("Unable to locate migrate.exe file. Specifed path $originalMigrateExe does not exist.")
}
Write-Host("Found Migrate.Exe from $originalMigrateExe")

$migrateExe = Join-Path $binPath "migrate.exe"
if (-Not(Test-Path $migrateExe)) {
    # Move migrate.exe to ASP.NET Project's bin folder as per https://msdn.microsoft.com/de-de/data/jj618307.aspx?f=255&MSPPError=-2147217396
    Copy-Item $originalMigrateExe -Destination $binPath
    Write-Host("Copied $originalMigrateExe into $binPath")
}

#Locate Assembly with DbContext class
$contextDllName = $OctopusParameters['AssemblyDllName']
$contextDllPath = Join-Path $binPath $contextDllName
if (-Not(Test-Path $contextDllPath)){
    throw ("Unable to locate assembly file with DbContext class. Specifed path $contextDllPath does not exist.")
}
Write-Host("Using $contextDllName from $contextDllPath")

#Locate web.config. Migrate.exe needs it for some reason, even if connection string is provided
$configFile = $OctopusParameters['ConfigFileName']
$configPath = Join-Path $stepPath $configFile
if (-Not(Test-Path $configPath)){
    throw ("Unable to locate config file. Specifed path $webConfigPath does not exist.")
}

$connectionStringName = $OctopusParameters['ConnectionStringName']

$migrateCommand = "& ""$migrateExe"" ""$contextDllName"" /connectionStringName=""$connectionStringName"" /startupConfigurationFile=""$configPath"" /startUpDirectory=""$binPath"" /Verbose"

Write-Host "##octopus[stderr-error]"        # Stderr is an error
Write-Host "Executing: " $migrateCommand
Write-Host 

Invoke-Expression $migrateCommand | Write-Host

# Remove migrate.exe from the bin folder as it is not part of the application
If (Test-Path $migrateExe)
{
  Write-Host "Deleting " $migrateExe
  Remove-Item $migrateExe
}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "a6cd35d6-164a-4e57-a0f8-0d327129783a",
  "Name": "Run Entity Framework migrations (Update-Database)",
  "Description": "Runs `Update-Database` to update the database to the latest Entity Framework migrations",
  "Version": 6,
  "ExportedAt": "2019-10-18T09:11:34.909Z",
  "ActionType": "Octopus.Script",
  "Author": "rikrak",
  "Parameters": [
    {
      "Name": "EfToolsFolder",
      "Label": "Path to EF Tools folder",
      "HelpText": "Please provide a full path to a folder where Migrate.exe (along with other EF files are contained, available from EF nuget package) on Tentacle",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "BaseDirectory",
      "Label": "Base Directory",
      "HelpText": "Path to where your application files are located. For ASP.NET applications this would be `/bin`",
      "DefaultValue": "/bin",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "NugetPackageStepName",
      "Label": "Site Path",
      "HelpText": "Name of the previously-deployed package step that contains the applications files",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "StepName"
      }
    },
    {
      "Name": "configFileName",
      "Label": "Config File Name",
      "HelpText": "Name of your applications config file. For ASP.NET applications this would be `web.config`, for Windows Service applications this would be `yourapplication.dll.config` and for console applications this would be `yourapplication.exe.config`",
      "DefaultValue": "web.config",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "AssemblyDllName",
      "Label": "Name of Assembly file with EF-Context",
      "HelpText": "Please provide a name of the assembly file where EF-context is stored",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Name": "ConnectionStringName",
      "Label": "ConnectionStringName",
      "HelpText": "Name of the key in <connectionStrings> section in Web.Config",
      "DefaultValue": null,
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptBody": "# A collection of functions that can be used by script steps to determine where packages installed\n# by previous steps are located on the filesystem.\n \nfunction Find-InstallLocations {\n    $result = @()\n    $OctopusParameters.Keys | foreach {\n        if ($_.EndsWith('].Output.Package.InstallationDirectoryPath')) {\n            $result += $OctopusParameters[$_]\n        }\n    }\n    return $result\n}\n \nfunction Find-InstallLocation($stepName) {\n    $result = $OctopusParameters.Keys | where {\n        $_.Equals(\"Octopus.Action[$stepName].Output.Package.InstallationDirectoryPath\",  [System.StringComparison]::OrdinalIgnoreCase)\n    } | select -first 1\n \n    if ($result) {\n        return $OctopusParameters[$result]\n    }\n \n    throw \"No install location found for step: $stepName\"\n}\n \nfunction Find-SingleInstallLocation {\n    $all = @(Find-InstallLocations)\n    if ($all.Length -eq 1) {\n        return $all[0]\n    }\n    if ($all.Length -eq 0) {\n        throw \"No package steps found\"\n    }\n    throw \"Multiple package steps have run; please specify a single step\"\n}\n\nfunction Test-LastExit($cmd) {\n    if ($LastExitCode -ne 0) {\n        Write-Host \"##octopus[stderr-error]\"\n        write-error \"$cmd failed with exit code: $LastExitCode\"\n    }\n}\n\n\n\n\n$stepName = $OctopusParameters['NugetPackageStepName']\n\n$stepPath = \"\"\nif (-not [string]::IsNullOrEmpty($stepName)) {\n    Write-Host \"Finding path to package step: $stepName\"\n    $stepPath = Find-InstallLocation $stepName\n} else {\n    $stepPath = Find-SingleInstallLocation\n}\nWrite-Host \"Package was installed to: $stepPath\"\n\n$baseDirectory = $OctopusParameters['BaseDirectory']\n\n$binPath = Join-Path $stepPath $baseDirectory\n\n#Locate Migrate.exe\n$efToolsFolder = $OctopusParameters['EfToolsFolder']\n$originalMigrateExe = Join-Path $efToolsFolder \"migrate.exe\"\n\nif (-Not(Test-Path $originalMigrateExe)){\n    throw (\"Unable to locate migrate.exe file. Specifed path $originalMigrateExe does not exist.\")\n}\nWrite-Host(\"Found Migrate.Exe from $originalMigrateExe\")\n\n$migrateExe = Join-Path $binPath \"migrate.exe\"\nif (-Not(Test-Path $migrateExe)) {\n    # Move migrate.exe to ASP.NET Project's bin folder as per https://msdn.microsoft.com/de-de/data/jj618307.aspx?f=255&MSPPError=-2147217396\n    Copy-Item $originalMigrateExe -Destination $binPath\n    Write-Host(\"Copied $originalMigrateExe into $binPath\")\n}\n\n#Locate Assembly with DbContext class\n$contextDllName = $OctopusParameters['AssemblyDllName']\n$contextDllPath = Join-Path $binPath $contextDllName\nif (-Not(Test-Path $contextDllPath)){\n    throw (\"Unable to locate assembly file with DbContext class. Specifed path $contextDllPath does not exist.\")\n}\nWrite-Host(\"Using $contextDllName from $contextDllPath\")\n\n#Locate web.config. Migrate.exe needs it for some reason, even if connection string is provided\n$configFile = $OctopusParameters['ConfigFileName']\n$configPath = Join-Path $stepPath $configFile\nif (-Not(Test-Path $configPath)){\n    throw (\"Unable to locate config file. Specifed path $webConfigPath does not exist.\")\n}\n\n$connectionStringName = $OctopusParameters['ConnectionStringName']\n\n$migrateCommand = \"& \"\"$migrateExe\"\" \"\"$contextDllName\"\" /connectionStringName=\"\"$connectionStringName\"\" /startupConfigurationFile=\"\"$configPath\"\" /startUpDirectory=\"\"$binPath\"\" /Verbose\"\n\nWrite-Host \"##octopus[stderr-error]\"        # Stderr is an error\nWrite-Host \"Executing: \" $migrateCommand\nWrite-Host \n\nInvoke-Expression $migrateCommand | Write-Host\n\n# Remove migrate.exe from the bin folder as it is not part of the application\nIf (Test-Path $migrateExe)\n{\n  Write-Host \"Deleting \" $migrateExe\n  Remove-Item $migrateExe\n}\n",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptSource": "Inline"
  },
  "Category": "Entity Framework",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/run-entity-framework-migrations.json",
  "Website": "/step-templates/a6cd35d6-164a-4e57-a0f8-0d327129783a",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Friday, October 18, 2019