Skip to content

Instantly share code, notes, and snippets.

@bmingles
Last active November 22, 2024 17:17
Show Gist options
  • Save bmingles/6e6a77cb7d16cb697cef523ed986085f to your computer and use it in GitHub Desktop.
Save bmingles/6e6a77cb7d16cb697cef523ed986085f to your computer and use it in GitHub Desktop.
Deephaven GH / Jira Board
# Map community web ui release versions to enterprise PRs. Useful for updating enterprise version logs.
# Inspired by https://medium.com/@deephavendatalabs/leverage-githubs-awesome-rest-api-f7d34894765b
#
# The script requires some env variables containing username + access tokens for Github + JIRA
# 1. Set env variables in your local environment
# - GH_USERNAME - Your github username
# - GH_TOKEN - In Github, create a read-only fine-grained token:
# https://github.com/settings/tokens?type=beta
# - JIRA_USERNAME - Your JIRA username (likely your illumon email address)
# - JIRA_TOKEN - In JIRA, create api access token:
# https://id.atlassian.com/manage-profile/security/api-tokens
#
# 2. Add mapping for env variables to your docker-compose.yml for DH
# - GH_USERNAME=${GH_USERNAME}
# - GH_TOKEN=${GH_TOKEN}
# - JIRA_USERNAME=${JIRA_USERNAME}
# - JIRA_TOKEN=${JIRA_TOKEN}
#
#. NOTE: There are probably other options for loading env variables in DH
#
# 3. Make sure your env variables are active for current shell session, and start your docker container.
#
# Tables
# - minor_releases - Minor release info
# - patch_releases - Patch release info
# - prs - Merged pr info. The `JIRA` column contains a commo separated list of any `DH-####` ids found in the title or body fields.
# - jira - Summary for all `DH-####` tickets found in PR title + body fields.
# - minor_release_prs - Mapping of minor versions to PRs that are included in those releases
# - patch_release_prs - Mapping of minor versions to PRs that are included in those releases
import os, re
os.system("pip install requests")
import requests
from deephaven import DynamicTableWriter
from deephaven import dtypes as dht
from deephaven import time as dhtu
# Github
gh_header = (os.environ["GH_USERNAME"], os.environ["GH_TOKEN"])
org = "deephaven"
repo = "web-client-ui"
api_root = f"https://api.github.com/repos/{org}/{repo}"
pr_url = f"{api_root}/pulls?state=closed&sort=updated&direction=desc&per_page=50"
releases_url = f"{api_root}/releases"
pr_col_defs = {
"MergedAt": dht.Instant,
"JIRA": dht.string,
"BaseRef": dht.string,
"PR_NUMBER": dht.string,
"Title": dht.string,
"Body": dht.string
}
pr_table_writer = DynamicTableWriter(pr_col_defs)
releases_col_defs = {
"CreatedAt": dht.Instant,
"Name": dht.string
}
releases_table_writer = DynamicTableWriter(releases_col_defs)
# JIRA
jira_header = (os.environ["JIRA_USERNAME"], os.environ["JIRA_TOKEN"])
jira_col_defs = {
"Issue": dht.string,
"Summary": dht.string
}
jira_table_writer = DynamicTableWriter(jira_col_defs)
all_ticket_ids = []
response = requests.get(pr_url, auth=gh_header)
if response.status_code != 200:
raise Exception(f"Failed to fetch PRs. Status code: {response.status_code}")
prs_json = response.json()
# Parse PR info into rows
for pr in prs_json:
# Skip PRs closed without being merged
if not pr["merged_at"]:
continue
# print("merged_at:", dhtu.parse_instant("2020-08-01T12:00:00 ET"), dhtu.parse_instant(pr["merged_at"]))
merged_at = dhtu.to_j_instant(pr["merged_at"])
base_ref = pr["base"]["ref"]
pr_number = pr["number"]
# pr_url = f"https://github.com/deephaven/web-client-ui/pull/{pr_number}"
title = pr["title"]
body = ""
if pr["body"]:
body = pr["body"]
# Distinct JIRA ids found in title + body fields
title_ids = re.findall(r'DH-\d+', title)
body_ids = re.findall(r'DH-\d+', body)
ids = set(title_ids + body_ids)
jira_id_str = ', '.join(ids)
all_ticket_ids.extend(ids)
pr_table_writer.write_row(merged_at, jira_id_str, base_ref, str(pr_number), title, body)
releases_json = requests.get(releases_url, auth=gh_header).json()
for release in releases_json:
created_at = dhtu.to_j_instant(release["created_at"])
name = release["name"]
releases_table_writer.write_row(created_at, name)
# Get JIRA issue descriptions
for key in set(all_ticket_ids):
jira_url = f"https://deephaven.atlassian.net/rest/api/2/issue/{key}?fields=summary"
ticket = requests.get(jira_url, auth=jira_header).json()
summary = ticket["fields"]["summary"]
jira_table_writer.write_row(key, summary)
# exposed tables
minor_releases = releases_table_writer.table.where(filters=["Name.endsWith(`.0`)"])
patch_releases = releases_table_writer.table.where(filters=["!Name.endsWith(`.0`)"])
prs = pr_table_writer.table
jira = jira_table_writer.table
minor_release_prs = prs\
.where(filters=["BaseRef = `main`"])\
.raj(table=minor_releases, on=["MergedAt <= CreatedAt"])\
.move_columns(idx=0, cols=["Name", "CreatedAt"])\
.rename_columns(cols=["ReleasedAt = CreatedAt"])
patch_release_prs = prs\
.where(filters=["BaseRef != `main`"])\
.raj(table=patch_releases, on=["MergedAt <= CreatedAt"])\
.move_columns(idx=0, cols=["Name", "CreatedAt"])\
.rename_columns(cols=["ReleasedAt = CreatedAt"])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment