Had to do this recently for a lot of test projects that were created in our Jira sandbox instance.
It’s a small python script using Jira API and the requests python library.
import requests
from requests.auth import HTTPBasicAuth
domain = "https://MY_JIRA_INSTANCE.atlassian.net"
admin_user = "JIRA_ADMIN@MY_COMPANY.com"
admin_token = "JIRA_ADMIN_TOKEN"
project_query = "PROJECTS_I_WANT_TO_DELETE"
def getJson(url, auth):
r = requests.request(
"GET",
url,
headers={"Accept": "application/json"},
auth=auth
)
return r.json()
def deleteProject(id, auth):
r = requests.request(
"DELETE",
domain + "/rest/api/3/project/" + id,
auth=auth
)
return r.text
search_url = domain + "/rest/api/3/project/search?query=" + project_query
auth = HTTPBasicAuth(admin_user, admin_token)
json = getJson(search_url, auth)
projectIds = []
# append results across all pages, while there's still a nextPage, to projectIds array
while "nextPage" in json:
nextUrl = json["nextPage"]
for searchResult in json['values']:
# optional safety check to make sure the right project is being added to the deletion array
# if "PROJECT_NAME_I_INTEND_TO_DELETE" in searchResult["name"]:
projectIds.append(searchResult['id'])
print("Number of project IDs found matching the search query: " + str(len(projectIds)))
json = getJson(nextUrl, auth)
# append a single page, or the last page of results, to projectIds array
for searchResult in json['values']:
# optional safety check to make sure the right project is being added to the deletion array
# if "PROJECT_NAME_I_INTEND_TO_DELETE" in searchResult["name"]:
projectIds.append(searchResult['id'])
print("Number of project IDs found matching the search query: " + str(len(projectIds)))
# delete projects in projectIds array
for index, id in enumerate(projectIds):
print("Deleting project " + id + ". Projects remaining: " + str(len(projectIds)-index))
print(deleteProject(id, auth))