This is an automated email from the ASF dual-hosted git repository. xuanwo pushed a commit to branch reviewer in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
commit 99ac1452eb5738bf65178f2163cbea4dff28bfe9 Author: Xuanwo <[email protected]> AuthorDate: Wed Jan 17 16:18:41 2024 +0800 ci: Pick random reviewers from committer list Signed-off-by: Xuanwo <[email protected]> --- .github/CODEOWNERS | 5 +++ .github/scripts/assign_reviewers.js | 70 +++++++++++++++++++++++++++++++++++++ .github/workflows/ci_review.yml | 38 ++++++++++++++++++++ 3 files changed, 113 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 57cae29796..0c2decab5b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,3 +8,8 @@ /bindings/nodejs/ @suyanhanx /bindings/python/ @messense @Zheaoli /bindings/ruby/ @PsiACE + +# This is a place holder for all committers who what to join the review of not owned code. +# +# More details could be found at <https://github.com/apache/incubator-opendal/issues/3967> +COMMITTERS_PLACEHOLDER @Xuanwo @Ji-Xinyou @morristai @dqhl76 @ClSlaid @Young-Flash @G-XD @oowl @silver-ymz diff --git a/.github/scripts/assign_reviewers.js b/.github/scripts/assign_reviewers.js new file mode 100644 index 0000000000..6f9e9a9526 --- /dev/null +++ b/.github/scripts/assign_reviewers.js @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +async function run(github, context, fs) { + try { + const token = core.getInput('github-token', {required: true}); + const octokit = github.getOctokit(token); + + // Pick two reviewers from list + const numberOfReviewers = 2; + const repo = github.context.repo; + + // Read CODEOWNERS + const codeownersContent = fs.readFileSync('.github/CODEOWNERS', 'utf8'); + const lines = codeownersContent.split('\n'); + + // Search COMMITTERS + const placeholderLine = lines.find(line => line.startsWith('COMMITTERS_PLACEHOLDER')); + if (!placeholderLine) { + throw new Error("No COMMITTERS found in CODEOWNERS"); + } + + // Extract committers from placeholder line + const committers = placeholderLine.match(/@[\w-]+/g).map(u => u.substring(1)); + if (committers.length === 0) { + throw new Error("No committer found in COMMITTERS_PLACEHOLDER"); + } + + // Pick reviewers + const selectedReviewers = []; + while (selectedReviewers.length < numberOfReviewers && committers.length > 0) { + const randomIndex = Math.floor(Math.random() * committers.length); + selectedReviewers.push(committers.splice(randomIndex, 1)[0]); + } + + // Assign reviewers Pull Request + if (github.context.payload.pull_request) { + const pullRequestNumber = github.context.payload.pull_request.number; + await octokit.rest.pulls.requestReviewers({ + owner: repo.owner, + repo: repo.repo, + pull_number: pullRequestNumber, + reviewers: selectedReviewers, + }); + console.log(`Assigned reviewers: ${selectedReviewers.join(', ')}`); + } + } catch (error) { + core.setFailed(`Action failed with error: ${error}`); + } +} + +module.exports = ({github, context, fs}) => { + return run(github, context, fs) +} diff --git a/.github/workflows/ci_review.yml b/.github/workflows/ci_review.yml new file mode 100644 index 0000000000..ab53eb7a71 --- /dev/null +++ b/.github/workflows/ci_review.yml @@ -0,0 +1,38 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Assign Reviewers from COMMITTERS in CODEOWNERS + +on: + pull_request_target: + types: [opened, reopened] + +jobs: + assign-reviewers: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Assign Reviewers + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const script = require('.github/scripts/assign-reviewers.js') + script({github, context, fs}) + github-token: ${{ secrets.GITHUB_TOKEN }}
