From a5cd545a1bf864c7aa83ebbd51e2ed2fdb035bb9 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 21 Apr 2025 12:02:54 -0700 Subject: [PATCH] Chore: replace secretary with GHA (#9723) --- .github/labeler.yml | 22 ++++++++ .github/workflows/pr-bot.yml | 100 +++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 .github/labeler.yml create mode 100644 .github/workflows/pr-bot.yml diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 000000000..8d87d13c6 --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,22 @@ +backend: + - changed-files: + - any-glob-to-any-file: + - 'src/**' + - 'pyproject.toml' + - 'uv.lock' + - 'requirements.txt' + +frontend: + - changed-files: + - any-glob-to-any-file: + - 'src-ui/**' + +documentation: + - changed-files: + - any-glob-to-any-file: + - 'docs/**' + +ci-cd: + - changed-files: + - any-glob-to-any-file: + - '.github/**' diff --git a/.github/workflows/pr-bot.yml b/.github/workflows/pr-bot.yml new file mode 100644 index 000000000..85c3a9fd8 --- /dev/null +++ b/.github/workflows/pr-bot.yml @@ -0,0 +1,100 @@ +name: PR Bot + +on: + pull_request: + types: [opened] + pull_request_target: + types: [opened] + +permissions: + contents: read + pull-requests: write + +jobs: + pr-bot: + name: Automated PR Bot + runs-on: ubuntu-latest + + steps: + - name: Label by file path + uses: actions/labeler@v5 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Label by size + uses: Gascon1/pr-size-labeler@v1.3.0 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + xs_label: 'small-change' + xs_diff: '9' + s_label: 'non-trivial' + s_diff: '99999' + fail_if_xl: 'false' + excluded_files: > + /\.lock$/ + /\.txt$/ + ^src-ui/pnpm-lock\.yaml$ + ^src-ui/messages\.xlf$ + ^src/locale/en_US/LC_MESSAGES/django\.po$ + + - name: Label bot-generated PRs + if: ${{ contains(github.actor, 'dependabot') || contains(github.actor, 'crowdin-bot') }} + uses: actions/github-script@v7 + with: + script: | + const pr = context.payload.pull_request; + const user = pr.user.login.toLowerCase(); + const labels = []; + + if (user.includes('dependabot')) { + labels.push('dependencies'); + } + + if (user.includes('crowdin-bot')) { + labels.push('translation', 'skip-changelog'); + } + + if (labels.length) { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + labels, + }); + } + + - name: Welcome comment + if: ${{ !contains(github.actor, 'bot') }} + uses: actions/github-script@v7 + with: + script: | + const pr = context.payload.pull_request; + const user = pr.user.login; + + const { data: members } = await github.rest.orgs.listMembers({ + org: 'paperless-ngx', + }); + + const memberLogins = members.map(m => m.login.toLowerCase()); + if (memberLogins.includes(user.toLowerCase())) { + core.info('Skipping comment: user is org member'); + return; + } + + const body = + "Hello @" + user + ",\n\n" + + "Thank you very much for submitting this PR to us!\n\n" + + "This is what will happen next:\n\n" + + "1. CI tests will run against your PR to ensure quality and consistency.\n" + + "2. Next, human contributors from paperless-ngx review your changes.\n" + + "3. Please address any issues that come up during the review as soon as you are able to.\n" + + "4. If accepted, your pull request will be merged into the `dev` branch and changes there will be tested further.\n" + + "5. Eventually, changes from you and other contributors will be merged into `main` and a new release will be made.\n\n" + + "You'll be hearing from us soon, and thank you again for contributing to our project."; + + await github.rest.issues.createComment({ + issue_number: pr.number, + owner: context.repo.owner, + repo: context.repo.repo, + body, + });