JIRA - Update Version Number
Octopus.Script exported 03/26/2019 by bobjwalker belongs to 'Other' category.
Update version to Jira tickets based on release number being deployed
Parameters
When steps based on the template are included in a project's deployment process, the parameters below can be set.
Username
The username of the account that will be used to update Jira ticket. The account should have sufficient permissions in JIRA to update ticket.
Password
The password of the account.
Version
The version that needs to updated to Fix Versions field in Jira ticket. If the version is not found, a new version will be created under respective project
JQL
The JIRA query that should be used to select issues that will be updated with Fix Versions (e.g. status = Completed AND Status = "Ready for Test Deploy")
Project Key
The project where version to be created
Get Versions API URL
API URL to get all the versions from a particular project.
Create Version API URL
API URL to create version on a particular project.
Script body
#require version 3.0
param (
[System.Uri]$Uri,
[string]$Jql,
[string]$Version,
[string]$User,
[string]$Password,
[string]$ProjectKey
)
$ErrorActionPreference = "Stop"
$AllProtocols = [System.Net.SecurityProtocolType]'Tls,Tls11,Tls12'
[Net.ServicePointManager]::SecurityProtocol = $AllProtocols
function Get-Param($Name, [switch]$Required, $Default) {
$result = $null
if ($OctopusParameters -ne $null) {
$result = $OctopusParameters[$Name]
}
if ($result -eq $null) {
$variable = Get-Variable $Name -EA SilentlyContinue
if ($variable -ne $null) {
$result = $variable.Value
}
}
if ($result -eq $null) {
if ($Required) {
throw "Missing parameter value $Name"
} else {
$result = $Default
}
}
return $result
}
function Jira-QueryApi
{
Param (
[Uri]$Query,
[string]$Username,
[string]$Password
);
Write-Host "Querying JIRA API $($Query.AbsoluteUri)"
# Prepare the Basic Authorization header - PSCredential doesn't seem to work
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $Username,$Password)))
$headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
# Execute the query
Invoke-RestMethod -Uri $Query -Headers $headers
}
function Jira-ExecuteApi
{
Param (
[Uri]$Query,
[string]$Body,
[string]$Username,
[string]$Password
);
Write-Host "Updating ticket : $($Query.AbsoluteUri)"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $Username,$Password)))
$headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
Invoke-RestMethod -Uri $Query -Headers $headers -UseBasicParsing -Body $Body -Method Put -ContentType "application/json"
}
function Jira-CreateVersion
{
Param (
[Uri]$Query,
[string]$Body,
[string]$Username,
[string]$Password
);
Write-Host "Creating a version $($Query.AbsoluteUri)"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $Username,$Password)))
$headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
Invoke-RestMethod -Uri $Query -Headers $headers -UseBasicParsing -Body $Body -Method Post -ContentType "application/json"
}
function Jira-GetVersions
{
Param (
[Uri]$VersionsUri,
[string]$Username,
[string]$Password
);
$versions = Jira-QueryApi -Query $VersionsUri -Username $Username -Password $Password
$versions
}
function Jira-PostUpdate
{
Param (
[Uri]$IssueUri,
[string]$Username,
[string]$Password,
[string]$Body
);
Jira-ExecuteApi -Query $IssueUri -Body $body -Username $Username -Password $Password
}
function Jira-UpdateTicket
{
Param (
[Uri]$BaseUri,
[Uri]$IssueUri,
[string]$Username,
[string]$Password,
[string]$Version,
[string]$ProjectKey,
[System.Uri]$GetVersionsAPIURL,
[System.Uri]$CreateVersionAPIURL
);
$query = $IssueUri.AbsoluteUri
$uri = [System.Uri] $query
$versionuri = $GetVersionsAPIURL
$createversionuri = $CreateVersionAPIURL
$versions = Jira-GetVersions -VersionsUri $versionuri -Username $Username -Password $Password
$match = $versions | Where name -eq $Version | Select -First 1
If ($match -ne $null)
{
$body = "{ ""update"" : { ""fixVersions"" : [ {""add"" : {""name"" : ""$Version""} } ] } }"
Jira-PostUpdate -IssueUri $uri -Body $body -Username $Username -Password $Password
}
else
{
$body = "{ ""name"": ""$Version"", ""project"": ""$ProjectKey""}"
Jira-CreateVersion -Query $createversionuri -Body $body -Username $Username -Password $Password
$body = "{ ""update"" : { ""fixVersions"" : [ {""add"" : {""name"" : ""$Version""} } ] } }"
Jira-PostUpdate -IssueUri $uri -Body $body -Username $Username -Password $Password
}
}
function Jira-UpdateTickets
{
Param (
[Uri]$BaseUri,
[string]$Username,
[string]$Password,
[string]$Jql,
[string]$Version,
[string]$ProjectKey,
[System.Uri]$GetVersionsAPIURL,
[System.Uri]$CreateVersionAPIURL
);
$api = New-Object -TypeName System.Uri -ArgumentList $BaseUri, ("/rest/api/2/search?jql=" + $Jql)
$json = Jira-QueryApi -Query $api -Username $Username -Password $Password
If ($json.total -eq 0)
{
Write-Output "No issues were found that matched your query : $Jql"
}
Else
{
ForEach ($issue in $json.issues)
{
Jira-UpdateTicket -BaseUri $BaseUri -IssueUri $issue.self -Version $Version -Username $Username -Password $Password -ProjectKey $ProjectKey -GetVersionsAPIURL $GetVersionsAPIURL -CreateVersionAPIURL $CreateVersionAPIURL
}
}
}
& {
param(
[System.Uri]$Uri,
[string]$Jql,
[string]$Version,
[string]$User,
[string]$Password,
[string]$ProjectKey,
[System.Uri]$GetVersionsAPIURL,
[System.Uri]$CreateVersionAPIURL
)
Write-Host "JIRA - Update Version Number"
Write-Host " Updating Fix Versions to : $Version"
try {
Jira-UpdateTickets -BaseUri $Uri -Jql $Jql -Version $Version -Username $User -Password $Password -ProjectKey $ProjectKey -GetVersionsAPIURL $GetVersionsAPIURL -CreateVersionAPIURL $CreateVersionAPIURL
} catch {
Write-Host -ForegroundColor Red "An error occurred while attempting to update Fix Versions in JIRA issues"
Write-Host -ForegroundColor Red $_.Exception | Format-List -Force
}
} `
(Get-Param "Jira.Version.Url" -Required) `
(Get-Param "Jira.Version.Query" -Required) `
(Get-Param "Jira.Version.Name" -Required) `
(Get-Param "Jira.Version.Username" -Required) `
(Get-Param "Jira.Version.Password" -Required) `
(Get-Param "Jira.Version.ProjectKey" -Required) `
(Get-Param "Jira.Version.GetVersionsAPIURL" -Required) `
(Get-Param "Jira.Version.CreateVersionAPIURL" -Required)
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
Show JSON{
"Id": "c691729f-685a-4339-bba9-716633b221ae",
"Name": "JIRA - Update Version Number",
"Description": "Update version to Jira tickets based on release number being deployed",
"Version": 2,
"ExportedAt": "2019-03-26T19:05:07.140Z",
"ActionType": "Octopus.Script",
"Author": "bobjwalker",
"Packages": [],
"Parameters": [
{
"Id": "4f231879-328a-4ea0-986c-aa6a2abf8e40",
"Name": "Jira.Version.Url",
"Label": "JIRA URL",
"HelpText": "The base URL of the JIRA Server (e.g. https://company.atlassian.net)",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "b16ac5da-e984-4f46-8cbd-793401be3a9b",
"Name": "Jira.Version.Username",
"Label": "Username",
"HelpText": "The username of the account that will be used to update Jira ticket. The account should have sufficient permissions in JIRA to update ticket.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "056b87ba-930c-4607-81e4-557503daa237",
"Name": "Jira.Version.Password",
"Label": "Password",
"HelpText": "The password of the account.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Id": "458dcb98-1843-41c7-bf22-c451a18aa693",
"Name": "Jira.Version.Name",
"Label": "Version",
"HelpText": "The version that needs to updated to Fix Versions field in Jira ticket. If the version is not found, a new version will be created under respective project",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "d7f0fddd-9518-4070-9c78-166b2dc67197",
"Name": "Jira.Version.Query",
"Label": "JQL",
"HelpText": "The JIRA query that should be used to select issues that will be updated with Fix Versions (e.g. status = Completed AND Status = \"Ready for Test Deploy\")",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "30334b2e-db2f-4a3e-878b-511686a58c9f",
"Name": "Jira.Version.ProjectKey",
"Label": "Project Key",
"HelpText": "The project where version to be created",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "d858e2de-4dcc-4b1f-bd56-f0cb4d11b347",
"Name": "Jira.Version.GetVersionsAPIURL",
"Label": "Get Versions API URL",
"HelpText": "API URL to get all the versions from a particular project.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "9747a96d-788e-45c7-816c-ee1bf91a6665",
"Name": "Jira.Version.CreateVersionAPIURL",
"Label": "Create Version API URL",
"HelpText": "API URL to create version on a particular project.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
}
],
"Properties": {
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.Script.ScriptBody": "#require version 3.0\n\nparam (\n [System.Uri]$Uri,\n [string]$Jql,\n [string]$Version,\n [string]$User,\n [string]$Password,\n [string]$ProjectKey \n)\n\n$ErrorActionPreference = \"Stop\"\n$AllProtocols = [System.Net.SecurityProtocolType]'Tls,Tls11,Tls12'\n[Net.ServicePointManager]::SecurityProtocol = $AllProtocols\n\nfunction Get-Param($Name, [switch]$Required, $Default) {\n $result = $null\n\n if ($OctopusParameters -ne $null) {\n $result = $OctopusParameters[$Name]\n }\n\n if ($result -eq $null) {\n $variable = Get-Variable $Name -EA SilentlyContinue \n if ($variable -ne $null) {\n $result = $variable.Value\n }\n }\n\n if ($result -eq $null) {\n if ($Required) {\n throw \"Missing parameter value $Name\"\n } else {\n $result = $Default\n }\n }\n\n return $result\n}\n\nfunction Jira-QueryApi\n{\n Param (\n [Uri]$Query,\n [string]$Username,\n [string]$Password\n );\n\n Write-Host \"Querying JIRA API $($Query.AbsoluteUri)\"\n\n # Prepare the Basic Authorization header - PSCredential doesn't seem to work\n $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((\"{0}:{1}\" -f $Username,$Password)))\n $headers = @{Authorization=(\"Basic {0}\" -f $base64AuthInfo)}\n\n # Execute the query\n Invoke-RestMethod -Uri $Query -Headers $headers\n}\n\nfunction Jira-ExecuteApi\n{\n Param (\n [Uri]$Query,\n [string]$Body,\n [string]$Username,\n [string]$Password\n );\n\n Write-Host \"Updating ticket : $($Query.AbsoluteUri)\"\n\n $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((\"{0}:{1}\" -f $Username,$Password)))\n $headers = @{Authorization=(\"Basic {0}\" -f $base64AuthInfo)}\n Invoke-RestMethod -Uri $Query -Headers $headers -UseBasicParsing -Body $Body -Method Put -ContentType \"application/json\"\n}\n\nfunction Jira-CreateVersion\n{\n Param (\n [Uri]$Query,\n [string]$Body,\n [string]$Username,\n [string]$Password\n );\n\n Write-Host \"Creating a version $($Query.AbsoluteUri)\"\n\n $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes((\"{0}:{1}\" -f $Username,$Password)))\n $headers = @{Authorization=(\"Basic {0}\" -f $base64AuthInfo)}\n Invoke-RestMethod -Uri $Query -Headers $headers -UseBasicParsing -Body $Body -Method Post -ContentType \"application/json\"\n}\n\nfunction Jira-GetVersions\n{\n Param (\n [Uri]$VersionsUri,\n [string]$Username,\n [string]$Password\n );\n\n $versions = Jira-QueryApi -Query $VersionsUri -Username $Username -Password $Password \n $versions\n}\n\nfunction Jira-PostUpdate\n{\n Param (\n [Uri]$IssueUri,\n [string]$Username,\n [string]$Password,\n [string]$Body\n );\n\n Jira-ExecuteApi -Query $IssueUri -Body $body -Username $Username -Password $Password\n}\n\nfunction Jira-UpdateTicket\n{\n Param (\n \t[Uri]$BaseUri,\n [Uri]$IssueUri,\n [string]$Username,\n [string]$Password,\n [string]$Version,\n [string]$ProjectKey,\n [System.Uri]$GetVersionsAPIURL,\n [System.Uri]$CreateVersionAPIURL \n );\n\n $query = $IssueUri.AbsoluteUri\n $uri = [System.Uri] $query\n\t\n $versionuri = $GetVersionsAPIURL\n $createversionuri = $CreateVersionAPIURL\n \n $versions = Jira-GetVersions -VersionsUri $versionuri -Username $Username -Password $Password\n \n $match = $versions | Where name -eq $Version | Select -First 1 \n \n If ($match -ne $null)\n { \n\t\t$body = \"{ \"\"update\"\" : { \"\"fixVersions\"\" : [ {\"\"add\"\" : {\"\"name\"\" : \"\"$Version\"\"} } ] } }\"\n Jira-PostUpdate -IssueUri $uri -Body $body -Username $Username -Password $Password \n } \n else\n {\n \t$body = \"{ \"\"name\"\": \"\"$Version\"\",\t\"\"project\"\": \"\"$ProjectKey\"\"}\"\n \tJira-CreateVersion -Query $createversionuri -Body $body -Username $Username -Password $Password\n \n $body = \"{ \"\"update\"\" : { \"\"fixVersions\"\" : [ {\"\"add\"\" : {\"\"name\"\" : \"\"$Version\"\"} } ] } }\"\n Jira-PostUpdate -IssueUri $uri -Body $body -Username $Username -Password $Password \n }\n}\n\nfunction Jira-UpdateTickets\n{\n Param (\n [Uri]$BaseUri,\n [string]$Username,\n [string]$Password,\n [string]$Jql,\n [string]$Version,\n [string]$ProjectKey,\n [System.Uri]$GetVersionsAPIURL,\n [System.Uri]$CreateVersionAPIURL \n );\n\n $api = New-Object -TypeName System.Uri -ArgumentList $BaseUri, (\"/rest/api/2/search?jql=\" + $Jql)\n $json = Jira-QueryApi -Query $api -Username $Username -Password $Password\n\n If ($json.total -eq 0)\n {\n Write-Output \"No issues were found that matched your query : $Jql\"\n }\n Else\n {\n ForEach ($issue in $json.issues)\n {\n Jira-UpdateTicket -BaseUri $BaseUri -IssueUri $issue.self -Version $Version -Username $Username -Password $Password -ProjectKey $ProjectKey -GetVersionsAPIURL $GetVersionsAPIURL -CreateVersionAPIURL $CreateVersionAPIURL\n }\n }\n}\n\n& {\n param(\n [System.Uri]$Uri,\n [string]$Jql,\n [string]$Version,\n [string]$User,\n [string]$Password,\n [string]$ProjectKey,\n [System.Uri]$GetVersionsAPIURL,\n [System.Uri]$CreateVersionAPIURL\n )\n\n Write-Host \"JIRA - Update Version Number\"\n Write-Host \" Updating Fix Versions to : $Version\"\n\n try {\n Jira-UpdateTickets -BaseUri $Uri -Jql $Jql -Version $Version -Username $User -Password $Password -ProjectKey $ProjectKey -GetVersionsAPIURL $GetVersionsAPIURL -CreateVersionAPIURL $CreateVersionAPIURL\n } catch {\n Write-Host -ForegroundColor Red \"An error occurred while attempting to update Fix Versions in JIRA issues\"\n Write-Host -ForegroundColor Red $_.Exception | Format-List -Force\n }\n} `\n(Get-Param \"Jira.Version.Url\" -Required) `\n(Get-Param \"Jira.Version.Query\" -Required) `\n(Get-Param \"Jira.Version.Name\" -Required) `\n(Get-Param \"Jira.Version.Username\" -Required) `\n(Get-Param \"Jira.Version.Password\" -Required) `\n(Get-Param \"Jira.Version.ProjectKey\" -Required) `\n(Get-Param \"Jira.Version.GetVersionsAPIURL\" -Required) `\n(Get-Param \"Jira.Version.CreateVersionAPIURL\" -Required)\n"
},
"Category": "Other",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates/jira-update-version.json",
"Website": "/step-templates/c691729f-685a-4339-bba9-716633b221ae",
"Logo": "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",
"$Meta": {
"Type": "ActionTemplate"
}
}Provided under the Apache License version 2.0.