Octopus.Script exported 2020-08-20 by ApexSQLtechops belongs to ‘ApexSQL’ category.
The step will compare the database from a deployment package with the target database to create a schema synchronization script deployment resource
ApexSQL Diff is required
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Retrieve package from
PackageDownloadStepName =
Select the step from which the database package can be sourced
Export location
ExportPath =
The location for exported deployment resources. This path will be used in the “ApexSQL DevOps toolkit – Deploy” step.
SQL Server
ServerName =
Provide the SQL Server name for the deployment target database
Database
Database =
Provide the name of the target database which will be used for comparison with source schema located in the deployment package in order to generate deployment resource.
Username
Username =
The account name used for SQL authentication method. Windows authentication method with the account that runs the Tentacle service will be used for SQL Server connection if left empty
Password
Password =
Enter password for chosen account used for SQL authentication method. Leave empty if Windows authentication method is used
Project file path
ProjectFilePath =
Use to import schema comparison options and objects filter template created with ApexSQL Diff. Application defaults will be used if not provided
See also: How to narrow schema comparison and synchronization to affected objects only
Additional parameters
Additional =
Enter any CLI options switches used with ApexSQL Diff. Options will override existing options imported from project file
See also: ApexSQL Diff Command Line Interface (CLI) switches
Script body
Steps based on this template will execute the following PowerShell script.
function Get-ApexSQLToolLocation
{
param
(
[Parameter(Mandatory = $true)]
[String] $ApplicationName
)
$key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ApexSQL $($ApplicationName)_is1"
if (Test-Path "HKLM:\$Key")
{
$ApplicationPath = (Get-ItemProperty -Path "HKLM:\$key" -Name InstallLocation).InstallLocation
}
else
{
$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64)
$regKey= $reg.OpenSubKey("$key")
if ($regKey)
{
$ApplicationPath = $regKey.GetValue("InstallLocation")
}
else
{
$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry32)
$regKey= $reg.OpenSubKey("$key")
if ($regKey)
{
$ApplicationPath = $regKey.GetValue("InstallLocation")
}
else
{
return $null
}
}
}
if ($ApplicationPath)
{
return $ApplicationPath + "ApexSQL" + $ApplicationName.replace(' ','') + ".com"
}
}
function AddArtifact() {
Param(
[Parameter(Mandatory = $true)]
[string]$artifact
)
if (Test-Path $artifact) {
New-OctopusArtifact $artifact
}
}
function Get-ParamValue
{
param
(
[Parameter(Mandatory = $true)]
[String] $ParamName
)
if($OctopusParameters -and ($OctopusParameters["$($ParamName)"] -ne $null))
{
# set the variable value
return $OctopusParameters["$($ParamName)"]
}
else
{
# warning
return $null
}
}
$exportPath = Get-ParamValue -ParamName 'ExportPath'
$PackageDownloadStepName = Get-ParamValue -ParamName 'PackageDownloadStepName'
$s2 = Get-ParamValue -ParamName 'ServerName'
$d2 = Get-ParamValue -ParamName 'Database'
$u2 = Get-ParamValue -ParamName 'Username'
$p2 = Get-ParamValue -ParamName 'Password'
$projectFilePath = Get-ParamValue -ParamName 'ProjectFilePath'
$additional = Get-ParamValue -ParamName 'Additional'
$projectId = $OctopusParameters["Octopus.Project.Id"]
$releaseNumber = $OctopusParameters["Octopus.Release.Number"]
$nugetPackageId = $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Package.NuGetPackageId"]
$exportPath = Join-Path (Join-Path $exportPath $projectId) $releaseNumber
if (-Not (Test-Path $exportPath)) { New-Item $exportPath -ItemType Directory }
$FolderList = Get-ChildItem $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath"] -Directory
Foreach($f in $Folderlist){
if ($f.Name -like '*Script*')
{
$DatabaseScripts = $f.Name
}
}
$sfPath = $OctopusParameters["Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath"] + '\' + $DatabaseScripts
if($null -eq $sfPath) {
throw "Step: '$PackageDownloadStepName' didn't download any NuGet package."
}
$schemaSyncScript = "SchemaSyncScript.sql"
$schemaSyncSummary = "SchemaSyncSummary.log"
$schemaSyncReport = "SchemaSyncReport.html"
$creds2 = ''
if ($u2 -ne $null -and $p2 -ne $null)
{
$creds2 = "/user2:`"$($u2)`" /password2:`"$($p2)`""
}
$project = ''
if($projectFilePath -ne $null)
{
$project = "/project: `"$($projectFilePath)`""
}
$additionalParams = ''
if($additional -ne $null)
{
$additionalParams = $additional
}
$toolLocation = Get-ApexSQLToolLocation -ApplicationName 'Diff'
$toolParams = " /sf1:`"$($sfPath)`" /server2:`"$($s2)`" /database2:`"$($d2)`" $($creds2)"
$toolParams += " /ot:sql /on:`'$($exportPath)\$($schemaSyncScript)`'"
$toolParams += " /ot2:html /on2:`"$($exportPath)\$($schemaSyncReport)`""
$toolParams += " /cso:`"$($exportPath)\$($schemaSyncSummary)`""
$toolParams += " $($project)"
$toolParams += " $($additionalParams) /v /f"
Invoke-Expression -Command ("& `"$($toolLocation)`" $toolParams")
AddArtifact("$exportPath\$schemaSyncScript")
AddArtifact("$exportPath\$schemaSyncSummary")
AddArtifact("$exportPath\$schemaSyncReport")
Provided under the Apache License version 2.0.
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
{
"Id": "3dfd5df3-2e9f-412b-93be-dcf4ef2d3da7",
"Name": "ApexSQL DevOps toolkit - Sync",
"Description": "The step will compare the database from a deployment package with the target database to create a schema synchronization script deployment resource\n\n[ApexSQL Diff](https://www.apexsql.com/sql-tools-diff.aspx) is required",
"Version": 2,
"ExportedAt": "2020-08-20T11:40:28.179Z",
"ActionType": "Octopus.Script",
"Author": "ApexSQLtechops",
"Packages": [],
"Parameters": [
{
"Id": "86778bfc-aab9-42ea-b67b-ee0c0fe1c203",
"Name": "PackageDownloadStepName",
"Label": "Retrieve package from",
"HelpText": "Select the step from which the database package can be sourced",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "StepName"
}
},
{
"Id": "fd75e328-92da-4e88-bb1c-35504fdccf15",
"Name": "ExportPath",
"Label": "Export location",
"HelpText": "The location for exported deployment resources. This path will be used in the “ApexSQL DevOps toolkit – Deploy” step. ",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "a487d044-8a82-4065-bb1d-d7ccb5a65468",
"Name": "ServerName",
"Label": "SQL Server",
"HelpText": "Provide the SQL Server name for the deployment target database",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "dca94a19-8d97-49b5-a4e5-21f32781df32",
"Name": "Database",
"Label": "Database",
"HelpText": "Provide the name of the target database which will be used for comparison with source schema located in the deployment package in order to generate deployment resource. ",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "5465f0aa-7b85-4020-99f9-a9f45f7b39b3",
"Name": "Username",
"Label": "Username",
"HelpText": "The account name used for SQL authentication method. Windows authentication method with the account that runs the Tentacle service will be used for SQL Server connection if left empty",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "5396a1bd-5f84-48cd-a452-135aa67a24a4",
"Name": "Password",
"Label": "Password",
"HelpText": "Enter password for chosen account used for SQL authentication method. Leave empty if Windows authentication method is used",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Id": "2a296435-ccf6-444d-8cb6-d0606eb1bce8",
"Name": "ProjectFilePath",
"Label": "Project file path",
"HelpText": "Use to import schema comparison options and objects filter template created with ApexSQL Diff. Application defaults will be used if not provided\n\nSee also:\n[How to narrow schema comparison and synchronization to affected objects only](https://knowledgebase.apexsql.com/narrow-schema-comparison-synchronization-affected-objects/)\n",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "e3cfcc10-1e5c-4554-83ca-0d9db66c7848",
"Name": "Additional",
"Label": "Additional parameters",
"HelpText": "Enter any CLI options switches used with ApexSQL Diff. Options will override existing options imported from project file\n\nSee also:\n[ApexSQL Diff Command Line Interface (CLI) switches](https://knowledgebase.apexsql.com/apexsql-diff-command-line-interface-cli-switches/)",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "MultiLineText"
}
}
],
"Properties": {
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "function Get-ApexSQLToolLocation\n{\n param\n (\n [Parameter(Mandatory = $true)]\n [String] $ApplicationName\n )\n $key = \"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ApexSQL $($ApplicationName)_is1\"\n if (Test-Path \"HKLM:\\$Key\")\n {\n\t\t$ApplicationPath = (Get-ItemProperty -Path \"HKLM:\\$key\" -Name InstallLocation).InstallLocation\n\t}\n else\n {\n\t\t$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64)\n\n\t\t$regKey= $reg.OpenSubKey(\"$key\")\n\t\tif ($regKey)\n {\n\t\t\t$ApplicationPath = $regKey.GetValue(\"InstallLocation\")\n\t\t}\n else\n {\n\t\t\t$reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry32)\n\t\t\t$regKey= $reg.OpenSubKey(\"$key\")\n\t\t\tif ($regKey)\n {\n\t\t\t\t$ApplicationPath = $regKey.GetValue(\"InstallLocation\")\n\t\t\t}\n else\n {\n return $null\n\t\t\t}\n\t\t}\n\t}\n if ($ApplicationPath)\n {\n return $ApplicationPath + \"ApexSQL\" + $ApplicationName.replace(' ','') + \".com\"\n }\n}\n\nfunction AddArtifact() {\n Param(\n [Parameter(Mandatory = $true)]\n [string]$artifact\n )\n if (Test-Path $artifact) {\n New-OctopusArtifact $artifact\n }\n}\n\nfunction Get-ParamValue\n{\n param\n (\n [Parameter(Mandatory = $true)]\n [String] $ParamName\n )\n if($OctopusParameters -and ($OctopusParameters[\"$($ParamName)\"] -ne $null))\n {\n # set the variable value\n return $OctopusParameters[\"$($ParamName)\"]\n }\n else\n {\n # warning\n return $null\n }\n}\n\n$exportPath = Get-ParamValue -ParamName 'ExportPath'\n$PackageDownloadStepName = Get-ParamValue -ParamName 'PackageDownloadStepName'\n$s2 = Get-ParamValue -ParamName 'ServerName'\n$d2 = Get-ParamValue -ParamName 'Database'\n$u2 = Get-ParamValue -ParamName 'Username'\n$p2 = Get-ParamValue -ParamName 'Password'\n$projectFilePath = Get-ParamValue -ParamName 'ProjectFilePath'\n$additional = Get-ParamValue -ParamName 'Additional'\n\n$projectId = $OctopusParameters[\"Octopus.Project.Id\"]\n$releaseNumber = $OctopusParameters[\"Octopus.Release.Number\"]\n$nugetPackageId = $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Package.NuGetPackageId\"]\n$exportPath = Join-Path (Join-Path $exportPath $projectId) $releaseNumber\n\nif (-Not (Test-Path $exportPath)) { New-Item $exportPath -ItemType Directory }\n\n$FolderList = Get-ChildItem $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath\"] -Directory\n\nForeach($f in $Folderlist){\nif ($f.Name -like '*Script*')\n\t{\n \t\t$DatabaseScripts = $f.Name\n \t}\n}\n\n$sfPath = $OctopusParameters[\"Octopus.Action[$PackageDownloadStepName].Output.Package.InstallationDirectoryPath\"] + '\\' + $DatabaseScripts\n\nif($null -eq $sfPath) {\n throw \"Step: '$PackageDownloadStepName' didn't download any NuGet package.\"\n}\n\n$schemaSyncScript = \"SchemaSyncScript.sql\"\n$schemaSyncSummary = \"SchemaSyncSummary.log\"\n$schemaSyncReport = \"SchemaSyncReport.html\"\n\n\n$creds2 = ''\nif ($u2 -ne $null -and $p2 -ne $null)\n{\n $creds2 = \"/user2:`\"$($u2)`\" /password2:`\"$($p2)`\"\"\n}\n\n$project = ''\nif($projectFilePath -ne $null)\n{\n $project = \"/project: `\"$($projectFilePath)`\"\"\n}\n\n$additionalParams = ''\nif($additional -ne $null)\n{\n $additionalParams = $additional\n}\n\n\n$toolLocation = Get-ApexSQLToolLocation -ApplicationName 'Diff'\n$toolParams = \" /sf1:`\"$($sfPath)`\" /server2:`\"$($s2)`\" /database2:`\"$($d2)`\" $($creds2)\"\n$toolParams += \" /ot:sql /on:`'$($exportPath)\\$($schemaSyncScript)`'\"\n$toolParams += \" /ot2:html /on2:`\"$($exportPath)\\$($schemaSyncReport)`\"\"\n$toolParams += \" /cso:`\"$($exportPath)\\$($schemaSyncSummary)`\"\"\n$toolParams += \" $($project)\"\n$toolParams += \" $($additionalParams) /v /f\"\n\nInvoke-Expression -Command (\"& `\"$($toolLocation)`\" $toolParams\")\n\nAddArtifact(\"$exportPath\\$schemaSyncScript\")\nAddArtifact(\"$exportPath\\$schemaSyncSummary\")\nAddArtifact(\"$exportPath\\$schemaSyncReport\")",
"Octopus.Action.EnabledFeatures": ""
},
"Category": "ApexSQL",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/apexsql-devops-toolkit-sync.json",
"Website": "/step-templates/3dfd5df3-2e9f-412b-93be-dcf4ef2d3da7",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Thursday, August 20, 2020