Skip to content

Using DataStar With Octopus

DataStar has full support for Octopus Deployments. Database scripts are packaged up into an archive (zip or nupkg). Generally this would be done by a CI server such as Azure Dev Ops, GitLab, Jenkins, BitBucket Pipelines. We provides some utilities to help simplify this process and if you are working with GIT we have a specific toolkit "GitSources.Tools" which can generate your package from a DataStar deployment file. The CI server pushes this package to Octopus (if using the internal library feed) or an alternative artifacts repository that is registered with Octopus.

Octopus is designed to have projects that deploy versions of the same artifact, for example by default it would assume that the package names would be consistent within the project and you would just have different versions. However if we did this then all packages would have the same name "database-scripts" for example. However we don't want this behaviour for DataStar as typically we would recommend using any agile planning tools and naming your packages inline with a user story reference. For example I might have a JIRA story to apply some specific changes to components with a reference of "DAT-34343". In this case we want to publish our artifact as DAT-343343.001.nupkg (using the reference as the package id and then appending a version number).

We can then use a feature in Octopus called dynamic package selection which allows you to use variables to select the package when your project is deployed. Note that this means Octopus cannot understand exactly which packages will be deployed and therefore prevents package retention policies from working properly for the built-in package feed, and on deployment targets. To dynamically select the package we create a variable that uses regular expressions to determine the package id and version automatically.

In most cases you will want to have two projects. One that will handle normal deployments and will have a normal lifecycle to control the deployment through target environments. The second will handle the deployment of reversal packages (assuming that you want to enable the reversal mode to automatically create rollback scripts). The second project will need a more flexible lifecycle so that you can deploy reversal scripts to a specific environment.

Getting Started

In addition to the package that contains the scripts to be deployed (created by your CI pipeline), you will also need the DataStar.Tools utility and a package containing your DataStar component templates (this is required for the reversal script generation).

DataStar.Tools

As a general rule installing tools manually to Octopus Tentacles is not ideal as it creates a maintenance burden and also can cause issues with backwards compatibility with older releases that may be dependant on an older version of the tools being used, For these reasons we strongly recommend that you deploy the DataStar.Tools as a NuGet package (it can be packages under a contents folder) so that you can push the package to the library feed and have Octopus pull in the correct version at deployment.

Here is an example of an Azure Dev Ops step which creates a package using a custom nuspec file:

- task: NuGetCommand@2
  displayName: "nuget pack"
  inputs:
    command: 'custom'
    arguments: 'pack $(build.sourcesdirectory)/src/DataStar.Tools/DataStar.Tools.nuspec -BasePath "$(build.artifactstagingdirectory)/output/src/DataStar.Tools" -Version "1.0.0" -OutputDirectory $(build.artifactstagingdirectory)/nuget -Verbosity Detailed'

And the custom nuspec file:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <!-- Required elements-->
    <id>DataStar.Tools</id>
    <version>$version$</version>
    <description>DataStar Command Line Interface</description>
    <authors>Absolute Technology Limited</authors>
    <title>DataStar.Tools</title>
    <copyright>Copyright Absolute Technology Ltd: All rights reserved</copyright>
    <dependencies></dependencies>
  </metadata>
  <files>
    <file src="**\*.*" target="content"/>
  </files>
</package>

DataStar Templates

You will probably be familiar with the DataStar templates as these have to be configured when you first set up DataStar. The templates are how you define the components that you want to version control and they are used by DataStar when creating the scripts.

If you use the rollback or reversal feature then DataStar will automatically generate the scripts to reverse your changes, and these will be created from the target environment immediately before running the deployment. To generate the reversal position DataStar needs access to the templates. For this reason we recommend packaging them up and pushing them to the library feed so that they are available.

Here is an example Azure Dev Ops step which creates the template package using a custom nuspec file:

- task: NuGetCommand@2
  inputs:
    command: custom
    arguments: pack $(build.sourcesdirectory)/package/templates.nuspec -BasePath "$(build.sourcesdirectory)/templates" -Version $(Build.BuildNumber) -OutputDirectory $(build.artifactstagingdirectory)/nuget -Verbosity Detailed

And the custom nuspec file:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <id>DataStar.Templates</id>
    <version>$version$</version>
    <description>DataStar Templates</description>
    <authors>Absolute Technology Limited</authors>
    <title>DataStar.Templates</title>
    <copyright>Copyright Absolute Technology Ltd: All rights reserved</copyright>
    <dependencies>
    </dependencies>
  </metadata>
  <files>
    <file src="**\*.xml" target="templates"/>
    <file src="**\*.sql" target="templates"/>
  </files>
</package>

Octopus Step Templates

We have created a step template that can be used with the DataStar.Tools package, this will expect a package feed to be configured for the DataStar.Tools library.

{
  "Id": "3080d706-1b1d-47d6-bcea-ff59a96a3cd9",
  "Name": "DataStar Release",
  "Description": "Execute the DataStar Release Process",
  "ActionType": "Octopus.Script",
  "Version": 1,
  "CommunityActionTemplateId": null,
  "Packages": [
    {
      "Id": "0b9459b0-0394-4a45-a0ef-1e1b8b573bb6",
      "Name": "DataStarPackage",
      "PackageId": null,
      "FeedId": "Feeds-1061",
      "AcquisitionLocation": "Server",
      "Properties": {
        "Extract": "True",
        "SelectionMode": "deferred",
        "PackageParameterName": "dsr-datastar-release",
        "Purpose": ""
      }
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptBody": "function Apply-CmdLineOptions ([System.Diagnostics.ProcessStartInfo]$startInfo, [string]$switchName, [string]$variableName, $variableValue)\n{\n    if (![string]::IsNullOrEmpty($variableValue)) \n\t{\n    \tif ($variableValue -eq $true)\n        {\t\n        \tWrite-Host \"Parameter [$variableName]: $variableValue\"\n        \t$startInfo.Arguments = $startInfo.Arguments + \" $switchName\"\n        }\n    \telseif ($variableValue -ne $false)\n    \t{\n        \tif($variablesTable.ContainsKey($variableValue))\n            {\n            \t$variableValue = $variablesTable[$variableValue]\n            }\n            Write-Host \"Parameter [$variableName]: $variableValue\"\n\t\t\t$startInfo.Arguments = $startInfo.Arguments + \" $switchName \"\"$variableValue\"\"\"\n    \t} \n    }\n}\n\n$failOnStderr = $true\n$WorkingDirectory = $OctopusParameters[\"dsr-workingDirectory\"]\n\n$variablesTable = @{}\n\n$variablesFile = $OctopusParameters[\"dsr-variables-file\"]\nif (![string]::IsNullOrEmpty($variablesFile)) \n{\n\t$JsonFileLocation = Join-Path -Path $WorkingDirectory -ChildPath $variablesFile\n\t$json = Get-Content $jsonFileLocation -Raw | ConvertFrom-Json\n\t[string[]]$variables = (($json | get-member -Name * -MemberType NoteProperty).Name)\n\tforeach ($v in $variables)\n\t{\n    \t$value = ($json.$v).Trim()\n    \tWrite-Host \"Setting up variable: $v : $value\"\n  \t\tSet-Variable -name $v -value $value -Force\n        Set-OctopusVariable -name $v -value ($json.$v)\n        $variablesTable.Add(\"#{$v}\", $value)\n\t}\n}\n\n$BasePath = $OctopusParameters[\"dsr-path\"]\nWrite-Host \"DataStar Release Base Path: $BasePath\"\n\n$startInfo = New-Object System.Diagnostics.ProcessStartInfo\n$startInfo.FileName = \"$($BasePath)/DataStar.Tools.exe\"\n$startInfo.RedirectStandardError = $true\n$startInfo.RedirectStandardOutput = $true\n$startInfo.StandardOutputEncoding = [System.Text.Encoding]::UTF8\n$startInfo.StandardErrorEncoding  = [System.Text.Encoding]::UTF8\n$startInfo.UseShellExecute = $false\n\nApply-CmdLineOptions $startInfo \"-db\" \"database\" $OctopusParameters[\"dsr-database\"]\nApply-CmdLineOptions $startInfo \"-en\" \"environmentName\" $OctopusParameters[\"dsr-environmentName\"]\nApply-CmdLineOptions $startInfo \"-cs\" \"connectionString\" $OctopusParameters[\"dsr-connectionString\"]\nApply-CmdLineOptions $startInfo \"-wl\" \"walletLocation\" $OctopusParameters[\"dsr-walletLocation\"]\nApply-CmdLineOptions $startInfo \"-ae\" \"auditEnabled\" $OctopusParameters[\"dsr-auditEnabled\"]\nApply-CmdLineOptions $startInfo \"-ah\" \"auditHistory\" $OctopusParameters[\"dsr-auditHistory\"]\nApply-CmdLineOptions $startInfo \"-ar\" \"auditReversal\" $OctopusParameters[\"dsr-auditReversal\"]\nApply-CmdLineOptions $startInfo \"-as\" \"auditSummary\" $OctopusParameters[\"dsr-auditSummary\"]\nApply-CmdLineOptions $startInfo \"-ao\" \"auditSchema\" $OctopusParameters[\"dsr-auditSchema\"]\nApply-CmdLineOptions $startInfo \"-ad\" \"auditDatabase\" $OctopusParameters[\"dsr-auditDatabase\"]\nApply-CmdLineOptions $startInfo \"-ai\" \"auditInitialize\" $OctopusParameters[\"dsr-auditInitialize\"]\nApply-CmdLineOptions $startInfo \"-lk\" \"licenseKey\" $OctopusParameters[\"dsr-licenseKey\"]\nApply-CmdLineOptions $startInfo \"-wi\" \"workItem\" $OctopusParameters[\"dsr-workItem\"]\nApply-CmdLineOptions $startInfo \"-vn\" \"version\" $OctopusParameters[\"dsr-version\"]\nApply-CmdLineOptions $startInfo \"-an\" \"artifactName\" $OctopusParameters[\"dsr-artifactName\"]\nApply-CmdLineOptions $startInfo \"-ri\" \"reversalId\" $OctopusParameters[\"dsr-reversalId\"]\nApply-CmdLineOptions $startInfo \"-re\" \"reversalEnabled\" $OctopusParameters[\"dsr-reversalEnabled\"]\nApply-CmdLineOptions $startInfo \"-mr\" \"manifestRegExp\" $OctopusParameters[\"dsr-manifestRegExp\"]\nApply-CmdLineOptions $startInfo \"-wd\" \"workingDirectory\" $OctopusParameters[\"dsr-workingDirectory\"]\nApply-CmdLineOptions $startInfo \"-td\" \"templateDirectory\" $OctopusParameters[\"dsr-templateDirectory\"]\nApply-CmdLineOptions $startInfo \"-st\" \"statementTimeout\" $OctopusParameters[\"dsr-statementTimeout\"]\nApply-CmdLineOptions $startInfo \"-rt\" \"rollbackTransaction\" $OctopusParameters[\"dsr-rollbackTransaction\"]\nApply-CmdLineOptions $startInfo \"-ds\" \"defaultSchema\" $OctopusParameters[\"dsr-defaultSchema\"]\nApply-CmdLineOptions $startInfo \"-dp\" \"deployPackage\" $OctopusParameters[\"dsr-deployPackage\"]\nApply-CmdLineOptions $startInfo \"-pf\" \"packageFile\" $OctopusParameters[\"dsr-packageFile\"]\nApply-CmdLineOptions $startInfo \"-pa\" \"packageAuthor\" $OctopusParameters[\"dsr-packageAuthor\"]\nApply-CmdLineOptions $startInfo \"-ps\" \"packageDescription\" $OctopusParameters[\"dsr-packageDescription\"]\nApply-CmdLineOptions $startInfo \"-pv\" \"packageVersion\" $OctopusParameters[\"dsr-packageVersion\"]\nApply-CmdLineOptions $startInfo \"-pd\" \"packageDirectory\" $OctopusParameters[\"dsr-packageDirectory\"]\nApply-CmdLineOptions $startInfo \"-pi\" \"packageInvariant\" $OctopusParameters[\"dsr-packageInvariant\"]\nApply-CmdLineOptions $startInfo \"-pu\" \"packageUri\" $OctopusParameters[\"dsr-packageUri\"]\nApply-CmdLineOptions $startInfo \"-px\" \"packageApiKey\" $OctopusParameters[\"dsr-packageApiKey\"]\nApply-CmdLineOptions $startInfo \"-ph\" \"packageApiKeyHeader\" $OctopusParameters[\"dsr-packageApiKeyHeader\"]\nApply-CmdLineOptions $startInfo \"-ta\" \"tnsAdmin\" $OctopusParameters[\"dsr-tnsAdmin\"]\nApply-CmdLineOptions $startInfo \"-ll\" \"logLevel\" $OctopusParameters[\"dsr-logLevel\"]\nApply-CmdLineOptions $startInfo \"-lf\" \"outputLogFile\" $OctopusParameters[\"dsr-logfile\"]\n\n$LogFile = $OctopusParameters[\"dsr-logfile\"]\nif (![string]::IsNullOrEmpty($LogFile)) \n{\n\tNew-OctopusArtifact $LogFile\n}\n\n$process = New-Object System.Diagnostics.Process\n$process.StartInfo = $startInfo\nWrite-Host $startInfo.Arguments\n    \n$stdoutResult = $stdout.Result\n$stderrResult = $stderr.Result\n\n# Creating string builders to store stdout and stderr.\n$oStdOutBuilder = New-Object -TypeName System.Text.StringBuilder\n$oStdErrBuilder = New-Object -TypeName System.Text.StringBuilder\n\n# Adding event handers for stdout and stderr.\n$sScripBlock = {\n\tif (! [String]::IsNullOrEmpty($EventArgs.Data)) {\n\t\tif($outputAsArtifacts -eq $true) \n\t\t{\n\t\t\t$Event.MessageData.AppendLine($EventArgs.Data)\n\t\t}\n\t\tif ($Event.SourceIdentifier -eq \"stdout\") \n\t\t{\n\t\t\tWrite-Host $EventArgs.Data\n\t\t}\n\t\tif ($Event.SourceIdentifier -eq \"stdwrn\") \n\t\t{\n\t\t\tWrite-Warning $EventArgs.Data\n\t\t}\n\t\tif ($Event.SourceIdentifier -eq \"stderr\") \n\t\t{\n\t\t\tWrite-Error $EventArgs.Data\n\t\t}\n\t}\n}\n\n$oStdOutEvent = Register-ObjectEvent -InputObject $process `\n\t-Action $sScripBlock -EventName 'OutputDataReceived' `\n    -MessageData $oStdOutBuilder -SourceIdentifier \"stdout\"\n    \n$sourceIdentifier = \"stdwrn\"\nif($failOnStderr) {\n\t$sourceIdentifier = \"stderr\"\n}\n\t\n$oStdErrEvent = Register-ObjectEvent -InputObject $process `\n\t-Action $sScripBlock -EventName 'ErrorDataReceived' `\n    -MessageData $oStdErrBuilder -SourceIdentifier $failOnStderr\n\t\t\n$process.Start() | Out-Null\n\n$process.BeginOutputReadLine()\n$process.BeginErrorReadLine()\n\t\n[Void]$process.WaitForExit()\n\ntry \n{\n\t# Unregistering events to retrieve process output.\n\tUnregister-Event -SourceIdentifier $oStdOutEvent.Name\n\tUnregister-Event -SourceIdentifier $oStdErrEvent.Name\n}\ncatch\n{\n}\n\nif($outputAsArtifacts -eq $true) \n{\n\tSet-Content -Path '$outputDir/stdout.txt' -Value $oStdOutBuilder\n\tSet-Content -Path '$outputDir/stderr.txt' -Value $oStdErrBuilder\n}\n\n$exitCode = $process.ExitCode\n\ntry \n{\n\tif ($tempFormatFile -ne $null -and $tempFormatFile -ne '') \n\t{\n\t\t[System.IO.File]::Delete($tempFormatFile)\n\t}\n}\ncatch\n{\n}\n\nif($exitCode -ne 0)\n{\n\tif($failOnStderr) {\n\t\tWrite-Error \"DataStar.Release Error Exit Code $exitCode\"\n\t\texit 1\n\t}\n\telse\n\t{\n\t\tWrite-Warning \"DataStar.Release Error Exit Code $exitCode\"\n\t\texit 0\n\t}\n}\nelse \n{\n\tWrite-Host \"DataStar.Release Completed Successfully\"\n\texit 0\n}\n"
  },
  "Parameters": [
    {
      "Id": "0a8fc731-964f-44a8-9fe6-44cb8911d886",
      "Name": "dsr-database",
      "Label": "Target database (Oracle or Microsoft)",
      "HelpText": null,
      "DefaultValue": "Microsoft",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "45f25da0-4c63-4d58-9355-5db598826abe",
      "Name": "dsr-environmentName",
      "Label": "The name of the database environment.",
      "HelpText": null,
      "DefaultValue": "#{Octopus.Environment.Name}",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "557493cf-3ab4-4936-859a-f080aa4975b0",
      "Name": "dsr-connectionString",
      "Label": "The connection string to connect to the target database.",
      "HelpText": null,
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "e419191b-c811-4264-aec7-07c1a74de4a5",
      "Name": "dsr-auditEnabled",
      "Label": "Enable writing details to the auditing tables.",
      "HelpText": null,
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Id": "b8946a15-4b63-40e7-8c8c-137be96cf63c",
      "Name": "dsr-auditHistory",
      "Label": "Audit History Table",
      "HelpText": "The name of the audit history table.",
      "DefaultValue": "ADS_DEPLOYMENT_HISTORY",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "c1087253-a552-4aa4-891c-12cfcc01c515",
      "Name": "dsr-auditReversal",
      "Label": "Audit Reversal Table",
      "HelpText": "The name of the audit reversal table.",
      "DefaultValue": "ADS_DEPLOYMENT_REVERSAL",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "9765f341-6cb3-42ba-944b-2accde9939b8",
      "Name": "dsr-auditSummary",
      "Label": "Audit Summary Table",
      "HelpText": "The name of the audit summary table.",
      "DefaultValue": "ADS_DEPLOYMENT_SUMMARY",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "69bc45c4-9af4-4c10-9893-a62a1cddacbf",
      "Name": "dsr-auditDatabase",
      "Label": "Audit Database",
      "HelpText": "The connected database for the audit tables (SQL Server Only and where the audit tables are being held in a different database)",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "bcf3d645-c569-4250-be03-2121bb7405da",
      "Name": "dsr-auditSchema",
      "Label": "Audit Schema",
      "HelpText": "The database schema where the audit tables are held.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "281c6308-9e38-42b6-937c-70751770b0e8",
      "Name": "dsr-auditInitialize",
      "Label": "Audit Initialize",
      "HelpText": "Create the audit tables if they don't exist.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Id": "22f2303f-f161-4f17-a4fb-751708b2ce30",
      "Name": "dsr-licenseKey",
      "Label": "License Key",
      "HelpText": "The software license key.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    },
    {
      "Id": "eb8335ee-1882-4b5d-b1c2-4a7c508fe541",
      "Name": "dsr-workItem",
      "Label": "Work Item / User Story",
      "HelpText": "The work item or user story reference.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "77b7dc3a-f5eb-4183-91ba-e5e3620ab9a9",
      "Name": "dsr-version",
      "Label": "Version",
      "HelpText": "The version number being released.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "07b9e2ef-e61d-4250-a6f2-1ad7d35b300d",
      "Name": "dsr-artifactName",
      "Label": "Artifact Name",
      "HelpText": "The artifact being deployed, when not specified the work item and version is used.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "f4dc1e5d-e1e8-4645-a219-9e5cfada6854",
      "Name": "dsr-reversalId",
      "Label": "Reversal Id",
      "HelpText": "The audit id of the changed being reversed. Not required if auditing is not enabled, specifying this value will provide a link on the audit table so it links back to the item being reversed.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "a96e2860-b113-49a3-9e53-706dbdcd8caf",
      "Name": "dsr-reversalEnabled",
      "Label": "Reversal Enabled",
      "HelpText": "Enable generation of the reversal scripts.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Id": "81b3769d-d8b5-4881-9f28-dce67536e0ca",
      "Name": "dsr-manifestRegExp",
      "Label": "Manifest Regular Expression",
      "HelpText": "The regular expression for matching the manifests.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "ae3f4ee6-1308-48cb-952f-8fa4d5adfea5",
      "Name": "dsr-workingDirectory",
      "Label": "Working Directory",
      "HelpText": "The directory path for the deployment packages or manifests.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "cea7b480-6516-4a7d-965e-776d7adf46f7",
      "Name": "dsr-outputDirectory",
      "Label": "Output Directory",
      "HelpText": "The output directory path for any outputs such as reversal scripts or packages.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "731a715e-bf44-438c-8411-b6f426896fe1",
      "Name": "dsr-templateDirectory",
      "Label": "Template Directory",
      "HelpText": "The template directory required for reversal scripts.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "fa7c772f-1c60-4ada-bcae-d3c4b975d660",
      "Name": "dsr-statementTimeout",
      "Label": "Statement Timeout",
      "HelpText": "The timeout in seconds to apply to the executing statements.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "6b05b5a1-9fb3-40f0-8ba8-072d11ea5e2e",
      "Name": "dsr-defaultSchema",
      "Label": "Default Schema",
      "HelpText": "The default schema for the deployment, this is ignored if the templates contain a schema.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "f91a4574-c23b-455e-9d7a-1ceaf2be8235",
      "Name": "dsr-deployPackage",
      "Label": "Deploy Package",
      "HelpText": "The package to deploy if deploying from a nuget package.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "9e3d8861-c9de-43e8-9a89-175f48831fa8",
      "Name": "dsr-packageFile",
      "Label": "Package File Name",
      "HelpText": "The reversal package file for the output nuget package.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "6a5c86df-e601-4ed7-8dfb-d10b48f0911c",
      "Name": "dsr-packageAuthor",
      "Label": "Package Author [Optional]",
      "HelpText": "The reversal package author for the output nuget package.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "870ebe78-cf8c-42cd-8050-694c71236e85",
      "Name": "dsr-packageId",
      "Label": "Package Id [Optional]",
      "HelpText": "The reversal package name for the output nuget package.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "3c352b7d-b23e-4836-9589-179c720d37c6",
      "Name": "dsr-packageVersion",
      "Label": "Package Version [Optional]",
      "HelpText": "The reversal package version for the output nuget package.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "6dfd1e4a-1be8-478c-bccb-adf336532e70",
      "Name": "dsr-packageDirectory",
      "Label": "Package Directory",
      "HelpText": "The reversal package output directory for the output nuget package.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "9652aecb-8dc2-4bbc-9291-580e6f9cd086",
      "Name": "dsr-packageInvariant",
      "Label": "Package Invariant",
      "HelpText": "Force a reversal package to be created even if no changes are applied.",
      "DefaultValue": "False",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Id": "d9c0b6b0-e11c-47d1-b9c8-5d63290b7232",
      "Name": "dsr-packageUri",
      "Label": "Package URI",
      "HelpText": "URI to publish reversal packages (zipped file or nuget) ",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "f0c71ea5-2777-42ec-af2f-70d73067f66d",
      "Name": "dsr-packageApiKey",
      "Label": "Package API Key",
      "HelpText": "API Key for publishing to the package repository.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      }
    },
    {
      "Id": "18e5f261-24b2-4f9a-b2c6-a33ad9b05b92",
      "Name": "dsr-packageApiKeyHeader",
      "Label": "API Key Header",
      "HelpText": "The API Key header such as \"Bearer\" or ''X-Octopus-ApiKey\"",
      "DefaultValue": "X-Octopus-ApiKey",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "305fc425-6626-4530-9fdb-fc61fa981c77",
      "Name": "dsr-tnsAdmin",
      "Label": "Tns Admin",
      "HelpText": "This property specifies the Oracle tnsnames.ora and/or sqlnet.ora directory location.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "2908425b-c213-4093-9ff7-818a003f48bc",
      "Name": "dsr-logLevel",
      "Label": "LogLevel",
      "HelpText": "Controls the logging level.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "34d0e59d-24e7-4abd-b55d-caca1c49364c",
      "Name": "dsr-walletLocation",
      "Label": "Wallet Location",
      "HelpText": "The wallet location used for Oracle connections.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "64030cb6-3124-4581-8a27-91b579c1ad8e",
      "Name": "dsr-path",
      "Label": "DataStar Path",
      "HelpText": null,
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "06fe11fd-cc82-46b3-8a48-e687353ab367",
      "Name": "dsr-variables-file",
      "Label": "Variables File",
      "HelpText": "A JSON file containing a flat file of variables (should not be nested)",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    },
    {
      "Id": "bf9257e5-d727-418c-b987-4b94edc58623",
      "Name": "dsr-datastar-release",
      "Label": "DataStar Package",
      "HelpText": "The package containing the DataStar Release tools.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Package"
      }
    },
    {
      "Id": "62d710da-3868-491d-a19c-6076f6fcecfe",
      "Name": "dsr-rollbackTransaction",
      "Label": "Rollback Transaction",
      "HelpText": null,
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      }
    },
    {
      "Id": "7eb9e34b-2ccf-4c1d-98e3-bbecfbf086ab",
      "Name": "dsr-logfile",
      "Label": "Output Log File",
      "HelpText": null,
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      }
    }
  ],
  "StepPackageId": "Octopus.Script",
  "$Meta": {
    "ExportedAt": "2022-02-23T22:00:22.239Z",
    "OctopusVersion": "2022.1.552",
    "Type": "ActionTemplate"
  },
  "LastModifiedBy": "Your GitHub Username",
  "Category": "other"
}