Skip to content

Commit c30e9b0

Browse files
Merge branch 'main' into users/boomanaiden154/ci-windows-container
2 parents d246fcb + 76b4931 commit c30e9b0

File tree

4,795 files changed

+203649
-83393
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

4,795 files changed

+203649
-83393
lines changed

.github/CODEOWNERS

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@
77
# to receive an approval from a "code owner" in particular -- any LLVM project
88
# member can approve pull requests.
99
#
10-
# Note that GitHub's concept of "code owner" is independent from LLVM's own
11-
# "code owner" concept, they merely happen to share terminology. See
12-
# https://llvm.org/docs/DeveloperPolicy.html#code-owners, as well as the
13-
# CODE_OWNERS.txt files in the respective subproject directories.
10+
# This is independent of LLVM's own "maintainer" concept.
11+
# See https://llvm.org/docs/DeveloperPolicy.html#maintainers as well as the
12+
# Maintainers.* files in the the respective subproject directories.
1413

1514
/libcxx/ @llvm/reviewers-libcxx
1615
/libcxxabi/ @llvm/reviewers-libcxxabi

.github/workflows/build-ci-container.yml

Lines changed: 40 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -18,95 +18,70 @@ on:
1818
- '.github/workflows/containers/github-action-ci/**'
1919

2020
jobs:
21-
# TODO(boomanaiden154): Switch this back to a single stage build when we can
22-
# run this on the self-hosted runners and don't have to do it this way to
23-
# avoid timeouts.
24-
build-ci-container-stage1:
21+
build-ci-container:
2522
if: github.repository_owner == 'llvm'
26-
runs-on: ubuntu-latest
23+
runs-on: depot-ubuntu-22.04-16
24+
outputs:
25+
container-name: ${{ steps.vars.outputs.container-name }}
26+
container-name-tag: ${{ steps.vars.outputs.container-name-tag }}
27+
container-filename: ${{ steps.vars.outputs.container-filename }}
2728
steps:
2829
- name: Checkout LLVM
2930
uses: actions/checkout@v4
3031
with:
3132
sparse-checkout: .github/workflows/containers/github-action-ci/
32-
- name: Change podman Root Direcotry
33-
run: |
34-
mkdir -p ~/.config/containers
35-
sudo mkdir -p /mnt/podman
36-
sudo chown `whoami`:`whoami` /mnt/podman
37-
cp ./.github/workflows/containers/github-action-ci/storage.conf ~/.config/containers/storage.conf
38-
podman info
39-
- name: Build container stage1
40-
working-directory: ./.github/workflows/containers/github-action-ci/
41-
run: |
42-
podman build -t stage1-toolchain --target stage1-toolchain -f stage1.Dockerfile .
43-
- name: Save container image
44-
run: |
45-
podman save stage1-toolchain > stage1-toolchain.tar
46-
- name: Upload container image
47-
uses: actions/upload-artifact@v4
48-
with:
49-
name: stage1-toolchain
50-
path: stage1-toolchain.tar
51-
retention-days: 1
52-
build-ci-container-stage2:
53-
if: github.repository_owner == 'llvm'
54-
runs-on: ubuntu-latest
55-
needs: build-ci-container-stage1
56-
permissions:
57-
packages: write
58-
steps:
5933
- name: Write Variables
6034
id: vars
6135
run: |
6236
tag=`date +%s`
6337
container_name="ghcr.io/$GITHUB_REPOSITORY_OWNER/ci-ubuntu-22.04"
6438
echo "container-name=$container_name" >> $GITHUB_OUTPUT
6539
echo "container-name-tag=$container_name:$tag" >> $GITHUB_OUTPUT
66-
67-
- name: Checkout LLVM
68-
uses: actions/checkout@v4
69-
with:
70-
sparse-checkout: .github/workflows/containers/github-action-ci/
71-
72-
- name: Change podman Root Direcotry
40+
echo "container-filename=$(echo $container_name:$tag | sed -e 's/\//-/g' -e 's/:/-/g').tar" >> $GITHUB_OUTPUT
41+
- name: Build container
42+
working-directory: ./.github/workflows/containers/github-action-ci/
7343
run: |
74-
mkdir -p ~/.config/containers
75-
sudo mkdir -p /mnt/podman
76-
sudo chown `whoami`:`whoami` /mnt/podman
77-
cp ./.github/workflows/containers/github-action-ci/storage.conf ~/.config/containers/storage.conf
78-
podman info
44+
podman build -t ${{ steps.vars.outputs.container-name-tag }} .
7945
80-
# Download the container image into /mnt/podman rather than
81-
# $GITHUB_WORKSPACE to avoid space limitations on the default drive
82-
# and use the permissions setup for /mnt/podman.
83-
- name: Download stage1-toolchain
84-
uses: actions/download-artifact@v4
85-
with:
86-
name: stage1-toolchain
87-
path: /mnt/podman
88-
89-
- name: Load stage1-toolchain
46+
# Save the container so we have it in case the push fails. This also
47+
# allows us to separate the push step into a different job so we can
48+
# maintain minimal permissions while building the container.
49+
- name: Save container image
9050
run: |
91-
podman load -i /mnt/podman/stage1-toolchain.tar
51+
podman save ${{ steps.vars.outputs.container-name-tag }} > ${{ steps.vars.outputs.container-filename }}
9252
93-
- name: Build Container
94-
working-directory: ./.github/workflows/containers/github-action-ci/
95-
run: |
96-
podman build -t ${{ steps.vars.outputs.container-name-tag }} -f stage2.Dockerfile .
97-
podman tag ${{ steps.vars.outputs.container-name-tag }} ${{ steps.vars.outputs.container-name }}:latest
53+
- name: Upload container image
54+
uses: actions/upload-artifact@v4
55+
with:
56+
name: container
57+
path: ${{ steps.vars.outputs.container-filename }}
58+
retention-days: 14
9859

9960
- name: Test Container
10061
run: |
10162
for image in ${{ steps.vars.outputs.container-name-tag }} ${{ steps.vars.outputs.container-name }}; do
10263
podman run --rm -it $image /usr/bin/bash -x -c 'printf '\''#include <iostream>\nint main(int argc, char **argv) { std::cout << "Hello\\n"; }'\'' | clang++ -x c++ - && ./a.out | grep Hello'
10364
done
10465
66+
push-ci-container:
67+
if: github.event_name == 'push'
68+
needs:
69+
- build-ci-container
70+
permissions:
71+
packages: write
72+
runs-on: ubuntu-24.04
73+
env:
74+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
75+
steps:
76+
- name: Download container
77+
uses: actions/download-artifact@v4
78+
with:
79+
name: container
80+
10581
- name: Push Container
106-
if: github.event_name == 'push'
107-
env:
108-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
10982
run: |
83+
podman load -i ${{ needs.build-ci-container.outptus.container-filename }}
84+
podman tag ${{ steps.vars.outputs.container-name-tag }} ${{ steps.vars.outputs.container-name }}:latest
11085
podman login -u ${{ github.actor }} -p $GITHUB_TOKEN ghcr.io
111-
podman push ${{ steps.vars.outputs.container-name-tag }}
112-
podman push ${{ steps.vars.outputs.container-name }}:latest
86+
podman push ${{ needs.build-ci-container.outputs.container-name-tag }}
87+
podman push ${{ needs.build-ci-container.outputs.container-name }}:latest

.github/workflows/commit-access-review.py

Lines changed: 47 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -62,57 +62,9 @@ def __repr__(self):
6262
)
6363

6464

65-
def run_graphql_query(
66-
query: str, variables: dict, token: str, retry: bool = True
67-
) -> dict:
68-
"""
69-
This function submits a graphql query and returns the results as a
70-
dictionary.
71-
"""
72-
s = requests.Session()
73-
retries = requests.adapters.Retry(total=8, backoff_factor=2, status_forcelist=[504])
74-
s.mount("https://", requests.adapters.HTTPAdapter(max_retries=retries))
75-
76-
headers = {
77-
"Authorization": "bearer {}".format(token),
78-
# See
79-
# https://github.blog/2021-11-16-graphql-global-id-migration-update/
80-
"X-Github-Next-Global-ID": "1",
81-
}
82-
request = s.post(
83-
url="https://api.github.com/graphql",
84-
json={"query": query, "variables": variables},
85-
headers=headers,
86-
)
87-
88-
rate_limit = request.headers.get("X-RateLimit-Remaining")
89-
print(rate_limit)
90-
if rate_limit and int(rate_limit) < 10:
91-
reset_time = int(request.headers["X-RateLimit-Reset"])
92-
while reset_time - int(time.time()) > 0:
93-
time.sleep(60)
94-
print(
95-
"Waiting until rate limit reset",
96-
reset_time - int(time.time()),
97-
"seconds remaining",
98-
)
99-
100-
if request.status_code == 200:
101-
if "data" not in request.json():
102-
print(request.json())
103-
sys.exit(1)
104-
return request.json()["data"]
105-
elif retry:
106-
return run_graphql_query(query, variables, token, False)
107-
else:
108-
raise Exception(
109-
"Failed to run graphql query\nquery: {}\nerror: {}".format(
110-
query, request.json()
111-
)
112-
)
113-
114-
115-
def check_manual_requests(start_date: datetime.datetime, token: str) -> list[str]:
65+
def check_manual_requests(
66+
gh: github.Github, start_date: datetime.datetime
67+
) -> list[str]:
11668
"""
11769
Return a list of users who have been asked since ``start_date`` if they
11870
want to keep their commit access.
@@ -137,18 +89,21 @@ def check_manual_requests(start_date: datetime.datetime, token: str) -> list[str
13789
"""
13890
formatted_start_date = start_date.strftime("%Y-%m-%dT%H:%M:%S")
13991
variables = {
140-
"query": f"type:issue created:>{formatted_start_date} org:llvm repo:llvm-project label:infrastructure:commit-access"
92+
"query": f"type:issue created:>{formatted_start_date} org:llvm repo:llvm-project label:infra:commit-access"
14193
}
14294

143-
data = run_graphql_query(query, variables, token)
95+
res_header, res_data = gh._Github__requester.graphql_query(
96+
query=query, variables=variables
97+
)
98+
data = res_data["data"]
14499
users = []
145100
for issue in data["search"]["nodes"]:
146101
users.extend([user[1:] for user in re.findall("@[^ ,\n]+", issue["body"])])
147102

148103
return users
149104

150105

151-
def get_num_commits(user: str, start_date: datetime.datetime, token: str) -> int:
106+
def get_num_commits(gh: github.Github, user: str, start_date: datetime.datetime) -> int:
152107
"""
153108
Get number of commits that ``user`` has been made since ``start_date`.
154109
"""
@@ -166,7 +121,10 @@ def get_num_commits(user: str, start_date: datetime.datetime, token: str) -> int
166121
}
167122
"""
168123

169-
data = run_graphql_query(user_query, variables, token)
124+
res_header, res_data = gh._Github__requester.graphql_query(
125+
query=user_query, variables=variables
126+
)
127+
data = res_data["data"]
170128
variables["user_id"] = data["user"]["id"]
171129

172130
query = """
@@ -193,7 +151,10 @@ def get_num_commits(user: str, start_date: datetime.datetime, token: str) -> int
193151
}
194152
"""
195153
count = 0
196-
data = run_graphql_query(query, variables, token)
154+
res_header, res_data = gh._Github__requester.graphql_query(
155+
query=query, variables=variables
156+
)
157+
data = res_data["data"]
197158
for repo in data["organization"]["teams"]["nodes"][0]["repositories"]["nodes"]:
198159
count += int(repo["ref"]["target"]["history"]["totalCount"])
199160
if count >= User.THRESHOLD:
@@ -202,7 +163,7 @@ def get_num_commits(user: str, start_date: datetime.datetime, token: str) -> int
202163

203164

204165
def is_new_committer_query_repo(
205-
user: str, start_date: datetime.datetime, token: str
166+
gh: github.Github, user: str, start_date: datetime.datetime
206167
) -> bool:
207168
"""
208169
Determine if ``user`` is a new committer. A new committer can keep their
@@ -220,7 +181,10 @@ def is_new_committer_query_repo(
220181
}
221182
"""
222183

223-
data = run_graphql_query(user_query, variables, token)
184+
res_header, res_data = gh._Github__requester.graphql_query(
185+
query=user_query, variables=variables
186+
)
187+
data = res_data["data"]
224188
variables["owner"] = "llvm"
225189
variables["user_id"] = data["user"]["id"]
226190
variables["start_date"] = start_date.strftime("%Y-%m-%dT%H:%M:%S")
@@ -245,7 +209,10 @@ def is_new_committer_query_repo(
245209
}
246210
"""
247211

248-
data = run_graphql_query(query, variables, token)
212+
res_header, res_data = gh._Github__requester.graphql_query(
213+
query=query, variables=variables
214+
)
215+
data = res_data["data"]
249216
repo = data["organization"]["repository"]
250217
commits = repo["ref"]["target"]["history"]["nodes"]
251218
if len(commits) == 0:
@@ -256,18 +223,22 @@ def is_new_committer_query_repo(
256223
return True
257224

258225

259-
def is_new_committer(user: str, start_date: datetime.datetime, token: str) -> bool:
226+
def is_new_committer(
227+
gh: github.Github, user: str, start_date: datetime.datetime
228+
) -> bool:
260229
"""
261230
Wrapper around is_new_commiter_query_repo to handle exceptions.
262231
"""
263232
try:
264-
return is_new_committer_query_repo(user, start_date, token)
233+
return is_new_committer_query_repo(gh, user, start_date)
265234
except:
266235
pass
267236
return True
268237

269238

270-
def get_review_count(user: str, start_date: datetime.datetime, token: str) -> int:
239+
def get_review_count(
240+
gh: github.Github, user: str, start_date: datetime.datetime
241+
) -> int:
271242
"""
272243
Return the number of reviews that ``user`` has done since ``start_date``.
273244
"""
@@ -286,11 +257,14 @@ def get_review_count(user: str, start_date: datetime.datetime, token: str) -> in
286257
"query": f"type:pr commenter:{user} -author:{user} merged:>{formatted_start_date} org:llvm",
287258
}
288259

289-
data = run_graphql_query(query, variables, token)
260+
res_header, res_data = gh._Github__requester.graphql_query(
261+
query=query, variables=variables
262+
)
263+
data = res_data["data"]
290264
return int(data["search"]["issueCount"])
291265

292266

293-
def count_prs(triage_list: dict, start_date: datetime.datetime, token: str):
267+
def count_prs(gh: github.Github, triage_list: dict, start_date: datetime.datetime):
294268
"""
295269
Fetch all the merged PRs for the project since ``start_date`` and update
296270
``triage_list`` with the number of PRs merged for each user.
@@ -329,7 +303,10 @@ def count_prs(triage_list: dict, start_date: datetime.datetime, token: str):
329303
has_next_page = True
330304
while has_next_page:
331305
print(variables)
332-
data = run_graphql_query(query, variables, token)
306+
res_header, res_data = gh._Github__requester.graphql_query(
307+
query=query, variables=variables
308+
)
309+
data = res_data["data"]
333310
for pr in data["search"]["nodes"]:
334311
# Users can be None if the user has been deleted.
335312
if not pr["author"]:
@@ -365,14 +342,14 @@ def main():
365342

366343
print("Start:", len(triage_list), "triagers")
367344
# Step 0 Check if users have requested commit access in the last year.
368-
for user in check_manual_requests(one_year_ago, token):
345+
for user in check_manual_requests(gh, one_year_ago):
369346
if user in triage_list:
370347
print(user, "requested commit access in the last year.")
371348
del triage_list[user]
372349
print("After Request Check:", len(triage_list), "triagers")
373350

374351
# Step 1 count all PRs authored or merged
375-
count_prs(triage_list, one_year_ago, token)
352+
count_prs(gh, triage_list, one_year_ago)
376353

377354
print("After PRs:", len(triage_list), "triagers")
378355

@@ -381,7 +358,7 @@ def main():
381358

382359
# Step 2 check for reviews
383360
for user in list(triage_list.keys()):
384-
review_count = get_review_count(user, one_year_ago, token)
361+
review_count = get_review_count(gh, user, one_year_ago)
385362
triage_list[user].add_reviewed(review_count)
386363

387364
print("After Reviews:", len(triage_list), "triagers")
@@ -391,7 +368,7 @@ def main():
391368

392369
# Step 3 check for number of commits
393370
for user in list(triage_list.keys()):
394-
num_commits = get_num_commits(user, one_year_ago, token)
371+
num_commits = get_num_commits(gh, user, one_year_ago)
395372
# Override the total number of commits to not double count commits and
396373
# authored PRs.
397374
triage_list[user].set_authored(num_commits)
@@ -401,7 +378,7 @@ def main():
401378
# Step 4 check for new committers
402379
for user in list(triage_list.keys()):
403380
print("Checking", user)
404-
if is_new_committer(user, one_year_ago, token):
381+
if is_new_committer(gh, user, one_year_ago):
405382
print("Removing new committer: ", user)
406383
del triage_list[user]
407384

0 commit comments

Comments
 (0)