Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 45 additions & 6 deletions .github/workflows/pr-metadata-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#
# SPDX-License-Identifier: Apache-2.0

name: "CI: Enforce assignee/label/milestone on PRs"
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed in this team meeting, it would be awesome if the org check was a separate line item to make it obvious when it fails.

name: "CI: Enforce PR metadata and cuda_bindings policy"

on:
pull_request_target:
Expand All @@ -19,18 +19,31 @@ on:

jobs:
check-metadata:
name: PR has assignee, labels, and milestone
name: PR has required metadata and valid cuda_bindings author
if: github.repository_owner == 'NVIDIA'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
steps:
- name: Check for assignee, labels, and milestone
- name: Check PR metadata and cuda_bindings policy
env:
# PR metadata inputs
ASSIGNEES: ${{ toJson(github.event.pull_request.assignees) }}
AUTHOR_ASSOCIATION: ${{ github.event.pull_request.author_association || 'NONE' }}
LABELS: ${{ toJson(github.event.pull_request.labels) }}
MILESTONE: ${{ github.event.pull_request.milestone && github.event.pull_request.milestone.title || '' }}
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_URL: ${{ github.event.pull_request.html_url }}

# Gating booleans
IS_BOT: ${{ github.actor == 'dependabot[bot]' || github.actor == 'pre-commit-ci[bot]' || github.actor == 'copy-pr-bot[bot]' }}
IS_DRAFT: ${{ github.event.pull_request.draft }}

# API request context/auth
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
run: |
if [ "$IS_BOT" = "true" ] || [ "$IS_DRAFT" = "true" ]; then
echo "Skipping check for bot or draft PR."
Expand Down Expand Up @@ -103,10 +116,35 @@ jobs:
ERRORS="${ERRORS}- **Blocked label detected**: label \`$label\` prevents merging. Remove it when the PR is ready.\n"
done <<<"$BLOCKED_LABELS"

# Only NVIDIA organization members may change code under cuda_bindings.
if [ "$AUTHOR_ASSOCIATION" != "MEMBER" ] && [ "$AUTHOR_ASSOCIATION" != "OWNER" ]; then
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Q: I assume checking MEMBER is enough? Do we need OWNER here?

if ! TOUCHES_CUDA_BINDINGS=$(
gh api \
--paginate \
--slurp \
--jq '
flatten
| any(
.[];
(.filename | startswith("cuda_bindings/"))
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important: Also include cuda_python/

or ((.previous_filename // "") | startswith("cuda_bindings/"))
)
' \
"repos/$REPO/pulls/$PR_NUMBER/files"
); then
echo "::error::Failed to inspect the PR file list."
exit 1
fi

if [ "$TOUCHES_CUDA_BINDINGS" = "true" ]; then
ERRORS="${ERRORS}- **cuda_bindings policy**: See \`cuda_bindings/LICENSE\`. Only NVIDIA organization members may modify files under \`cuda_bindings/\` (PR author \`$PR_AUTHOR\` has association \`$AUTHOR_ASSOCIATION\`).\n"
fi
fi

if [ -n "$ERRORS" ]; then
echo "::error::This PR is missing required metadata. See the job summary for details."
echo "::error::This PR failed the required metadata/policy checks. See the job summary for details."
{
echo "## PR Metadata Check Failed"
echo "## PR Requirements Check Failed"
echo ""
printf '%b' "$ERRORS"
echo ""
Expand All @@ -118,9 +156,10 @@ jobs:
ASSIGNEE_LIST=$(echo "$ASSIGNEES" | jq -r '.[].login' | paste -sd ', ' -)
LABEL_LIST=$(echo "$LABELS" | jq -r '.[].name' | paste -sd ', ' -)
{
echo "## PR Metadata Check Passed"
echo "## PR Requirements Check Passed"
echo ""
echo "- **Assignees**: $ASSIGNEE_LIST"
echo "- **Labels**: $LABEL_LIST"
echo "- **Milestone**: $MILESTONE"
echo "- **Author association**: $AUTHOR_ASSOCIATION"
} >> "$GITHUB_STEP_SUMMARY"
Loading