This is an automated email from the ASF dual-hosted git repository. knaufk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/flink-jira-bot.git
commit 6f4e13c295cd09789d509db49496956751e7d9cd Author: Konstantin Knauf <[email protected]> AuthorDate: Fri Apr 9 13:42:42 2021 +0200 [FLINK-22032] add Rule 3 (logging only) --- Makefile | 2 +- README.md | 0 config.yaml | 6 ++++ flink_jira_bot.py | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 40ca9f7..677c9cc 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ $(VENV)/bin/activate: requirements.txt venv: $(VENV)/bin/activate run: venv - ./$(VENV)/bin/python3 flink_jira_bot/flink_jira_bot.py + ./$(VENV)/bin/python3 flink_jira_bot.py format: venv ./$(VENV)/bin/python3 -m black . diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..d77f815 --- /dev/null +++ b/config.yaml @@ -0,0 +1,6 @@ +stale_minor: + stale_days: 180 + warning_days: 7 + label: "stale-minor" + comment: 'This issue (and any of its Sub-Tasks) has not been updated for {stale_days} days. So, it has been labeled "{label}". If you are still affected by this bug or are still interested in this issue, please give an update and remove the label. In {warning_days} days the issue will be closed automatically.' + diff --git a/flink_jira_bot.py b/flink_jira_bot.py new file mode 100644 index 0000000..a092399 --- /dev/null +++ b/flink_jira_bot.py @@ -0,0 +1,90 @@ +from atlassian import Jira +import logging +import confuse +import os +import abc + + +class FlinkJiraRule: + __metaclass__ = abc.ABCMeta + + def __init__(self, jira_client, config): + self.jira_client = jira_client + self.config = config + + def has_recently_updated_subtask(self, parent, updated_within_days): + find_subtasks_updated_within = ( + f"parent = {parent} AND updated > startOfDay(-{updated_within_days}d)" + ) + issues = self.jira_client.jql(find_subtasks_updated_within, limit=1) + return issues["total"] > 0 + + @abc.abstractmethod + def run(self): + return + + +class Rule3(FlinkJiraRule): + def __init__(self, jira_client, config): + super().__init__(jira_client, config) + self.stale_days = config["stale_minor"]["stale_days"].get() + self.warning_days = config["stale_minor"]["warning_days"].get() + self.label = config["stale_minor"]["label"].get() + self.comment = config["stale_minor"]["comment"].get() + + def run(self): + self.close_tickets_marked_stale() + self.mark_stale_tickets_stale() + + def close_tickets_marked_stale(self): + + minor_tickets_marked_stale = f'project=FLINK AND Priority = Minor AND resolution = Unresolved AND labels in ("{self.label}") AND updated < startOfDay(-{self.warning_days}d)' + logging.info( + f"Looking for minor tickets, which were previously marked as stale: {minor_tickets_marked_stale}" + ) + issues = jira.jql(minor_tickets_marked_stale, limit=10000) + + for issue in issues["issues"]: + key = issue["key"] + logging.info( + f"Found https://issues.apache.org/jira/browse/{key}. It is now closed due to inactivity." + ) + + def mark_stale_tickets_stale(self): + + stale_minor_tickets = f"project = FLINK AND Priority = Minor AND resolution = Unresolved AND updated < startOfDay(-{self.stale_days}d)" + logging.info( + f"Looking for minor tickets, which are stale: {stale_minor_tickets}" + ) + issues = self.jira_client.jql(stale_minor_tickets, limit=10000) + + for issue in issues["issues"]: + key = issue["key"] + issue = self.jira_client.get_issue(key) + + if not self.has_recently_updated_subtask(key, self.stale_days): + logging.info( + f"Found https://issues.apache.org/jira/browse/{key}. It is marked stale now." + ) + + else: + logging.debug( + f"Found https://issues.apache.org/jira/browse/{key}, but is has recently updated Subtasks. Ignoring for now." + ) + + +if __name__ == "__main__": + + logging.getLogger().setLevel(logging.INFO) + + config = confuse.Configuration("flink-jira-bot", __name__) + config.set_file("config.yaml") + + jira = Jira( + url="https://issues.apache.org/jira", + username="flink-jira-bot", + password=os.environ["JIRA_PASSWORD"], + ) + + rule_3 = Rule3(jira, config) + rule_3.run()
