Skip to content

Instantly share code, notes, and snippets.

@sguillope
Last active January 1, 2023 15:28
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save sguillope/001c1f5574be3be3a595 to your computer and use it in GitHub Desktop.
Save sguillope/001c1f5574be3be3a595 to your computer and use it in GitHub Desktop.
Script to delete all disabled branches of a Bamboo build plan.
#!/bin/bash -u
# Deletes all disabled branches of a Bamboo build plan
# -----------------------------------------------------------------------------
# Syntax:
# $0 {planKey}
# -----------------------------------------------------------------------------
# Purpose: Bamboo does not automatically delete plan branches when the
# corresponding branch in the repository gets deleted. Because Bamboo fails
# to pull from it, it disables the branch but keep it around forever.
# This script goes through all branches of a build plan and delete the ones
# that are disabled.
#
# Notes:
# - Script depends on jq library: https://github.com/stedolan/jq
# - The script will prompt for Bamboo credentials. The corresponding
# account must have admin access to the given plan.
# - Before running the script, change the value of `BAMBOO_BASE_URL` to
# the correct url of the bamboo instance.
# -----------------------------------------------------------------------------
# Copyright 2014 Lixar I.T. Inc.
# Author: Sylvain Guillopé <sguillope@lixar.com>
# -----------------------------------------------------------------------------
LC_COLLATE=C ; export LC_COLLATE
LANG=C ; export LANG
umask 022
function die {
[ -z "$1" ] || echo 1>&2 "[!] $1"
exit 1
}
[ -z "$1" ] && die "Usage: ./$(basename $0) {planKey}"
readonly PLAN_KEY="$1"
readonly MAX_BRANCH_RESULT="500"
readonly BAMBOO_BASE_URL="https://mybamboo.net"
readonly BAMBOO_GET_PLAN_URL="$BAMBOO_BASE_URL/rest/api/latest/plan/$PLAN_KEY?os_authType=basic&expand=branches&max-results=$MAX_BRANCH_RESULT"
readonly BAMBOO_DELETE_PLAN_URL="$BAMBOO_BASE_URL/chain/admin/deleteChain!doDelete.action?os_authType=basic"
# Ask for bamboo credentials
username=
password=
while [ -z "$username" ]; do
read -p "Bamboo username: " -s username
done
while [ -z "$password" ]; do
read -p "Bamboo password: " -s password
done
function fetch_plan {
echo $(curl --silent --user "$username:$password" --header "Accept: application/json" --header "X-Atlassian-Token: no-check" "$BAMBOO_GET_PLAN_URL")
}
function get_branch_lines {
echo "$1" | jq --compact-output '.branches.branch[]'
}
function delete_disabled_branches {
while read -r branch_line; do
if is_branch_disabled "$branch_line"; then
local branch_key=$(get_branch_key "$branch_line")
delete_branch "$branch_key"
fi
done <<< "$branch_lines"
}
function is_branch_disabled {
local enabled=$(echo $1 | jq '.enabled')
if [ "$enabled" == "false" ]; then
return 0
else
return 1
fi
}
function delete_branch {
local branch_key=$1
curl -qs --user "$username:$password" --header "X-Atlassian-Token: no-check" --data "buildKey=$branch_key" "$BAMBOO_DELETE_PLAN_URL"
}
function get_branch_key {
echo $1 | jq --raw-output '.key'
}
function main {
local plan_details=$(fetch_plan "$1")
local branch_lines=$(get_branch_lines "$plan_details")
delete_disabled_branches "$branch_lines"
}
main "$PLAN_KEY"
@amaltson
Copy link

Thanks for sharing, this was super useful!

@rcdailey
Copy link

I have written a python script to perform batch deletion of branches with many configurable options (disabled or enabled, regex matching on name, etc). See the script here:
https://gist.github.com/rcdailey/9eff84365ccd7e7c9108

@jkstrauss
Copy link

Very useful.

I forked this gist to improve speed. Feel free to merge any of my branches.

@kasabov
Copy link

kasabov commented Jul 13, 2017

--header "X-Atlassian-Token: no-check": did I get this right - you can disable XSRF protection on the client-side? how is this secure and why implement XSRF at all then?

@cmoetzing
Copy link

@kasabov Good question, wondering too.

As of bamboo 6.6 the URL to delete changed. See here. Implemented here.

@Hoopie
Copy link

Hoopie commented Jul 5, 2019

@cmoetzing - you script worked a charm for me on 6.5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment