diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..88a67760 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,31 @@ +## Description + +_Add a comprehensive description of proposed changes_ + +_List associated issue number(s) if exist(s): #6 (for example)_ + +_Documentation PR (if needed): #1340 (for example)_ + +--- + +PR should start as a draft, then move to ready for review state after CI is passed and all applicable checkboxes are closed. +This approach ensures that reviewers don't spend extra time asking for regular requirements. + +You can remove a checkbox as not applicable only if it doesn't relate to this PR in any way. + +Checklist to comply with **before moving PR from draft**: + +**PR completeness and readability** + +- [ ] I have reviewed my changes thoroughly before submitting this pull request. +- [ ] I have commented my code, particularly in hard-to-understand areas. +- [ ] I have updated the documentation to reflect the changes or created a separate PR with update and provided its number in the description, if necessary. +- [ ] Git commit message contains an appropriate signed-off-by string _(see [CONTRIBUTING.md](https://github.com/intel/scikit-learn-intelex/blob/main/CONTRIBUTING.md#pull-requests) for details)_. +- [ ] I have added a respective label(s) to PR if I have a permission for that. +- [ ] I have resolved any merge conflicts that might occur with the base branch. + +**Testing** + +- [ ] I have run it locally and tested the changes extensively. +- [ ] All CI jobs are green or I have provided justification why they aren't. +- [ ] I have extended testing suite if new functionality was introduced in this PR. diff --git a/.github/workflows/pr-checklist.yml b/.github/workflows/pr-checklist.yml new file mode 100644 index 00000000..d81fc88e --- /dev/null +++ b/.github/workflows/pr-checklist.yml @@ -0,0 +1,62 @@ +#=============================================================================== +# Copyright 2024 Intel Corporation +# +# Licensed 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: Check PR Checklist + +on: + pull_request: + types: [opened, edited, synchronize, ready_for_review, converted_to_draft] + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref_name }}-${{ github.event.number || github.sha }} + cancel-in-progress: true + +jobs: + checklist: + name: Close all checkboxes before moving from draft + timeout-minutes: 5 + runs-on: ubuntu-24.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Get pull request details + id: pr + uses: actions/github-script@v7 + with: + script: | + const pr_desc = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.payload.pull_request.number + }); + core.setOutput('body', pr_desc.data.body) + core.setOutput('draft', pr_desc.data.draft) + core.setOutput('author_type', pr_desc.data.user.type) + - name: Check if all checkboxes are checked + id: checkboxes + env: + DESCRIPTION: ${{ steps.pr.outputs.body }} + run: | + UNCHECKED=$(echo "$DESCRIPTION" | grep -c '\[ \]' || true) + echo "unchecked=$UNCHECKED" >> $GITHUB_OUTPUT + - name: Fail if not all checkboxes are checked, PR is not draft and author is not a bot + if: ${{ (steps.pr.outputs.draft == 'false') && (steps.checkboxes.outputs.unchecked != '0') && (steps.pr.outputs.author_type != 'Bot') }} + run: | + echo "Unchecked checkboxes: ${{ steps.checkboxes.outputs.unchecked }}" + exit 1