@@ -20,14 +20,27 @@ jobs:
2020 pull-requests : write
2121
2222 steps :
23+ - name : Create organization membership token
24+ id : membership-token
25+ uses : actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
26+ with :
27+ client-id : ${{ vars.CODEQL_ORG_MEMBERS_APP_CLIENT_ID }}
28+ private-key : ${{ secrets.CODEQL_ORG_MEMBERS_APP_PRIVATE_KEY }}
29+ owner : ${{ github.repository_owner }}
30+ permission-members : read
31+
2332 - name : Label external contributions
2433 env :
34+ API_URL : ${{ github.api_url }}
2535 GH_TOKEN : ${{ github.token }}
36+ MEMBERS_TOKEN : ${{ steps.membership-token.outputs.token }}
37+ ORG : ${{ github.repository_owner }}
2638 REPO : ${{ github.repository }}
2739 run : |
2840 set -euo pipefail
2941
3042 label="external-contribution"
43+ membership_check_failed=false
3144 updated_cutoff=$(date -u -d "1 hour ago" "+%Y-%m-%dT%H:%M:%SZ")
3245
3346 while IFS= read -r pr_number; do
@@ -46,13 +59,13 @@ jobs:
4659 (.head.repo.full_name | type == "string") and
4760 .head.repo.full_name != $repo and
4861 .user.type == "User" and
49- .author_association != "MEMBER" and
50- .author_association != "OWNER" and
62+ (.user.login | type == "string" and length > 0) and
5163 (any(.labels[]?; .name == $label) | not)' \
5264 >/dev/null <<<"$pr_json"; then
5365 continue
5466 fi
5567
68+ author=$(jq -r '.user.login' <<<"$pr_json")
5669 events=$(gh api --paginate \
5770 "repos/$REPO/issues/$pr_number/events?per_page=100" |
5871 jq -cs 'add')
6376 continue
6477 fi
6578
79+ if ! membership_status=$(curl \
80+ --silent \
81+ --show-error \
82+ --output /dev/null \
83+ --write-out '%{http_code}' \
84+ --connect-timeout 10 \
85+ --max-time 30 \
86+ --header "Accept: application/vnd.github+json" \
87+ --header "Authorization: Bearer $MEMBERS_TOKEN" \
88+ --header "X-GitHub-Api-Version: 2022-11-28" \
89+ "$API_URL/orgs/$ORG/members/$author"); then
90+ echo "::error::Membership check failed for pull request #$pr_number; skipping."
91+ membership_check_failed=true
92+ continue
93+ fi
94+
95+ case "$membership_status" in
96+ 204)
97+ echo "Pull request #$pr_number was opened by an organization member; skipping."
98+ continue
99+ ;;
100+ 404)
101+ ;;
102+ *)
103+ echo "::error::Membership check for pull request #$pr_number returned HTTP $membership_status; skipping."
104+ membership_check_failed=true
105+ continue
106+ ;;
107+ esac
108+
66109 jq -n --arg label "$label" '{labels: [$label]}' |
67110 gh api --method POST \
68111 "repos/$REPO/issues/$pr_number/labels" \
78121 -f per_page=100 |
79122 jq -r '.[] | select(.pull_request != null) | .number'
80123 )
124+
125+ if [ "$membership_check_failed" = true ]; then
126+ exit 1
127+ fi
0 commit comments