From 7cb54b39ced398d814de5e4e3f0d62914cbe74ec Mon Sep 17 00:00:00 2001 From: Vysakh Premkumar <84713473+tellmeY18@users.noreply.github.com> Date: Tue, 12 Nov 2024 22:57:50 +0530 Subject: [PATCH] added non-core-qn workflow (#8889) * added non-core-qn workflow * replaced bash with js * made it to single step * updated to use env * setup variables as secrets * applied coderabbitai suggested changes * Improved Slack message. * updated the script to use vars instead of secrets uu * use slack workflow instead of slCK APPS slack --- .github/workflows/notify-non-core-qn.yml | 87 ++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 .github/workflows/notify-non-core-qn.yml diff --git a/.github/workflows/notify-non-core-qn.yml b/.github/workflows/notify-non-core-qn.yml new file mode 100644 index 00000000000..7aa59e6e868 --- /dev/null +++ b/.github/workflows/notify-non-core-qn.yml @@ -0,0 +1,87 @@ +name: Notify Core Team on Non-Core Questions +on: + issue_comment: + types: [created] +permissions: + issues: write + pull-requests: write +jobs: + notify_core_team: + runs-on: ubuntu-latest + env: + ALLOWED_USERNAMES: ${{ vars.ALLOWED_USERNAMES }} + QUESTION_KEYWORDS: ${{ vars.QUESTION_KEYWORDS }} + QUESTION_LABELS: ${{ vars.QUESTION_LABELS }} + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + steps: + - name: Check and Notify + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + console.log('Script started'); + const isOrgMember = (commenter, allowedUsers) => { + return allowedUsers.split(',').map(u => u.trim()).includes(commenter); + }; + const containsQuestionKeywords = (text, keywords) => { + return keywords.split(',').map(k => k.trim()).some(keyword => + text.toLowerCase().includes(keyword.toLowerCase()) + ); + }; + const addLabelsToIssue = async (github, context, labelsString) => { + const labels = labelsString.split(',').map(label => label.trim()).filter(label => label); + if (labels.length > 0) { + console.log('Adding labels:', labels); + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.issue.number, + labels: labels + }); + } + }; + const sendSlackNotification = async (webhook, payload) => { + const response = await fetch(webhook, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + }; + const commenter = context.payload.comment.user.login; + console.log('Commenter:', commenter); + if (!isOrgMember(commenter, process.env.ALLOWED_USERNAMES)) { + const commentBody = context.payload.comment.body; + const sanitizedComment = commentBody + ?.replace(/[^\w\s?]/gi, '') + .toLowerCase(); + console.log('Comment body:', sanitizedComment); + if (containsQuestionKeywords(sanitizedComment, process.env.QUESTION_KEYWORDS)) { + try { + console.log('Adding labels to the issue'); + await addLabelsToIssue(github, context, process.env.QUESTION_LABELS); + console.log('Labels added successfully'); + const issueUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/issues/${context.payload.issue.number}`; + const issueTitle = context.payload.issue.title; + const issueNumber = context.payload.issue.number; + console.log('Issue URL:', issueUrl); + console.log('Issue Title:', issueTitle); + console.log('Issue Number:', issueNumber); + const payload = { + link: issueUrl, + Question: commentBody, + "issue-number": issueNumber, + title: issueTitle, + user: commenter + }; + await sendSlackNotification(process.env.SLACK_WEBHOOK, payload); + console.log('Slack notification sent successfully'); + } catch (error) { + console.error('Workflow failed:', error.message); + core.setFailed(`Workflow failed: ${error.message}`); + } + } + } + console.log('Script ended');