Skip to content

Commit 9ae2ce6

Browse files
authored
[TRTLLM-5502][infra] Add github action to identify if PR is from community (#4824)
Signed-off-by: Po-Wei Wang (Vincent)
1 parent 90aab05 commit 9ae2ce6

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import os
2+
import time
3+
4+
import requests
5+
6+
GITHUB_API_URL = "https://api.github.com"
7+
GITHUB_TOKEN = os.environ.get("GITHUB_TOKEN")
8+
assert GITHUB_TOKEN, "GITHUB_TOKEN environment variable not set"
9+
10+
HEADERS = {
11+
"Accept": "application/vnd.github.v3+json",
12+
"User-Agent": "PythonGitHubAction-Labeler/1.0",
13+
"Authorization": f"token {GITHUB_TOKEN}",
14+
}
15+
16+
17+
def get_nvidia_members() -> list[str]:
18+
"""Fetches all NVIDIA organization members."""
19+
members = []
20+
page = 1
21+
per_page = 100
22+
23+
while True:
24+
url = f"{GITHUB_API_URL}/orgs/NVIDIA/members?per_page={per_page}&page={page}"
25+
try:
26+
time.sleep(0.5)
27+
response = requests.get(url, headers=HEADERS)
28+
29+
if response.status_code == 404:
30+
raise RuntimeError(
31+
f"Organization 'NVIDIA' not found (404). Cannot fetch members."
32+
)
33+
elif response.status_code == 403:
34+
error_message = response.json().get(
35+
"message", "") if response.content else ""
36+
raise RuntimeError(
37+
f"Forbidden (403) when fetching members for 'NVIDIA'. "
38+
f"This may be due to insufficient token permissions or rate limits. Details: {error_message}. Cannot fetch members."
39+
)
40+
41+
response.raise_for_status()
42+
page_data = response.json()
43+
44+
if not page_data:
45+
break
46+
47+
for member_data in page_data:
48+
if isinstance(member_data, dict) and "login" in member_data:
49+
members.append(member_data["login"].lower())
50+
51+
if len(page_data) < per_page:
52+
break
53+
page += 1
54+
except Exception as e:
55+
print(f"Error fetching NVIDIA members: {e}")
56+
return []
57+
58+
print(f"Successfully fetched {len(members)} members for 'NVIDIA'.")
59+
return members
60+
61+
62+
def add_label_to_pr(repo_name: str, pr_number: str, label: str):
63+
"""Adds a label to a pull request."""
64+
url = f"{GITHUB_API_URL}/repos/NVIDIA/{repo_name}/issues/{pr_number}/labels"
65+
payload = {"labels": [label]}
66+
try:
67+
response = requests.post(url, headers=HEADERS, json=payload)
68+
response.raise_for_status()
69+
print(f"Successfully added label '{label}' to PR #{pr_number}.")
70+
except requests.exceptions.RequestException as e:
71+
print(f"Error adding label '{label}' to PR #{pr_number}: {e}")
72+
if e.response is not None:
73+
print(f"Response content: {e.response.content}")
74+
75+
76+
def main():
77+
pr_author = os.environ.get("PR_AUTHOR")
78+
assert pr_author, "PR_AUTHOR environment variable not set"
79+
pr_number = os.environ.get("PR_NUMBER")
80+
assert pr_number, "PR_NUMBER environment variable not set"
81+
repo_name = os.environ.get("REPO_NAME")
82+
assert repo_name, "REPO_NAME environment variable not set"
83+
community_label = os.environ.get("COMMUNITY_LABEL")
84+
assert community_label, "COMMUNITY_LABEL environment variable not set"
85+
86+
print(
87+
f"Starting NVIDIA membership check for PR author '{pr_author}' on PR #{pr_number}."
88+
)
89+
90+
nvidia_members = get_nvidia_members()
91+
if not nvidia_members:
92+
print("Could not retrieve NVIDIA members list. Exiting.")
93+
return
94+
95+
is_member = pr_author.lower() in nvidia_members
96+
print(f"User '{pr_author}' is a member of NVIDIA: {is_member}")
97+
98+
if not is_member:
99+
print(
100+
f"User '{pr_author}' is a community user. Adding label '{community_label}'."
101+
)
102+
add_label_to_pr(repo_name, pr_number, community_label)
103+
else:
104+
print(
105+
f"User '{pr_author}' is an NVIDIA member. No label will be added.")
106+
107+
108+
if __name__ == "__main__":
109+
main()
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: Label Community PR
2+
3+
on:
4+
pull_request:
5+
types: [opened]
6+
7+
jobs:
8+
label_pr:
9+
runs-on: ubuntu-latest
10+
steps:
11+
- name: Checkout repository
12+
uses: actions/checkout@v3
13+
14+
- name: Set up Python
15+
uses: actions/setup-python@v3
16+
with:
17+
python-version: '3.x'
18+
19+
- name: Install dependencies
20+
run: pip install requests
21+
22+
- name: Run labeling script
23+
env:
24+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
25+
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
26+
PR_NUMBER: ${{ github.event.pull_request.number }}
27+
REPO_NAME: ${{ github.event.repository.name }}
28+
COMMUNITY_LABEL: "Community want to contribute"
29+
run: python .github/scripts/label_community_user.py

0 commit comments

Comments
 (0)