Skip to content

Commit

Permalink
Merge pull request #9 from dfodorRH/main
Browse files Browse the repository at this point in the history
added script to clone feature with child epics
  • Loading branch information
dfodorRH authored Oct 10, 2023
2 parents 9068693 + 35773f1 commit 8db8438
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 0 deletions.
19 changes: 19 additions & 0 deletions jira-automation/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Installation

```bash
$ python3 -m venv virtualenv
$ source virtualenv/bin/activate
$ pip install jira
$ deactivate
```

# Usage

```bash
$ source virtualenv/bin/activate
# obtain your personal Jira access token here:
# https://issues.redhat.com/secure/ViewProfile.jspa?selectedTab=com.atlassian.pats.pats-plugin:jira-user-personal-access-tokens
$ export JIRA_TOKEN=...
$ python clone-feature-w-epics.py --feature RHTAP-383 --summary "New Team Enablement" --dry-run
$ deactivate
```
119 changes: 119 additions & 0 deletions jira-automation/clone-feature-w-epics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
#!/usr/bin/env python
"""
Description: Clone a feature and its child epics.
Author: rbean
"""

import argparse
import os
import pprint
import sys

import jira


def get_args():
"""
Parse args from the command-line.
"""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"--feature",
required=True,
help="Key of the feature id the epic should be attached to",
)
parser.add_argument(
"--summary",
required=True,
help="Summary of the new feature",
)
parser.add_argument(
"--dry-run",
action="store_true",
default=False,
help="Whether or not to take action on JIRA",
)
return parser.parse_args()


args = get_args()

url = os.environ.get("JIRA_URL", "https://issues.redhat.com")
token = os.environ.get("JIRA_TOKEN")
if not token:
print("Set JIRA_TOKEN environment variable to your JIRA personal access token")
sys.exit(1)

JIRA = jira.client.JIRA(server=url, token_auth=token)

print("Inspecting JIRA API.")
all_fields = JIRA.fields()
jira_name_map = {field["name"]: field["id"] for field in all_fields}
parent_key = jira_name_map["Parent Link"]
epic_name_key = jira_name_map["Epic Name"]

query = f"key={args.feature} and type=Feature"
print("Confirming the Feature exists:")
print(" > " + query)
results = JIRA.search_issues(query)
if not results:
print(f"Feature not found via query: {query}")
sys.exit(1)
origin_feature = results[0]


query = f"'Parent Link'={args.feature}"
print("Gathering child epics:")
print(" > " + query)
epics = JIRA.search_issues(query)
if not epics:
print(f"No child epics found via query: {query}")
sys.exit(1)

kwargs = {
"project": origin_feature.fields.project.key,
"summary": args.summary,
"issuetype": origin_feature.fields.issuetype.name,
"description": origin_feature.fields.description,
}
if not args.dry_run:
new_feature = JIRA.create_issue(**kwargs)
new_feature_key = new_feature.key
print(f"Created feature {new_feature}, as a copy of {origin_feature}")
print(f"https://issues.redhat.com/browse/{new_feature}")
if origin_feature.fields.labels:
new_feature.update(
{
"labels": origin_feature.fields.labels,
}
)
else:
print(f"Skipped creating clone of {origin_feature}")
print(f" Would have created:")
pprint.pprint(kwargs)
new_feature_key = "<unknown>"

for origin_epic in epics:
kwargs = {
"project": origin_epic.fields.project.key,
"summary": origin_epic.fields.summary,
"issuetype": origin_epic.fields.issuetype.name,
"description": origin_epic.fields.description or "",
epic_name_key: getattr(origin_epic.fields, epic_name_key),
parent_key: new_feature_key,
}
if not args.dry_run:
new_epic = JIRA.create_issue(**kwargs)
print(f"Created epic {new_epic}, as a copy of {origin_epic}")
if origin_epic.fields.labels:
new_epic.update(
{
"labels": origin_epic.fields.labels,
}
)
else:
print(f"Skipped creating clone of {origin_epic}")
print(f" Would have created:")
pprint.pprint(kwargs)

print("Done.")

0 comments on commit 8db8438

Please sign in to comment.