diff --git a/.github/user-mapping.json b/.github/user-mapping.json new file mode 100644 index 00000000..d96af1a8 --- /dev/null +++ b/.github/user-mapping.json @@ -0,0 +1,6 @@ +{ + "Doeunnkimm": "Web_김도은", + "semnil5202": "Web_이세민", + "LeeJeongHooo": "Web_이정호", + "Andrevile": "Web_장종오" +} diff --git a/.github/workflows/slack-notification.yml b/.github/workflows/slack-notification.yml deleted file mode 100644 index edd7796c..00000000 --- a/.github/workflows/slack-notification.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: Slack Notification - -on: - pull_request: - types: [opened, ready_for_review] - issue_comment: - types: [created, edited] - -jobs: - send_slack_notification: - name: Send Slack Notification - runs-on: ubuntu-latest - steps: - - name: Send Slack Notification for PR creation - if: github.event_name == 'pull_request' && github.event.pull_request.draft == false - uses: 8398a7/action-slack@v3 - with: - status: custom - fields: author,pullRequest - custom_payload: | - { - attachments: [{ - color: '${{ job.status }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning', - text: `Actor: ${process.env.AS_AUTHOR} - PR: ${process.env.AS_PULL_REQUEST}`, - }] - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - - - name: Extract mentions from comment body - id: extract_mentions_comment - if: github.event_name == 'issue_comment' - run: | - mentions=$(echo "${{ github.event.comment.body }}" | grep -o '@[[:alnum:]_-]\+' | paste -sd ' ' -) - echo "::set-output name=mentions::$mentions" - - - name: Map GitHub mentions to Slack user IDs - id: map_to_slack_ids - if: github.event_name == 'issue_comment' - run: | - declare -A slack_ids - slack_ids=(["@Doeunnkimm"]="U07600UQG3T" ["@semnil5202"]="U075KR29RGR" ["@Andrevile"]="U07545VMS21" ["@LeeJeongHooo"]="U075C1A16LT") - mentions="${{ steps.extract_mentions_comment.outputs.mentions }}" - slack_mentions="" - for mention in $mentions; do - if [[ -n "${slack_ids[$mention]}" ]]; then - slack_mentions="$slack_mentions <@${slack_ids[$mention]}>" - fi - done - echo "::set-output name=slack_mentions::$slack_mentions" - - - name: Send Slack Notification for comment if team members mentioned - if: ${{ github.event_name == 'issue_comment' && steps.map_to_slack_ids.outputs.slack_mentions != '' }} - uses: 8398a7/action-slack@v3 - with: - status: custom - fields: pullRequest - custom_payload: | - { - attachments: [{ - color: '${{ job.status }}' === 'success' ? 'good' : '${{ job.status }}' === 'failure' ? 'danger' : 'warning', - text: `${process.env.AS_PULL_REQUEST} 에서 ${{ steps.map_to_slack_ids.outputs.slack_mentions }} 님을 언급했습니다. - 꼭 나중에 들어가서 확인하기! - 메시지: ${{ github.event.comment.body }}`, - }] - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} - - - name: Debug mentions - if: ${{ github.event_name == 'issue_comment' && steps.map_to_slack_ids.outputs.slack_mentions == '' }} - run: echo "No team members mentioned in the comment." diff --git a/.github/workflows/slack-notify.yml b/.github/workflows/slack-notify.yml new file mode 100644 index 00000000..562563cb --- /dev/null +++ b/.github/workflows/slack-notify.yml @@ -0,0 +1,109 @@ +name: Notify Slack on PR and Comment + +on: + pull_request: + types: [opened, reopened, synchronize, review_requested] + issue_comment: + types: [created] + pull_request_review: + types: [submitted] + +jobs: + notify: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Determine event type + id: determine_event + run: echo "event_type=${{ github.event_name }}" >> $GITHUB_ENV + + - name: Read user mapping + id: read_mapping + run: | + mapping=$(cat .github/user-mapping.json) + echo "mapping=$mapping" >> $GITHUB_ENV + + - name: Cache Slack message timestamp + if: ${{ env.event_type == 'pull_request' }} + uses: actions/cache@v2 + with: + path: slack_ts.txt + key: slack-ts-${{ github.event.pull_request.number }} + + - name: Send notification for PR + if: ${{ env.event_type == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'reopened' || github.event.action == 'synchronize') }} + id: slack_pr + run: | + response=$(curl -X POST -H 'Content-type: application/json' --data '{ + "text": "🧞‍♂️ PR 드리는 지니가 왔습니다\n[sambad#${{ github.event.pull_request.number }}] [${{ github.event.pull_request.title }}](${{ github.event.pull_request.html_url }})\n${{ github.event.pull_request.user.login }}님이 생성했어요." + }' ${{ secrets.SLACK_BOT_ACCESS_TOKEN }}) + echo "slack_ts=$(echo $response | jq -r '.ts')" >> $GITHUB_ENV + echo $slack_ts > slack_ts.txt + env: + SLACK_BOT_ACCESS_TOKEN: ${{ secrets.SLACK_BOT_ACCESS_TOKEN }} + + - name: Send notification for review request + if: ${{ env.event_type == 'pull_request' && github.event.action == 'review_requested' }} + run: | + reviewer=${{ github.event.requested_reviewer.login }} + slack_username=$(echo ${{ env.mapping }} | jq -r --arg reviewer "$reviewer" '.[$reviewer]') + if [ "$slack_username" != "null" ]; then + response=$(curl -X POST -H 'Content-type: application/json' --data '{ + "text": "🔔 리뷰 요청이 도착했습니다: @'$slack_username'" + }' ${{ secrets.SLACK_BOT_ACCESS_TOKEN }}) + echo "slack_ts=$(echo $response | jq -r '.ts')" >> $GITHUB_ENV + echo $slack_ts > slack_ts.txt + else + echo "Reviewer not found in mapping: $reviewer" + fi + env: + SLACK_BOT_ACCESS_TOKEN: ${{ secrets.SLACK_BOT_ACCESS_TOKEN }} + + - name: Restore Slack message timestamp + if: ${{ env.event_type == 'issue_comment' || env.event_type == 'pull_request_review' }} + id: restore_ts + uses: actions/cache@v2 + with: + path: slack_ts.txt + key: slack-ts-${{ github.event.issue.number || github.event.pull_request.number }} + restore-keys: | + slack-ts- + + - name: Load Slack message timestamp + if: ${{ (env.event_type == 'issue_comment' || env.event_type == 'pull_request_review') && steps.restore_ts.outputs.cache-hit == 'true' }} + run: echo "SLACK_MESSAGE_TS=$(cat slack_ts.txt)" >> $GITHUB_ENV + + - name: Send notification for comment + if: ${{ env.event_type == 'issue_comment' && env.SLACK_MESSAGE_TS != '' }} + run: | + commenter=${{ github.event.comment.user.login }} + slack_username=$(echo ${{ env.mapping }} | jq -r --arg commenter "$commenter" '.[$commenter]') + if [ "$slack_username" != "null" ]; then + curl -X POST -H 'Content-type: application/json' --data '{ + "text": "@'$slack_username'님이 코멘트를 달았습니다:\n${{ github.event.comment.body }}", + "thread_ts": "${{ env.SLACK_MESSAGE_TS }}" + }' ${{ secrets.SLACK_BOT_ACCESS_TOKEN }} + else + echo "Commenter not found in mapping: $commenter" + fi + env: + SLACK_BOT_ACCESS_TOKEN: ${{ secrets.SLACK_BOT_ACCESS_TOKEN }} + + - name: Send notification for approval + if: ${{ env.event_type == 'pull_request_review' && github.event.review.state == 'approved' && env.SLACK_MESSAGE_TS != '' }} + run: | + reviewer=${{ github.event.review.user.login }} + slack_username=$(echo ${{ env.mapping }} | jq -r --arg reviewer "$reviewer" '.[$reviewer]') + if [ "$slack_username" != "null" ]; then + curl -X POST -H 'Content-type: application/json' --data '{ + "text": "✅ @'$slack_username'님이 승인하셨어요 🎉", + "thread_ts": "${{ env.SLACK_MESSAGE_TS }}" + }' ${{ secrets.SLACK_BOT_ACCESS_TOKEN }} + else + echo "Reviewer not found in mapping: $reviewer" + fi + env: + SLACK_BOT_ACCESS_TOKEN: ${{ secrets.SLACK_BOT_ACCESS_TOKEN }}