From 3c7a8aee0334f8ccf504f390923a740c33f37d45 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Dec 2021 14:27:51 +0100 Subject: [PATCH 01/35] chore: added some workflows to add some labels to inflight PR's Signed-off-by: blam --- .github/workflows/goalie.yaml | 76 +++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 .github/workflows/goalie.yaml diff --git a/.github/workflows/goalie.yaml b/.github/workflows/goalie.yaml new file mode 100644 index 0000000000..ecb1ade0e4 --- /dev/null +++ b/.github/workflows/goalie.yaml @@ -0,0 +1,76 @@ +# when a PR is opened, let's add the pending-review label +name: Set pending review label +on: + pull_request: + types: [opened, reopened] + +jobs: + label: + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v5 + with: + script: | + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['awaiting-review'] + }) +--- +# on a review from someone in the reviewers group, remove the awaiting-review label and add the awaiting-author label +name: Update labels for awaiting review +on: + pull_request_review: + types: [submitted] + +jobs: + label: + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v5 + id: get-reviewers + with: + github-token: ${{ secrets.ORG_READ }} + script: | + const {data: reviewerMembers} = await github.rest.teams.listMembersInOrg({ + org: context.payload.organization.login, + team_slug: 'reviewers' + }); + return reviewerMembers; + - uses: actions/github-script@v5 + id: fix-labels + with: + + script: | + const isReviewer = ${{steps.get-reviewers.outputs.result}}.some(({login}) => login === context.actor); + const isAuthor = context.payload.pull_request.user.login === context.actor + if (isAuthor) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: 'awaiting-author' + }).catch(() => {}); + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['awaiting-review'] + }); + } else if (isReviewer) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: 'awaiting-review' + }).catch(() => {}); + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['awaiting-author'] + }); + } + + From be98a13b9d7c698a64fe1ffe7035dfcdeb992b76 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Dec 2021 14:36:09 +0100 Subject: [PATCH 02/35] chore: updating goalie review worklfows Signed-off-by: blam --- ...l => goalie-on-pr-review-or-response.yaml} | 24 ++----------------- .../workflows/goalie-set-pending-review.yaml | 22 +++++++++++++++++ 2 files changed, 24 insertions(+), 22 deletions(-) rename .github/workflows/{goalie.yaml => goalie-on-pr-review-or-response.yaml} (79%) create mode 100644 .github/workflows/goalie-set-pending-review.yaml diff --git a/.github/workflows/goalie.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml similarity index 79% rename from .github/workflows/goalie.yaml rename to .github/workflows/goalie-on-pr-review-or-response.yaml index ecb1ade0e4..0a4f65d05c 100644 --- a/.github/workflows/goalie.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -1,28 +1,10 @@ -# when a PR is opened, let's add the pending-review label -name: Set pending review label -on: - pull_request: - types: [opened, reopened] - -jobs: - label: - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v5 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['awaiting-review'] - }) ---- # on a review from someone in the reviewers group, remove the awaiting-review label and add the awaiting-author label name: Update labels for awaiting review on: pull_request_review: types: [submitted] + pull_request_review_comment: + types: [created] jobs: label: @@ -72,5 +54,3 @@ jobs: labels: ['awaiting-author'] }); } - - diff --git a/.github/workflows/goalie-set-pending-review.yaml b/.github/workflows/goalie-set-pending-review.yaml new file mode 100644 index 0000000000..785c37a3ee --- /dev/null +++ b/.github/workflows/goalie-set-pending-review.yaml @@ -0,0 +1,22 @@ +# when a PR is opened, let's add the pending-review label +name: Set pending review label +on: + pull_request: + types: [opened, reopened] + +jobs: + label: + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v5 + with: + script: | + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['awaiting-review'] + }) + + + From 1063afe18f3011cd560ede2c8ba42001a1218056 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 15 Dec 2021 14:39:55 +0100 Subject: [PATCH 03/35] chore: updating pending review workflows Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 1 - .github/workflows/goalie-set-pending-review.yaml | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 0a4f65d05c..1ea392ad37 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -23,7 +23,6 @@ jobs: - uses: actions/github-script@v5 id: fix-labels with: - script: | const isReviewer = ${{steps.get-reviewers.outputs.result}}.some(({login}) => login === context.actor); const isAuthor = context.payload.pull_request.user.login === context.actor diff --git a/.github/workflows/goalie-set-pending-review.yaml b/.github/workflows/goalie-set-pending-review.yaml index 785c37a3ee..4e62c1d30b 100644 --- a/.github/workflows/goalie-set-pending-review.yaml +++ b/.github/workflows/goalie-set-pending-review.yaml @@ -16,7 +16,4 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, labels: ['awaiting-review'] - }) - - - + }); From ed5752e3f02ea0d2138ee7d1038b0df6657aa1ac Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 16 Dec 2021 10:44:25 +0100 Subject: [PATCH 04/35] chore: updating secrets Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 1ea392ad37..219b4f421d 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -13,7 +13,7 @@ jobs: - uses: actions/github-script@v5 id: get-reviewers with: - github-token: ${{ secrets.ORG_READ }} + github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | const {data: reviewerMembers} = await github.rest.teams.listMembersInOrg({ org: context.payload.organization.login, From 3cd87f3fa0ef640ac1cf287d1a0f49bba9efb810 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 13:52:22 +0100 Subject: [PATCH 05/35] chore: simplyfying the labels Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 219b4f421d..911ec01a02 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -20,36 +20,27 @@ jobs: team_slug: 'reviewers' }); return reviewerMembers; + - uses: actions/github-script@v5 + id: are-all-reviews-from-reviewers + with: + script: | + const {data: requestedReviewers} = await github.rest.pulls.listRequestedReviewers({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + }); + + + console.log(requestedReviewers);; - uses: actions/github-script@v5 id: fix-labels with: script: | - const isReviewer = ${{steps.get-reviewers.outputs.result}}.some(({login}) => login === context.actor); const isAuthor = context.payload.pull_request.user.login === context.actor if (isAuthor) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: 'awaiting-author' - }).catch(() => {}); github.rest.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, labels: ['awaiting-review'] }); - } else if (isReviewer) { - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: 'awaiting-review' - }).catch(() => {}); - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['awaiting-author'] - }); - } From f0ea274f22b8378ebe16fbda8541e2c3ea067afe Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 14:00:00 +0100 Subject: [PATCH 06/35] chore: think we can do all this with one workflow\ Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 15 +++------------ .../workflows/goalie-set-pending-review.yaml | 19 ------------------- 2 files changed, 3 insertions(+), 31 deletions(-) delete mode 100644 .github/workflows/goalie-set-pending-review.yaml diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 911ec01a02..9f7665dc35 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -5,21 +5,13 @@ on: types: [submitted] pull_request_review_comment: types: [created] + pull_request: + types: [opened, reopened, synchronize] jobs: label: runs-on: ubuntu-latest steps: - - uses: actions/github-script@v5 - id: get-reviewers - with: - github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - script: | - const {data: reviewerMembers} = await github.rest.teams.listMembersInOrg({ - org: context.payload.organization.login, - team_slug: 'reviewers' - }); - return reviewerMembers; - uses: actions/github-script@v5 id: are-all-reviews-from-reviewers with: @@ -30,8 +22,7 @@ jobs: pull_number: context.issue.number, }); - - console.log(requestedReviewers);; + console.log(requestedReviewers); - uses: actions/github-script@v5 id: fix-labels with: diff --git a/.github/workflows/goalie-set-pending-review.yaml b/.github/workflows/goalie-set-pending-review.yaml deleted file mode 100644 index 4e62c1d30b..0000000000 --- a/.github/workflows/goalie-set-pending-review.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# when a PR is opened, let's add the pending-review label -name: Set pending review label -on: - pull_request: - types: [opened, reopened] - -jobs: - label: - runs-on: ubuntu-latest - steps: - - uses: actions/github-script@v5 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['awaiting-review'] - }); From daec53fa1051c36424504229fcdd7daaf83ce4c9 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 14:01:37 +0100 Subject: [PATCH 07/35] chore: syntax Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 9f7665dc35..1c31589edb 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -35,3 +35,4 @@ jobs: repo: context.repo.repo, labels: ['awaiting-review'] }); + } From ed3073bf1e02dfee880b40803bf82e690f247bb2 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 14:21:42 +0100 Subject: [PATCH 08/35] chore: added some more lookups Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 1c31589edb..5b4ff5a585 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -13,16 +13,44 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/github-script@v5 - id: are-all-reviews-from-reviewers + id: get-requested-reviewers with: script: | - const {data: requestedReviewers} = await github.rest.pulls.listRequestedReviewers({ + // get all requested reviewers for the PR + const {data: requestedReviewers } = await github.rest.pulls.listRequestedReviewers({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.issue.number, }); - console.log(requestedReviewers); + return requestedReviewers; + - uses: actions/github-script@v5 + id: get-reviewer-group-members + with: + github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} + script: | + // Get all members of all required groups + const { data: groupMembers } = await Promise.all( + ${{steps.get-requested-reviewers.outputs.result}}.teams.map( + (team) => github.rest.teams.listMembersInOrg({ + org: context.payload.organization.login, + team_slug: team.slug, + }) + ) + ) + return groupMembers; + - uses: actions/github-script@v5 + id: get-all-current-reviews + with: + script: | + // get all requested reviewers for the PR + const {data: allReviews } = await github.rest.pulls.listReviews({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + }); + + return allReviews; - uses: actions/github-script@v5 id: fix-labels with: @@ -36,3 +64,7 @@ jobs: labels: ['awaiting-review'] }); } + + console.log('requested reviewers', ${{steps.get-requested-reviewers.outputs.result}}); + console.log('reviewer group members', ${{steps.get-reviewer-group-members.outputs.result}}); + console.log('all reviews group members', ${{steps.get-all-current-reviews.outputs.result}}); From 9f67b49f3cca888e8147b1f1a45dfcd6704e970f Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 14:26:40 +0100 Subject: [PATCH 09/35] chore: fixy fixy Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 5b4ff5a585..2a7ac38131 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -30,15 +30,22 @@ jobs: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | // Get all members of all required groups + + const requestedReviewers = ${{steps.get-requested-reviewers.outputs.result}}; const { data: groupMembers } = await Promise.all( - ${{steps.get-requested-reviewers.outputs.result}}.teams.map( - (team) => github.rest.teams.listMembersInOrg({ - org: context.payload.organization.login, - team_slug: team.slug, - }) + requestedReviewers.teams.map( + async (team) => { + const { data } = await github.rest.teams.listMembersInOrg({ + org: context.payload.organization.login, + team_slug: team.slug, + }); + + return data; + } ) ) - return groupMembers; + return groupMembers.flat(); + - uses: actions/github-script@v5 id: get-all-current-reviews with: @@ -51,6 +58,7 @@ jobs: }); return allReviews; + - uses: actions/github-script@v5 id: fix-labels with: From 207d8eb0727879075ac2556642e92805bed0dc80 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 14:29:34 +0100 Subject: [PATCH 10/35] chore: flatten a little nicer Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 2a7ac38131..4bc54deda8 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -24,15 +24,15 @@ jobs: }); return requestedReviewers; + - uses: actions/github-script@v5 id: get-reviewer-group-members with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | // Get all members of all required groups - const requestedReviewers = ${{steps.get-requested-reviewers.outputs.result}}; - const { data: groupMembers } = await Promise.all( + const groupMembers = await Promise.all( requestedReviewers.teams.map( async (team) => { const { data } = await github.rest.teams.listMembersInOrg({ @@ -40,12 +40,12 @@ jobs: team_slug: team.slug, }); - return data; + return { team: team.slug, data }; } ) ) - return groupMembers.flat(); - + return groupMembers; + - uses: actions/github-script@v5 id: get-all-current-reviews with: From 221b7813f0efcf10588234ed7a2ed1f2023fd8bf Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 14:39:14 +0100 Subject: [PATCH 11/35] chore: trying to get matching review Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 4bc54deda8..c3ed087132 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -63,6 +63,7 @@ jobs: id: fix-labels with: script: | + // if it's the author, always add awaiting-review label const isAuthor = context.payload.pull_request.user.login === context.actor if (isAuthor) { github.rest.issues.addLabels({ @@ -71,8 +72,21 @@ jobs: repo: context.repo.repo, labels: ['awaiting-review'] }); + + return } - console.log('requested reviewers', ${{steps.get-requested-reviewers.outputs.result}}); - console.log('reviewer group members', ${{steps.get-reviewer-group-members.outputs.result}}); - console.log('all reviews group members', ${{steps.get-all-current-reviews.outputs.result}}); + // if it's not the author. go through all the required reivews, and see if there's a review from at least one person in + // in those groups. Then remove the label + + const requestedReviewers = ${{steps.get-requested-reviewers.outputs.result}} + const reviewerGroupMembers = ${{steps.get-reviewer-group-members.outputs.result}} + const allCurrentReviews = ${{steps.get-all-current-reviews.outputs.result}} + + const reviewersHasReview = requestedReviewers.teams.map((team) => { + const groupMembers = reviewerGroupMembers.find(({ team: teamSlug }) => teamSlug === team.slug) + const hasReview = allCurrentReviews.some(({ user: { login: reviewer } }) => groupMembers.some(({ login: groupMember}) => reviewer === groupMember)) + return { name: team.slug, hasReview } + }) + + console.log(reviewersHasReview); From 9af4549a844b43f0315bedd9b6f02ffbcdca0fe5 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 15:33:06 +0100 Subject: [PATCH 12/35] chore: try list all members of all teams Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 102 +++++++++--------- 1 file changed, 49 insertions(+), 53 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index c3ed087132..a9561b0470 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -12,28 +12,20 @@ jobs: label: runs-on: ubuntu-latest steps: - - uses: actions/github-script@v5 - id: get-requested-reviewers - with: - script: | - // get all requested reviewers for the PR - const {data: requestedReviewers } = await github.rest.pulls.listRequestedReviewers({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: context.issue.number, - }); - - return requestedReviewers; - + - uses: SvanBoxel/codeowners-action@v1 + id: codeowner - uses: actions/github-script@v5 id: get-reviewer-group-members with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | - // Get all members of all required groups - const requestedReviewers = ${{steps.get-requested-reviewers.outputs.result}}; + // Get all teams and their respective members + const {data: teams} = await github.rest.request('GET /orgs/{org}/teams', { + org: context.payload.organization.login, + }) + const groupMembers = await Promise.all( - requestedReviewers.teams.map( + teams.map( async (team) => { const { data } = await github.rest.teams.listMembersInOrg({ org: context.payload.organization.login, @@ -44,49 +36,53 @@ jobs: } ) ) + + console.log(groupMembers) + console.log(${{ steps.codeowners.output.codeowners }}) return groupMembers; - - uses: actions/github-script@v5 - id: get-all-current-reviews - with: - script: | - // get all requested reviewers for the PR - const {data: allReviews } = await github.rest.pulls.listReviews({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: context.issue.number, - }); + # - uses: actions/github-script@v5 + # id: get-all-current-reviews + # with: + # script: | + # // get all requested reviewers for the PR + # const {data: allReviews } = await github.rest.pulls.listReviews({ + # owner: context.repo.owner, + # repo: context.repo.repo, + # pull_number: context.issue.number, + # }); - return allReviews; + # return allReviews; - - uses: actions/github-script@v5 - id: fix-labels - with: - script: | - // if it's the author, always add awaiting-review label - const isAuthor = context.payload.pull_request.user.login === context.actor - if (isAuthor) { - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['awaiting-review'] - }); + # - uses: actions/github-script@v5 + # id: fix-labels + # with: + # script: | + # // if it's the author, always add awaiting-review label + # const isAuthor = context.payload.pull_request.user.login === context.actor + # if (isAuthor) { + # github.rest.issues.addLabels({ + # issue_number: context.issue.number, + # owner: context.repo.owner, + # repo: context.repo.repo, + # labels: ['awaiting-review'] + # }); - return - } + # return + # } - // if it's not the author. go through all the required reivews, and see if there's a review from at least one person in - // in those groups. Then remove the label + # // if it's not the author. go through all the required reviewers, and see if there's a review from at least one person in + # // in those groups. Then remove the label - const requestedReviewers = ${{steps.get-requested-reviewers.outputs.result}} - const reviewerGroupMembers = ${{steps.get-reviewer-group-members.outputs.result}} - const allCurrentReviews = ${{steps.get-all-current-reviews.outputs.result}} + # const requestedReviewers = ${{steps.get-requested-reviewers.outputs.result}} + # const reviewerGroupMembers = ${{steps.get-reviewer-group-members.outputs.result}} + # const allCurrentReviews = ${{steps.get-all-current-reviews.outputs.result}} - const reviewersHasReview = requestedReviewers.teams.map((team) => { - const groupMembers = reviewerGroupMembers.find(({ team: teamSlug }) => teamSlug === team.slug) - const hasReview = allCurrentReviews.some(({ user: { login: reviewer } }) => groupMembers.some(({ login: groupMember}) => reviewer === groupMember)) - return { name: team.slug, hasReview } - }) + # // HMM We have a problem here, that the requested reviewers is only there until + # const reviewersHasReview = requestedReviewers.teams.map((team) => { + # const groupMembers = reviewerGroupMembers.find(({ team: teamSlug }) => teamSlug === team.slug) + # const hasReview = allCurrentReviews.some(({ user: { login: reviewer } }) => groupMembers.some(({ login: groupMember}) => reviewer === groupMember)) + # return { name: team.slug, hasReview } + # }) - console.log(reviewersHasReview); + # console.log(reviewersHasReview); From e9f653adaa55a7879cb61d6eb894e3f612c81e12 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 15:34:57 +0100 Subject: [PATCH 13/35] chore: actually grab the files Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index a9561b0470..07053508ee 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -12,6 +12,7 @@ jobs: label: runs-on: ubuntu-latest steps: + - uses: actions/checkout@v2 - uses: SvanBoxel/codeowners-action@v1 id: codeowner - uses: actions/github-script@v5 From 7d3308297297357799616635cfc82035ac3766f8 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 15:36:11 +0100 Subject: [PATCH 14/35] chore: use the correct path for the codeowners file \ Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 07053508ee..a1087e058e 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -15,6 +15,8 @@ jobs: - uses: actions/checkout@v2 - uses: SvanBoxel/codeowners-action@v1 id: codeowner + with: + path: './.github/CODEOWNERS' - uses: actions/github-script@v5 id: get-reviewer-group-members with: From 23ac5b11e9b4a34371f5162b36034a130dc70c38 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 15:38:34 +0100 Subject: [PATCH 15/35] chore: fixing again Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index a1087e058e..02d911b2f5 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -23,7 +23,7 @@ jobs: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | // Get all teams and their respective members - const {data: teams} = await github.rest.request('GET /orgs/{org}/teams', { + const {data: teams} = await github.request('GET /orgs/{org}/teams', { org: context.payload.organization.login, }) From 43ccdf5bae43a3afbaa06fb6ef0a5d45ee84358e Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 15:45:36 +0100 Subject: [PATCH 16/35] chore: fixing CODEOWNERS Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 83 ++++++++----------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 02d911b2f5..a8bac2d6c8 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -12,13 +12,17 @@ jobs: label: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: Bhacaz/checkout-files + with: + files: .github/CODEOWNERS + - uses: SvanBoxel/codeowners-action@v1 id: codeowner with: - path: './.github/CODEOWNERS' + path: ./.github/CODEOWNERS + - uses: actions/github-script@v5 - id: get-reviewer-group-members + id: get-all-group-members with: github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} script: | @@ -39,53 +43,38 @@ jobs: } ) ) - - console.log(groupMembers) - console.log(${{ steps.codeowners.output.codeowners }}) + return groupMembers; - # - uses: actions/github-script@v5 - # id: get-all-current-reviews - # with: - # script: | - # // get all requested reviewers for the PR - # const {data: allReviews } = await github.rest.pulls.listReviews({ - # owner: context.repo.owner, - # repo: context.repo.repo, - # pull_number: context.issue.number, - # }); + - uses: actions/github-script@v5 + id: get-all-changed-files + with: + script: | + const { data: allFiles } = await github.rest.pulls.listFiles({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + }); - # return allReviews; + return allFiles; - # - uses: actions/github-script@v5 - # id: fix-labels - # with: - # script: | - # // if it's the author, always add awaiting-review label - # const isAuthor = context.payload.pull_request.user.login === context.actor - # if (isAuthor) { - # github.rest.issues.addLabels({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # labels: ['awaiting-review'] - # }); + - uses: actions/github-script@v5 + id: fix-labels + with: + script: | + // if it's the author, always add awaiting-review label + const isAuthor = context.payload.pull_request.user.login === context.actor + if (isAuthor) { + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['awaiting-review'] + }); - # return - # } + return + } - # // if it's not the author. go through all the required reviewers, and see if there's a review from at least one person in - # // in those groups. Then remove the label - - # const requestedReviewers = ${{steps.get-requested-reviewers.outputs.result}} - # const reviewerGroupMembers = ${{steps.get-reviewer-group-members.outputs.result}} - # const allCurrentReviews = ${{steps.get-all-current-reviews.outputs.result}} - - # // HMM We have a problem here, that the requested reviewers is only there until - # const reviewersHasReview = requestedReviewers.teams.map((team) => { - # const groupMembers = reviewerGroupMembers.find(({ team: teamSlug }) => teamSlug === team.slug) - # const hasReview = allCurrentReviews.some(({ user: { login: reviewer } }) => groupMembers.some(({ login: groupMember}) => reviewer === groupMember)) - # return { name: team.slug, hasReview } - # }) - - # console.log(reviewersHasReview); + console.log('all files', ${{ steps.get-all-changed-files.output.result}}) + console.log('codeowners', ${{ steps.codeowners.output.codeowners}}) + console.log('all teams', ${{ steps.get-all-group-members.output.result}}) From 641487033ac383c3fd211c69ad5539d6ba198d8e Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 15:48:07 +0100 Subject: [PATCH 17/35] chore: get the codeowners\ Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index a8bac2d6c8..917682aca3 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -12,9 +12,7 @@ jobs: label: runs-on: ubuntu-latest steps: - - uses: Bhacaz/checkout-files - with: - files: .github/CODEOWNERS + - uses: actions/checkout@v2 - uses: SvanBoxel/codeowners-action@v1 id: codeowner From 2ba73e1037e994846e913593d23043225a251446 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 15:50:40 +0100 Subject: [PATCH 18/35] chore: it's outputs Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 917682aca3..322f59eefa 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -73,6 +73,6 @@ jobs: return } - console.log('all files', ${{ steps.get-all-changed-files.output.result}}) - console.log('codeowners', ${{ steps.codeowners.output.codeowners}}) - console.log('all teams', ${{ steps.get-all-group-members.output.result}}) + console.log('all files', ${{ steps.get-all-changed-files.outputs.result}}) + console.log('codeowners', ${{ steps.codeowners.outputs.codeowners}}) + console.log('all teams', ${{ steps.get-all-group-members.outputs.result}}) From 9cd42d40c45c01ea335557cb930b8dec8c8115d8 Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 17 Jan 2022 15:54:51 +0100 Subject: [PATCH 19/35] chore: update the ID Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 322f59eefa..be6c19e14c 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v2 - uses: SvanBoxel/codeowners-action@v1 - id: codeowner + id: codeowners with: path: ./.github/CODEOWNERS From c5614d98bc20d64a66cc309aad9e760046be1614 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 07:51:31 +0100 Subject: [PATCH 20/35] chore: added comment for next steps Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index be6c19e14c..25662d5f6f 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -76,3 +76,8 @@ jobs: console.log('all files', ${{ steps.get-all-changed-files.outputs.result}}) console.log('codeowners', ${{ steps.codeowners.outputs.codeowners}}) console.log('all teams', ${{ steps.get-all-group-members.outputs.result}}) + + // Go through each file changed and go through each codeowner entry and use minimatch to see if the file matches + // strip the backstage group from the name? + // If it does match push the owner to a list of reviewers + // check to see the reviews and if there is at least one matching reviewer from those group From 55bb755ce2d700e49675a67ffd41302b5fc99df6 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 10:52:48 +0100 Subject: [PATCH 21/35] chore: try go get the correct reviews Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 25662d5f6f..618d487598 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -55,6 +55,18 @@ jobs: }); return allFiles; + + - uses: actions/github-script@v5 + id: get-all-current-reviews + with: + script: | + const { data: allReviews } = await github.rest.pulls.listReviews({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + }); + + return allReviews; - uses: actions/github-script@v5 id: fix-labels @@ -73,11 +85,28 @@ jobs: return } - console.log('all files', ${{ steps.get-all-changed-files.outputs.result}}) - console.log('codeowners', ${{ steps.codeowners.outputs.codeowners}}) - console.log('all teams', ${{ steps.get-all-group-members.outputs.result}}) - // Go through each file changed and go through each codeowner entry and use minimatch to see if the file matches // strip the backstage group from the name? // If it does match push the owner to a list of reviewers // check to see the reviews and if there is at least one matching reviewer from those group + + const changedFiles = ${{ steps.get-all-changed-files.outputs.result }} + const codeowners = ${{ steps.codeowners.outputs.codeowners }} + const allReviews = ${{ steps.get-all-current-reviews.outputs.result }} + const groupMembers = ${{ steps.get-all-group-members.outputs.result }} + const minimatch = require('mimimatch'); + + const reviewers = new Set(); + + for (const file of changedFiles) { + for (const [pattern, owners] of Object.entries(codeowners)) { + if (minimatch(file.filename, codeowner.pattern)) { + for (const owner of owners) { + reviewers.add(owner); + } + } + } + } + + console.log(reviewers); + From 52c32c7f76b0fcccbc1a8f9e9dcf959dbf6dbc28 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 10:57:23 +0100 Subject: [PATCH 22/35] chore: ignore author for now Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 618d487598..a4638e0f6b 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -73,17 +73,17 @@ jobs: with: script: | // if it's the author, always add awaiting-review label - const isAuthor = context.payload.pull_request.user.login === context.actor - if (isAuthor) { - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['awaiting-review'] - }); + // const isAuthor = context.payload.pull_request.user.login === context.actor + // if (isAuthor) { + // github.rest.issues.addLabels({ + // issue_number: context.issue.number, + // owner: context.repo.owner, + // repo: context.repo.repo, + // labels: ['awaiting-review'] + // }); - return - } + // return + // } // Go through each file changed and go through each codeowner entry and use minimatch to see if the file matches // strip the backstage group from the name? From 9a9d56aea1ec780521199f305aa20168fe4e9488 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 10:59:09 +0100 Subject: [PATCH 23/35] chore: install mimimatch Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index a4638e0f6b..49edcb2263 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -13,7 +13,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - + - uses: actions/setup-node@v2 + with: + node-version: 14 + - run: npm install minimatch - uses: SvanBoxel/codeowners-action@v1 id: codeowners with: From 17676f3b626aa56ea5138c1b36d4c52028a6baa5 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:01:38 +0100 Subject: [PATCH 24/35] chore: require the correct package name Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 49edcb2263..8b79c6c36b 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -13,10 +13,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: 14 - - run: npm install minimatch + # - uses: actions/setup-node@v2 + # with: + # node-version: 14 + # - run: npm install minimatch - uses: SvanBoxel/codeowners-action@v1 id: codeowners with: @@ -97,7 +97,7 @@ jobs: const codeowners = ${{ steps.codeowners.outputs.codeowners }} const allReviews = ${{ steps.get-all-current-reviews.outputs.result }} const groupMembers = ${{ steps.get-all-group-members.outputs.result }} - const minimatch = require('mimimatch'); + const minimatch = require('minimatch'); const reviewers = new Set(); From a336c520e95fc90a394fc2b67a317b16ce639c2d Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:02:48 +0100 Subject: [PATCH 25/35] chore: install minimatch Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 8b79c6c36b..6de72e5e5a 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -13,10 +13,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - # - uses: actions/setup-node@v2 - # with: - # node-version: 14 - # - run: npm install minimatch + - uses: actions/setup-node@v2 + with: + node-version: 14 + - run: npm install minimatch - uses: SvanBoxel/codeowners-action@v1 id: codeowners with: From 0c4e39408b43e89737f7cbc83561a8e2b8618e9c Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:04:11 +0100 Subject: [PATCH 26/35] match properly Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 6de72e5e5a..664793ee59 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -103,7 +103,7 @@ jobs: for (const file of changedFiles) { for (const [pattern, owners] of Object.entries(codeowners)) { - if (minimatch(file.filename, codeowner.pattern)) { + if (minimatch(file.filename, pattern)) { for (const owner of owners) { reviewers.add(owner); } From 407d010e5c2ab12d45238556f028a87497b86a37 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:07:56 +0100 Subject: [PATCH 27/35] chore: add some debug logging Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 664793ee59..9f4c6996e2 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -103,6 +103,8 @@ jobs: for (const file of changedFiles) { for (const [pattern, owners] of Object.entries(codeowners)) { + + console.log(file.filename, pattern); if (minimatch(file.filename, pattern)) { for (const owner of owners) { reviewers.add(owner); From 1c91bea01eb0bfdef3e76238190aff2199257bb0 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:11:29 +0100 Subject: [PATCH 28/35] catch all Signed-off-by: blam Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 9f4c6996e2..f309d008ac 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -101,11 +101,13 @@ jobs: const reviewers = new Set(); + // The default catch all is not added to the codeowners response + codeowners['*'] = '@backstage/reviewers'; + for (const file of changedFiles) { for (const [pattern, owners] of Object.entries(codeowners)) { - - console.log(file.filename, pattern); - if (minimatch(file.filename, pattern)) { + + if (minimatch(`/${file.filename}`, pattern)) { for (const owner of owners) { reviewers.add(owner); } @@ -114,4 +116,5 @@ jobs: } console.log(reviewers); + From 995ab54b72f5b5e4f8052b50bf3a665680c18a16 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:23:56 +0100 Subject: [PATCH 29/35] chore: think the match should be right now Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index f309d008ac..a9e7652c24 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -102,12 +102,12 @@ jobs: const reviewers = new Set(); // The default catch all is not added to the codeowners response - codeowners['*'] = '@backstage/reviewers'; + codeowners['*'] = ['@backstage/reviewers']; for (const file of changedFiles) { + const prefixedFile = `/${file.filename}`; for (const [pattern, owners] of Object.entries(codeowners)) { - - if (minimatch(`/${file.filename}`, pattern)) { + if (minimatch(`/${file.filename}`, `${pattern}/*`, { matchBase: true })) { for (const owner of owners) { reviewers.add(owner); } From 8f3dde70c8264a1459d3f4c3a3edc20f67d17118 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:26:12 +0100 Subject: [PATCH 30/35] chore: added logging Signed-off-by: blam --- .github/workflows/goalie-on-pr-review-or-response.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index a9e7652c24..9b9101ceb7 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -105,8 +105,9 @@ jobs: codeowners['*'] = ['@backstage/reviewers']; for (const file of changedFiles) { - const prefixedFile = `/${file.filename}`; for (const [pattern, owners] of Object.entries(codeowners)) { + + console.log(minimatch(`/${file.filename}`, `${pattern}/*`, { matchBase: true }), `/${file.filename}`, `${pattern}/*`) if (minimatch(`/${file.filename}`, `${pattern}/*`, { matchBase: true })) { for (const owner of owners) { reviewers.add(owner); From 7c879508c41b25eab9ef61fa0ff7a23813f30f4b Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:36:34 +0100 Subject: [PATCH 31/35] use the codeowners library instead Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 9b9101ceb7..3c34ec3559 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -16,11 +16,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 14 - - run: npm install minimatch - - uses: SvanBoxel/codeowners-action@v1 - id: codeowners - with: - path: ./.github/CODEOWNERS + - run: npm install codeowners - uses: actions/github-script@v5 id: get-all-group-members @@ -94,26 +90,15 @@ jobs: // check to see the reviews and if there is at least one matching reviewer from those group const changedFiles = ${{ steps.get-all-changed-files.outputs.result }} - const codeowners = ${{ steps.codeowners.outputs.codeowners }} const allReviews = ${{ steps.get-all-current-reviews.outputs.result }} const groupMembers = ${{ steps.get-all-group-members.outputs.result }} - const minimatch = require('minimatch'); + const Codeowners = require('codeowners'); + const codeowners = new Codeowners(); const reviewers = new Set(); - // The default catch all is not added to the codeowners response - codeowners['*'] = ['@backstage/reviewers']; - for (const file of changedFiles) { - for (const [pattern, owners] of Object.entries(codeowners)) { - - console.log(minimatch(`/${file.filename}`, `${pattern}/*`, { matchBase: true }), `/${file.filename}`, `${pattern}/*`) - if (minimatch(`/${file.filename}`, `${pattern}/*`, { matchBase: true })) { - for (const owner of owners) { - reviewers.add(owner); - } - } - } + reviewers.add(...codeowners.getOwner(file.filename)); } console.log(reviewers); From 7400c02e70ec2b25a9a9f99ed09a8c5bf5fb326c Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:48:03 +0100 Subject: [PATCH 32/35] chore: think it should work now Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index 3c34ec3559..b3501afb7c 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -36,7 +36,7 @@ jobs: team_slug: team.slug, }); - return { team: team.slug, data }; + return { team: `$backstage/${team.slug}`, data }; } ) ) @@ -95,12 +95,30 @@ jobs: const Codeowners = require('codeowners'); const codeowners = new Codeowners(); - const reviewers = new Set(); + const expectedReviewers = new Set(); for (const file of changedFiles) { - reviewers.add(...codeowners.getOwner(file.filename)); + expectedReviewers.add(...codeowners.getOwner(file.filename)); } - console.log(reviewers); + const hasReviewed = new Set(); + + // For each reviewer in the group, check to see if they have a review set + for (const reviewer of expectedReviewers) { + const members = groupMembers.find(member => member.team === reviewer); + const hasMemberReview = allReviews.some(review => members.data.some(member => member.login === review.user.login)); + if (hasMemberReview) { + hasReviewed.add(reviewer); + } + } + + if (hasReviewed.size === expectedReviewers.size) { + github.rest.issues.removeLabel({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + name: 'awaiting-review' + }).catch(() => {}); + } From 9af913243f42c85e9f8215579836600d29c5dd31 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 11:56:56 +0100 Subject: [PATCH 33/35] chore: thinking that this should be working now Signed-off-by: blam --- .../goalie-on-pr-review-or-response.yaml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie-on-pr-review-or-response.yaml index b3501afb7c..a5a8aaad55 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie-on-pr-review-or-response.yaml @@ -36,7 +36,7 @@ jobs: team_slug: team.slug, }); - return { team: `$backstage/${team.slug}`, data }; + return { team: `@backstage/${team.slug}`, data }; } ) ) @@ -106,9 +106,18 @@ jobs: // For each reviewer in the group, check to see if they have a review set for (const reviewer of expectedReviewers) { const members = groupMembers.find(member => member.team === reviewer); - const hasMemberReview = allReviews.some(review => members.data.some(member => member.login === review.user.login)); - if (hasMemberReview) { - hasReviewed.add(reviewer); + if (members) { + // then we are dealing with a group + const hasMemberReview = allReviews.some(review => members.data.some(member => member.login === review.user.login)); + if (hasMemberReview) { + hasReviewed.add(reviewer); + } + } else { + // reviewer is a person + const hasReview = allReviews.some(review => reviewer === `@${review.user.login}`); + if (hasReview) { + hasReviewed.add(reviewer); + } } } From 34f30674a93cfd93dd2f363ed7090650d577a625 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 12:01:26 +0100 Subject: [PATCH 34/35] chore: setting awaiting review labels until all reviews have been fulfilled Signed-off-by: blam --- ...pr-review-or-response.yaml => goalie.yaml} | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) rename .github/workflows/{goalie-on-pr-review-or-response.yaml => goalie.yaml} (89%) diff --git a/.github/workflows/goalie-on-pr-review-or-response.yaml b/.github/workflows/goalie.yaml similarity index 89% rename from .github/workflows/goalie-on-pr-review-or-response.yaml rename to .github/workflows/goalie.yaml index a5a8aaad55..9f1f99fbd7 100644 --- a/.github/workflows/goalie-on-pr-review-or-response.yaml +++ b/.github/workflows/goalie.yaml @@ -1,5 +1,5 @@ # on a review from someone in the reviewers group, remove the awaiting-review label and add the awaiting-author label -name: Update labels for awaiting review +name: Set Goalie Labels on: pull_request_review: types: [submitted] @@ -40,9 +40,9 @@ jobs: } ) ) - + return groupMembers; - + - uses: actions/github-script@v5 id: get-all-changed-files with: @@ -66,23 +66,22 @@ jobs: }); return allReviews; - + - uses: actions/github-script@v5 id: fix-labels with: script: | // if it's the author, always add awaiting-review label - // const isAuthor = context.payload.pull_request.user.login === context.actor - // if (isAuthor) { - // github.rest.issues.addLabels({ - // issue_number: context.issue.number, - // owner: context.repo.owner, - // repo: context.repo.repo, - // labels: ['awaiting-review'] - // }); - - // return - // } + const isAuthor = context.payload.pull_request.user.login === context.actor + if (isAuthor) { + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['awaiting-review'] + }); + return; + } // Go through each file changed and go through each codeowner entry and use minimatch to see if the file matches // strip the backstage group from the name? @@ -129,5 +128,3 @@ jobs: name: 'awaiting-review' }).catch(() => {}); } - - From d622d37fd62a1bdb9d79c78b65b12d527c891f63 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 18 Jan 2022 13:19:55 +0100 Subject: [PATCH 35/35] chore: added the missing awaits. Signed-off-by: blam --- .github/workflows/goalie.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/goalie.yaml b/.github/workflows/goalie.yaml index 9f1f99fbd7..2303039c7f 100644 --- a/.github/workflows/goalie.yaml +++ b/.github/workflows/goalie.yaml @@ -74,7 +74,7 @@ jobs: // if it's the author, always add awaiting-review label const isAuthor = context.payload.pull_request.user.login === context.actor if (isAuthor) { - github.rest.issues.addLabels({ + await github.rest.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, @@ -121,7 +121,7 @@ jobs: } if (hasReviewed.size === expectedReviewers.size) { - github.rest.issues.removeLabel({ + await github.rest.issues.removeLabel({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo,