diff --git a/.github/workflows/goalie-cron.yaml b/.github/workflows/goalie-cron.yaml index 629c33d76b..72c160a30a 100644 --- a/.github/workflows/goalie-cron.yaml +++ b/.github/workflows/goalie-cron.yaml @@ -29,40 +29,38 @@ jobs: state: 'open', }); - console.log(allPrs); - return allPrs; - # - uses: actions/checkout@v2 - # - uses: actions/setup-node@v2 - # with: - # node-version: 14 - # - run: npm install codeowners + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 14 + - run: npm install codeowners - # - uses: actions/github-script@v5 - # id: get-all-group-members - # with: - # github-token: ${{ steps.get_workflow_token.outputs.token }} - # script: | - # // Get all teams and their respective members - # const {data: teams} = await github.request('GET /orgs/{org}/teams', { - # org: context.payload.organization.login, - # }) + - uses: actions/github-script@v5 + id: get-all-group-members + with: + github-token: ${{ steps.get_workflow_token.outputs.token }} + script: | + // Get all teams and their respective members + const {data: teams} = await github.request('GET /orgs/{org}/teams', { + org: context.repo.owner, + }) - # const groupMembers = await Promise.all( - # teams.map( - # async (team) => { - # const { data } = await github.rest.teams.listMembersInOrg({ - # org: context.payload.organization.login, - # team_slug: team.slug, - # }); + const groupMembers = await Promise.all( + teams.map( + async (team) => { + const { data } = await github.rest.teams.listMembersInOrg({ + org: context.repo.owner, + team_slug: team.slug, + }); - # return { team: `@backstage/${team.slug}`, data }; - # } - # ) - # ) + return { team: `@backstage/${team.slug}`, data }; + } + ) + ) - # return groupMembers; + return groupMembers; # - uses: actions/github-script@v5 # id: get-all-changed-files @@ -88,65 +86,71 @@ jobs: # return allReviews; - # - uses: actions/github-script@v5 - # id: fix-labels - # with: - # github-token: ${{ secrets.GITHUB_TOKEN }} - # script: | - # // if it's the author, always add awaiting-review label - # const isAuthor = context.payload.pull_request.user.login === context.actor - # if (isAuthor) { - # await github.rest.issues.addLabels({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # labels: ['awaiting-review'] - # }); - # return; - # } + - uses: actions/github-script@v5 + id: fix-labels + with: + github-token: ${{ steps.get_workflow_token.outputs.token }} + script: | + // Go through each PR - # // 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 allPullRequests = ${{ steps.get-all-open-prs.outputs.result }} + const groupMembers = ${{ steps.get-all-group-members.outputs.result }} + const Codeowners = require('codeowners'); + const codeowners = new Codeowners(); - # const changedFiles = ${{ steps.get-all-changed-files.outputs.result }} - # const allReviews = ${{ steps.get-all-current-reviews.outputs.result }} - # const groupMembers = ${{ steps.get-all-group-members.outputs.result }} - # const Codeowners = require('codeowners'); - # const codeowners = new Codeowners(); - # const expectedReviewers = new Set(); + for (const pullRequest of allPullRequests) { + // 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 - # for (const file of changedFiles) { - # expectedReviewers.add(...codeowners.getOwner(file.filename)); - # } + const changedFiles = await github.paginate(github.rest.pulls.listFiles, { + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pullRequest.number, + }); - # const hasReviewed = new Set(); + const allReviews = await github.paginate(github.rest.pulls.listReviews, { + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: pullRequest.number, + }); + + const expectedReviewers = 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); - # 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); - # } - # } - # } + for (const file of changedFiles) { + expectedReviewers.add(...codeowners.getOwner(file.filename)); + } - # if (hasReviewed.size === expectedReviewers.size) { - # await github.rest.issues.removeLabel({ - # issue_number: context.issue.number, - # owner: context.repo.owner, - # repo: context.repo.repo, - # name: 'awaiting-review' - # }).catch(() => {}); - # } + 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); + 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); + } + } + } + + if (hasReviewed.size === expectedReviewers.size) { + console.log('should remove label'); + //await github.rest.issues.removeLabel({ + // issue_number: context.issue.number, + // owner: context.repo.owner, + // repo: context.repo.repo, + // name: 'awaiting-review' + //}).catch(() => {}); + } else { console.log('should add label')} + } +