feat: split out the workflow to run for each open PR

signed-off-by: blam <ben@blam.sh>
This commit is contained in:
blam
2022-01-18 18:04:46 +01:00
parent 65b0d1b3fd
commit 557ad7e462
+87 -83
View File
@@ -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')}
}