Octopus.Script exported 2022-09-08 by twerthi belongs to ‘Slack’ category.
Posts deployment status to Slack optionally including additional details (release number, environment name, release notes etc.) as well as error description and link to failure log page.
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Webhook URL
HookUrl
The Webhook URL provided by Slack, including token.
Channel handle
Channel
Which Slack channel to post notifications to.
Icon URL
IconUrl = https://octopus.com/content/resources/favicon.png
The icon to use for this user in Slack
Username = Octopus Deploy
The username shown in Slack against these notifications
Main message
DeploymentInfoText = #{Octopus.Project.Name} release #{Octopus.Release.Number} to #{Octopus.Environment.Name} (#{Octopus.Machine.Name})
Long information message shown in slack. This message is prefixed with “Deployed successfully” or “Failed to deploy” depending on status.
Include release number field
IncludeFieldRelease = false
Shows short field with release number name
Include release notes Field
IncludeFieldReleaseNotes = false
Release notes are only included on successful deployment
Include machine name field
IncludeFieldMachine = false
Shows short field with machine name
Include environment name field
IncludeFieldEnvironment = false
Shows short field with environment name
Include tenant name field
IncludeFieldTenant = false
Shows short field with name of tenant
Include username field
IncludeFieldUsername = false
Shows the username of user that initiated deployment
Include deployment process link on failure
IncludeLinkOnFailure = false
When deployment failed a link “Open process page” is added to the notification pointing to deployment process page
Include error message text on failure
IncludeErrorMessageOnFailure = false
When deployment failed error text is shown as part of notification
Octopus base url
OctopusBaseUrl
Base URL to add to the links in the notification. If octopus server dashboard is at “http://octopus/app” include all before the “app” part (“http://octopus”).
Script body
Steps based on this template will execute the following PowerShell script.
function Slack-Populate-StatusInfo ([boolean] $Success = $true) {
$deployment_info = $OctopusParameters['DeploymentInfoText'];
if ($Success){
$status_info = @{
color = "good";
title = "Success";
message = "$deployment_info";
fallback = "Deployed successfully $deployment_info";
success = $Success;
}
} else {
$status_info = @{
color = "danger";
title = "Failed";
message = "$deployment_info";
fallback = "Failed to deploy $deployment_info";
success = $Success;
}
}
return $status_info;
}
function Slack-Populate-Fields ($StatusInfo) {
# We use += instead of .Add() to prevent returning values returned by .Add() function
# it clutters the code, but seems the easiest solution here
$fields = @()
$fields +=
@{
title = $StatusInfo.title;
value = $StatusInfo.message;
}
;
$IncludeFieldEnvironment = [boolean]::Parse($OctopusParameters['IncludeFieldEnvironment'])
if ($IncludeFieldEnvironment) {
$fields +=
@{
title = "Environment";
value = $OctopusEnvironmentName;
short = "true";
}
;
}
$IncludeFieldMachine = [boolean]::Parse($OctopusParameters['IncludeFieldMachine'])
if ($IncludeFieldMachine) {
$fields +=
@{
title = "Machine";
value = $OctopusParameters['Octopus.Machine.Name'];
short = "true";
}
;
}
$IncludeFieldTenant = [boolean]::Parse($OctopusParameters['IncludeFieldTenant'])
if ($IncludeFieldTenant) {
$fields +=
@{
title = "Tenant";
value = $OctopusParameters['Octopus.Deployment.Tenant.Name'];
short = "true";
}
;
}
$IncludeFieldUsername = [boolean]::Parse($OctopusParameters['IncludeFieldUsername'])
if ($IncludeFieldUsername) {
$fields +=
@{
title = "Username";
value = $OctopusParameters['Octopus.Deployment.CreatedBy.Username'];
short = "true";
}
;
}
$IncludeFieldRelease = [boolean]::Parse($OctopusParameters['IncludeFieldRelease'])
if ($IncludeFieldRelease) {
$fields +=
@{
title = "Release";
value = $OctopusReleaseNumber;
short = "true";
}
;
}
$IncludeFieldReleaseNotes = [boolean]::Parse($OctopusParameters['IncludeFieldReleaseNotes'])
if ($StatusInfo["success"] -and $IncludeFieldReleaseNotes) {
$link = $OctopusParameters['Octopus.Web.ReleaseLink'];
$baseurl = $OctopusParameters['OctopusBaseUrl'];
$notes = $OctopusReleaseNotes
if ($notes.Length -gt 300) {
$shortened = $OctopusReleaseNotes.Substring(0,0);
$notes = "$shortened `n `<${baseurl}${link}|view all changes`>"
}
$fields +=
@{
title = "Changes in this release";
value = $notes;
}
;
}
#failure fields
$IncludeErrorMessageOnFailure = [boolean]::Parse($OctopusParameters['IncludeErrorMessageOnFailure'])
if (-not $StatusInfo["success"] -and $IncludeErrorMessageOnFailure) {
$fields +=
@{
title = "Error text";
value = $OctopusParameters['Octopus.Deployment.Error'];
}
;
}
$IncludeLinkOnFailure = [boolean]::Parse($OctopusParameters['IncludeLinkOnFailure'])
if (-not $StatusInfo["success"] -and $IncludeLinkOnFailure) {
$link = $OctopusParameters['Octopus.Web.DeploymentLink'];
$baseurl = $OctopusParameters['OctopusBaseUrl'];
$fields +=
@{
title = "See the process";
value = "`<${baseurl}${link}|Open process page`>";
short = "true";
}
;
}
return $fields;
}
function Slack-Rich-Notification ($Success)
{
$status_info = Slack-Populate-StatusInfo -Success $Success
$fields = Slack-Populate-Fields -StatusInfo $status_info
$payload = @{
channel = $OctopusParameters['Channel']
username = $OctopusParameters['Username'];
icon_url = $OctopusParameters['IconUrl'];
attachments = @(
@{
fallback = $status_info["fallback"];
color = $status_info["color"];
fields = $fields
};
);
}
#We unescape here to allow links in the Json, as ConvertTo-Json escapes <,> and other special symbols
$json_body = ($payload | ConvertTo-Json -Depth 4 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) });
try {
$invokeParameters = @{}
$invokeParameters.Add("Method", "POST")
$invokeParameters.Add("Body", $json_body)
$invokeParameters.Add("Uri", $OctopusParameters['HookUrl'])
$invokeParameters.Add("ContentType", "application/json")
# Check for UseBasicParsing
if ((Get-Command Invoke-RestMethod).Parameters.ContainsKey("UseBasicParsing"))
{
# Add the basic parsing argument
$invokeParameters.Add("UseBasicParsing", $true)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-RestMethod @invokeParameters
} catch {
echo "Something occured"
echo $_.Exception
echo $_
#echo $json_body
throw
}
}
$success = ($OctopusParameters['Octopus.Deployment.Error'] -eq $null);
Slack-Rich-Notification -Success $success
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": "07d64408-ac47-490e-ade2-01bab607ed4f",
"Name": "Slack - Detailed Notification",
"Description": "Posts deployment status to Slack optionally including additional details (release number, environment name, release notes etc.) as well as error description and link to failure log page.",
"Version": 10,
"ExportedAt": "2022-09-08T18:00:57.940Z",
"ActionType": "Octopus.Script",
"Author": "twerthi",
"Parameters": [
{
"Id": "635cd97f-f3aa-48a5-a165-839650921931",
"Name": "HookUrl",
"Label": "Webhook URL",
"HelpText": "The Webhook URL provided by Slack, including token.",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
},
"Links": {}
},
{
"Id": "14f5203e-4ce2-4ea2-ae25-379ef538e18b",
"Name": "Channel",
"Label": "Channel handle",
"HelpText": "Which Slack channel to post notifications to.",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "1ab73186-ab66-4be6-818f-f53a39f3f962",
"Name": "IconUrl",
"Label": "Icon URL",
"HelpText": "The icon to use for this user in Slack",
"DefaultValue": "https://octopus.com/content/resources/favicon.png",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "a746df23-8cd6-4084-8aea-3713b68b6ec5",
"Name": "Username",
"Label": "",
"HelpText": "The username shown in Slack against these notifications",
"DefaultValue": "Octopus Deploy",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
},
{
"Id": "b4918796-8fed-4074-bd3b-f84b555d1015",
"Name": "DeploymentInfoText",
"Label": "Main message",
"HelpText": "Long information message shown in slack. This message is prefixed with \"Deployed successfully\" or \"Failed to deploy\" depending on status.",
"DefaultValue": "#{Octopus.Project.Name} release #{Octopus.Release.Number} to #{Octopus.Environment.Name} (#{Octopus.Machine.Name})",
"DisplaySettings": {
"Octopus.ControlType": "MultiLineText"
},
"Links": {}
},
{
"Id": "60e51e4a-2741-4a36-aaf2-e040c19929d9",
"Name": "IncludeFieldRelease",
"Label": "Include release number field",
"HelpText": "Shows short field with release number name",
"DefaultValue": "false",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "6b383bdb-10b4-4e8b-bf8a-d4c257b0731b",
"Name": "IncludeFieldReleaseNotes",
"Label": "Include release notes Field",
"HelpText": "Release notes are only included on successful deployment",
"DefaultValue": "false",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "df788f61-b026-47da-8a0d-d79e8e48ea4c",
"Name": "IncludeFieldMachine",
"Label": "Include machine name field",
"HelpText": "Shows short field with machine name",
"DefaultValue": "false",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "7a88c0ce-9bd0-4ad3-af76-1d71c1d4f6e4",
"Name": "IncludeFieldEnvironment",
"Label": "Include environment name field",
"HelpText": "Shows short field with environment name",
"DefaultValue": "false",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "f25651aa-920c-4894-b2c6-a4a4c1c6a44d",
"Name": "IncludeFieldTenant",
"Label": "Include tenant name field",
"HelpText": "Shows short field with name of tenant",
"DefaultValue": "false",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "a929f109-b4ae-40f0-b5e5-b15c448ff672",
"Name": "IncludeFieldUsername",
"Label": "Include username field",
"HelpText": "Shows the username of user that initiated deployment",
"DefaultValue": "false",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "3bbe0522-ef27-4793-b249-c87242c818fb",
"Name": "IncludeLinkOnFailure",
"Label": "Include deployment process link on failure",
"HelpText": "When deployment failed a link \"Open process page\" is added to the notification pointing to deployment process page",
"DefaultValue": "false",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "d68b3d72-2944-4f57-bcb9-a96b388c5d0d",
"Name": "IncludeErrorMessageOnFailure",
"Label": "Include error message text on failure",
"HelpText": "When deployment failed error text is shown as part of notification",
"DefaultValue": "false",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
},
"Links": {}
},
{
"Id": "9672e4ab-fe66-4351-bf9b-78cac354d7b6",
"Name": "OctopusBaseUrl",
"Label": "Octopus base url",
"HelpText": "Base URL to add to the links in the notification. If octopus server dashboard is at \"http://octopus/app\" include all before the \"app\" part (\"http://octopus\").",
"DefaultValue": null,
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
},
"Links": {}
}
],
"Properties": {
"Octopus.Action.Script.ScriptBody": "function Slack-Populate-StatusInfo ([boolean] $Success = $true) {\n\n\t$deployment_info = $OctopusParameters['DeploymentInfoText'];\n\t\n\tif ($Success){\n\t\t$status_info = @{\n\t\t\tcolor = \"good\";\n\t\t\t\n\t\t\ttitle = \"Success\";\n\t\t\tmessage = \"$deployment_info\";\n\n\t\t\tfallback = \"Deployed successfully $deployment_info\";\n\t\t\t\n\t\t\tsuccess = $Success;\n\t\t}\n\t} else {\n\t\t$status_info = @{\n\t\t\tcolor = \"danger\";\n\t\t\t\n\t\t\ttitle = \"Failed\";\t\t\t\n\t\t\tmessage = \"$deployment_info\";\n\n\t\t\tfallback = \"Failed to deploy $deployment_info\";\t\n\t\t\t\n\t\t\tsuccess = $Success;\n\t\t}\n\t}\n\t\n\treturn $status_info;\n}\n\nfunction Slack-Populate-Fields ($StatusInfo) {\n\n\t# We use += instead of .Add() to prevent returning values returned by .Add() function\n\t# it clutters the code, but seems the easiest solution here\n\t\n\t$fields = @()\n\t\n\t$fields += \n\t\t@{\n\t\t\ttitle = $StatusInfo.title;\n\t\t\tvalue = $StatusInfo.message;\n\t\t}\n\t;\n\n\t$IncludeFieldEnvironment = [boolean]::Parse($OctopusParameters['IncludeFieldEnvironment'])\n\tif ($IncludeFieldEnvironment) {\n\t\t$fields += \n\t\t\t@{\n\t\t\t\ttitle = \"Environment\";\n\t\t\t\tvalue = $OctopusEnvironmentName;\n\t\t\t\tshort = \"true\";\n\t\t\t}\n\t\t;\t\n\t}\n\n\n\t$IncludeFieldMachine = [boolean]::Parse($OctopusParameters['IncludeFieldMachine'])\n\tif ($IncludeFieldMachine) {\n\t\t$fields += \n\t\t\t@{\n\t\t\t\ttitle = \"Machine\";\n\t\t\t\tvalue = $OctopusParameters['Octopus.Machine.Name'];\n\t\t\t\tshort = \"true\";\n\t\t\t}\n\t\t;\t\n\t}\t\n\t\n\t$IncludeFieldTenant = [boolean]::Parse($OctopusParameters['IncludeFieldTenant'])\n\tif ($IncludeFieldTenant) {\n\t\t$fields += \n\t\t\t@{\n\t\t\t\ttitle = \"Tenant\";\n\t\t\t\tvalue = $OctopusParameters['Octopus.Deployment.Tenant.Name'];\n\t\t\t\tshort = \"true\";\n\t\t\t}\n\t\t;\t\n\t}\t\n\t\n\t\t$IncludeFieldUsername = [boolean]::Parse($OctopusParameters['IncludeFieldUsername'])\n\tif ($IncludeFieldUsername) {\n\t\t$fields += \n\t\t\t@{\n\t\t\t\ttitle = \"Username\";\n\t\t\t\tvalue = $OctopusParameters['Octopus.Deployment.CreatedBy.Username'];\n\t\t\t\tshort = \"true\";\n\t\t\t}\n\t\t;\t\n\t}\t\n\t\n\t$IncludeFieldRelease = [boolean]::Parse($OctopusParameters['IncludeFieldRelease'])\n\tif ($IncludeFieldRelease) {\n\t\t$fields += \n\t\t\t@{\n\t\t\t\ttitle = \"Release\";\n\t\t\t\tvalue = $OctopusReleaseNumber;\n\t\t\t\tshort = \"true\";\n\t\t\t}\n\t\t;\t\n\t}\n\t\n\t\n\t$IncludeFieldReleaseNotes = [boolean]::Parse($OctopusParameters['IncludeFieldReleaseNotes'])\n\tif ($StatusInfo[\"success\"] -and $IncludeFieldReleaseNotes) {\n\t\n\t\t\n\t\t$link = $OctopusParameters['Octopus.Web.ReleaseLink'];\n\t\t$baseurl = $OctopusParameters['OctopusBaseUrl'];\n\t\t\n\t\t$notes = $OctopusReleaseNotes\n\t\t\n\t\tif ($notes.Length -gt 300) {\n\t\t\t$shortened = $OctopusReleaseNotes.Substring(0,0);\n\t\t\t$notes = \"$shortened `n `<${baseurl}${link}|view all changes`>\"\n\t\t}\n\t\t\n\t\t$fields += \n\t\t\t@{\n\t\t\t\ttitle = \"Changes in this release\";\n\t\t\t\tvalue = $notes;\n\t\t\t}\n\t\t;\t\n\t}\t\n\t\n\t#failure fields\n\t\n\t$IncludeErrorMessageOnFailure = [boolean]::Parse($OctopusParameters['IncludeErrorMessageOnFailure'])\n\tif (-not $StatusInfo[\"success\"] -and $IncludeErrorMessageOnFailure) {\n\t\t\t\n\t\t$fields += \n\t\t\t@{\n\t\t\t\ttitle = \"Error text\";\n\t\t\t\tvalue = $OctopusParameters['Octopus.Deployment.Error'];\n\t\t\t}\n\t\t;\t\n\t}\t\n\t\t\n\n\t$IncludeLinkOnFailure = [boolean]::Parse($OctopusParameters['IncludeLinkOnFailure'])\n\tif (-not $StatusInfo[\"success\"] -and $IncludeLinkOnFailure) {\n\t\t\n\t\t$link = $OctopusParameters['Octopus.Web.DeploymentLink'];\n\t\t$baseurl = $OctopusParameters['OctopusBaseUrl'];\n\t\n\t\t$fields += \n\t\t\t@{\n\t\t\t\ttitle = \"See the process\";\n\t\t\t\tvalue = \"`<${baseurl}${link}|Open process page`>\";\n\t\t\t\tshort = \"true\";\n\t\t\t}\n\t\t;\t\n\t}\n\t\n\t\n\treturn $fields;\n\t\n}\n\nfunction Slack-Rich-Notification ($Success)\n{\n $status_info = Slack-Populate-StatusInfo -Success $Success\n\t$fields = Slack-Populate-Fields -StatusInfo $status_info\n\n\t\n\t$payload = @{\n channel = $OctopusParameters['Channel']\n username = $OctopusParameters['Username'];\n icon_url = $OctopusParameters['IconUrl'];\n\t\t\n attachments = @(\n @{\n\t\t\t\tfallback = $status_info[\"fallback\"];\n\t\t\t\tcolor = $status_info[\"color\"];\n\t\t\t\n\t\t\t\tfields = $fields\n };\n );\n }\n\t\n\t#We unescape here to allow links in the Json, as ConvertTo-Json escapes <,> and other special symbols\n\t$json_body = ($payload | ConvertTo-Json -Depth 4 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) });\n\t\n\t\n try {\n \t$invokeParameters = @{}\n $invokeParameters.Add(\"Method\", \"POST\")\n $invokeParameters.Add(\"Body\", $json_body)\n $invokeParameters.Add(\"Uri\", $OctopusParameters['HookUrl'])\n $invokeParameters.Add(\"ContentType\", \"application/json\")\n \n # Check for UseBasicParsing\n if ((Get-Command Invoke-RestMethod).Parameters.ContainsKey(\"UseBasicParsing\"))\n {\n # Add the basic parsing argument\n $invokeParameters.Add(\"UseBasicParsing\", $true)\n }\n\n \n [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n Invoke-RestMethod @invokeParameters\n \n } catch {\n echo \"Something occured\"\n echo $_.Exception\n echo $_\n #echo $json_body\n throw\n }\n \n}\n\n\n\n$success = ($OctopusParameters['Octopus.Deployment.Error'] -eq $null);\n\nSlack-Rich-Notification -Success $success\n",
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.RunOnServer": "false",
"Octopus.Action.Script.ScriptFileName": null,
"Octopus.Action.Package.FeedId": null,
"Octopus.Action.Package.PackageId": null
},
"Category": "Slack",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/slack-detailed-notification.json",
"Website": "/step-templates/07d64408-ac47-490e-ade2-01bab607ed4f",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Thursday, September 8, 2022