邮件领取卡住 #308
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Issue Real-time Notification | |
| on: | |
| issues: | |
| types: [opened, closed, reopened, assigned, labeled, unlabeled] | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true | |
| jobs: | |
| issue-notification: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check Out Repository | |
| uses: actions/checkout@v4 | |
| - name: Prepare Issue Message | |
| id: prepare_message | |
| env: | |
| # 事件字段统一经 env 注入,避免将用户可控内容(如 Issue 标题/标签名)直接拼进 shell 造成脚本注入 | |
| ISSUE_TITLE: ${{ github.event.issue.title }} | |
| ISSUE_AUTHOR: ${{ github.event.issue.user.login }} | |
| ISSUE_NUMBER: ${{ github.event.issue.number }} | |
| ISSUE_STATE: ${{ github.event.issue.state }} | |
| ISSUE_ACTION: ${{ github.event.action }} | |
| ISSUE_CREATED_AT: ${{ github.event.issue.created_at }} | |
| ASSIGNEE: ${{ github.event.issue.assignee.login }} | |
| LABEL_NAME: ${{ github.event.label.name }} | |
| REPO: ${{ github.repository }} | |
| run: | | |
| # --- 基础变量已由上方 env 注入 --- | |
| echo "处理事件: $ISSUE_ACTION (Issue #$ISSUE_NUMBER)" | |
| # 如果是 opened 事件,等待一段时间检查完整状态 | |
| if [ "$ISSUE_ACTION" == "opened" ]; then | |
| echo "检测到新建 Issue,等待30秒检查完整状态..." | |
| sleep 30 | |
| # 调用 API 获取 Issue 的完整状态 | |
| echo "获取 Issue #$ISSUE_NUMBER 的完整状态..." | |
| ISSUE_JSON=$(curl -s -H "Authorization: token $GH_TOKEN" \ | |
| -H "Accept: application/vnd.github.v3+json" \ | |
| "https://api.github.com/repos/$REPO/issues/$ISSUE_NUMBER") | |
| # 提取标签信息 | |
| LABELS=$(echo "$ISSUE_JSON" | jq -r '[.labels[].name] | join(", ")') | |
| LABEL_COUNT=$(echo "$ISSUE_JSON" | jq -r '.labels | length') | |
| # 提取分配信息 | |
| ASSIGNEES=$(echo "$ISSUE_JSON" | jq -r '[.assignees[].login] | join(", ")') | |
| ASSIGNEE_COUNT=$(echo "$ISSUE_JSON" | jq -r '.assignees | length') | |
| # 构建合并消息 | |
| ACTION_EMOJI="📝" | |
| ACTION_TEXT="新建了 Issue" | |
| TITLE="$ACTION_EMOJI [$REPO] $ACTION_TEXT" | |
| CONTENT="标题: $ISSUE_TITLE" | |
| CONTENT="$CONTENT | 作者: $ISSUE_AUTHOR" | |
| CONTENT="$CONTENT | 编号: #$ISSUE_NUMBER" | |
| CONTENT="$CONTENT | 状态: $ISSUE_STATE" | |
| # 添加标签信息(如果有) | |
| if [ "$LABEL_COUNT" -gt 0 ]; then | |
| if [ "$LABEL_COUNT" -eq 1 ]; then | |
| CONTENT="$CONTENT | 标签: $LABELS" | |
| else | |
| CONTENT="$CONTENT | 标签: $LABELS ($LABEL_COUNT个)" | |
| fi | |
| fi | |
| # 添加分配信息(如果有) | |
| if [ "$ASSIGNEE_COUNT" -gt 0 ]; then | |
| if [ "$ASSIGNEE_COUNT" -eq 1 ]; then | |
| CONTENT="$CONTENT | 分配给: $ASSIGNEES" | |
| else | |
| CONTENT="$CONTENT | 分配给: $ASSIGNEES ($ASSIGNEE_COUNT人)" | |
| fi | |
| fi | |
| echo "合并后的消息(包含$LABEL_COUNT个标签,$ASSIGNEE_COUNT个分配)" | |
| else | |
| # 对于非 opened 事件,检查是否在新建后的短时间内(ISSUE_CREATED_AT 已由 env 注入) | |
| CURRENT_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") | |
| # 计算时间差(秒) | |
| CREATED_EPOCH=$(date -d "$ISSUE_CREATED_AT" +%s) | |
| CURRENT_EPOCH=$(date -d "$CURRENT_TIME" +%s) | |
| TIME_DIFF=$((CURRENT_EPOCH - CREATED_EPOCH)) | |
| echo "Issue 创建于: $ISSUE_CREATED_AT" | |
| echo "当前时间: $CURRENT_TIME" | |
| echo "时间差: $TIME_DIFF 秒" | |
| # 如果 Issue 是2分钟内新建的,抑制单独的标签/分配事件 | |
| if [ "$TIME_DIFF" -lt 120 ]; then | |
| echo "抑制短时间内的事件: $ISSUE_ACTION (Issue 刚创建)" | |
| echo "skip_notification=true" >> $GITHUB_OUTPUT | |
| exit 0 | |
| fi | |
| # 正常处理其他事件 | |
| case "$ISSUE_ACTION" in | |
| "closed") | |
| ACTION_EMOJI="✅" | |
| ACTION_TEXT="关闭了 Issue" | |
| ;; | |
| "reopened") | |
| ACTION_EMOJI="🔄" | |
| ACTION_TEXT="重新打开了 Issue" | |
| ;; | |
| "assigned") | |
| ACTION_EMOJI="👤" | |
| ACTION_TEXT="分配了 Issue" | |
| ;; | |
| "labeled") | |
| ACTION_EMOJI="🏷️" | |
| ACTION_TEXT="添加了标签" | |
| ;; | |
| "unlabeled") | |
| ACTION_EMOJI="🏷️" | |
| ACTION_TEXT="移除了标签" | |
| ;; | |
| *) | |
| ACTION_EMOJI="📌" | |
| ACTION_TEXT="更新了 Issue" | |
| ;; | |
| esac | |
| TITLE="$ACTION_EMOJI [$REPO] $ACTION_TEXT" | |
| CONTENT="标题: $ISSUE_TITLE" | |
| CONTENT="$CONTENT | 作者: $ISSUE_AUTHOR" | |
| CONTENT="$CONTENT | 编号: #$ISSUE_NUMBER" | |
| case "$ISSUE_ACTION" in | |
| "assigned") | |
| CONTENT="$CONTENT | 分配给: $ASSIGNEE" | |
| ;; | |
| "labeled") | |
| CONTENT="$CONTENT | 标签: $LABEL_NAME" | |
| ;; | |
| "unlabeled") | |
| CONTENT="$CONTENT | 标签: $LABEL_NAME" | |
| ;; | |
| *) | |
| CONTENT="$CONTENT | 状态: $ISSUE_STATE" | |
| ;; | |
| esac | |
| fi | |
| echo "title=$TITLE" >> $GITHUB_OUTPUT | |
| echo "content=$CONTENT" >> $GITHUB_OUTPUT | |
| echo "skip_notification=false" >> $GITHUB_OUTPUT | |
| echo "生成的消息:" | |
| echo "标题: $TITLE" | |
| echo "内容: $CONTENT" | |
| - name: Send QQ Notification | |
| if: steps.prepare_message.outputs.skip_notification != 'true' | |
| uses: Y2Nk4/qmsg-action@master | |
| with: | |
| # qq: ${{ needs.meta.outputs.version_type == 'ci' && secrets.QMSG_QQ_DEV || secrets.QMSG_QQ_PUB }} | |
| # groups: ${{ needs.meta.outputs.version_type == 'ci' && secrets.QMSG_GROUPS_DEV || secrets.QMSG_GROUPS_PUB }} | |
| groups: ${{ secrets.QMSG_GROUPS_DEV }} | |
| key: ${{ secrets.QMSG_KEY }} | |
| message: | | |
| ${{ steps.prepare_message.outputs.title }} | |
| ${{ steps.prepare_message.outputs.content }} | |
| - name: Skip Notification Log | |
| if: steps.prepare_message.outputs.skip_notification == 'true' | |
| run: | | |
| echo "跳过推送: ${{ github.event.action }} 事件被抑制" |