| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- name: PR Format Notification
- on:
- pull_request_target:
- types: [opened, synchronize]
- permissions:
- pull-requests: write
- contents: read
- jobs:
- notify-format:
- if: github.repository_owner == 'RT-Thread'
- runs-on: ubuntu-latest
- steps:
- - name: Check if first commit and add comment
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: |
- echo "Event action: ${{ github.event.action }}"
-
- # 获取 PR 的提交信息
- commits=$(curl -s \
- -H "Accept: application/vnd.github.v3+json" \
- -H "Authorization: Bearer $GITHUB_TOKEN" \
- "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/commits")
- # 检查 API 响应是否为数组
- if echo "$commits" | jq -e 'type == "array"' > /dev/null; then
- commit_count=$(echo "$commits" | jq '. | length')
- echo "PR commit count: $commit_count"
- should_comment=false
- if [ "${{ github.event.action }}" = "opened" ]; then
- should_comment=true
- elif [ "${{ github.event.action }}" = "synchronize" ] && [ "$commit_count" -eq 1 ]; then
- should_comment=true
- fi
- if [ "$should_comment" = true ]; then
- echo "Adding format notification comment..."
-
- # 构建工作流链接
- branch="${{ github.event.pull_request.head.ref }}"
- fork_repo="${{ github.event.pull_request.head.repo.full_name }}"
- workflow_url="https://github.com/${fork_repo}/actions/workflows/clang-format.yml"
- direct_link="${workflow_url}?branch=${branch}"
- # 使用数组存储多行消息
- message_lines=(
- "**👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread!**"
- ""
- "为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流。"
- "To ensure your code complies with RT-Thread's coding style, please run the code formatting workflow by following the steps below."
- ""
- "---"
- ""
- "### 🛠 操作步骤 | Steps"
- ""
- "1. **前往 Actions 页面 | Go to the Actions page**"
- "[点击进入工作流 → | Click to open workflow →](${direct_link})"
- ""
- "2. **点击 \`Run workflow\` | Click \`Run workflow\`**"
- "- 设置需排除的文件/目录(目录请以\"/\"结尾)"
- "Set files/directories to exclude (directories should end with \"/\")"
- "- 将目标分支设置为 \ Set the target branch to:**\`${branch}\`**"
- "- 设置PR number为 \ Set the PR number to:**\`${{ github.event.number }}\`**"
- ""
- "3. **等待工作流完成 | Wait for the workflow to complete**"
- "格式化后的代码将自动推送至你的分支。"
- "The formatted code will be automatically pushed to your branch."
- ""
- "完成后,提交将自动更新至 \`${branch}\` 分支,关联的 Pull Request 也会同步更新。"
- "Once completed, commits will be pushed to the \`${branch}\` branch automatically, and the related Pull Request will be updated."
- ""
- "如有问题欢迎联系我们,再次感谢您的贡献!💐"
- "If you have any questions, feel free to reach out. Thanks again for your contribution!"
- )
-
- # 拼接数组为多行字符串
- message=$(printf "%s\n" "${message_lines[@]}")
- echo "Message content:"
- echo "$message"
- # 使用 jq 安全地构建 JSON 负载
- json_payload=$(jq -n --arg body "$message" '{"body": $body}')
- # 发送评论到 PR
- response=$(curl -s -w "\n%{http_code}" \
- -X POST \
- -H "Accept: application/vnd.github.v3+json" \
- -H "Authorization: Bearer $GITHUB_TOKEN" \
- "https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" \
- -d "$json_payload")
- # 提取 HTTP 状态码和响应体
- http_code=$(echo "$response" | tail -n1)
- response_body=$(echo "$response" | sed '$d')
- if [ "$http_code" -eq 201 ]; then
- echo "Format notification comment added successfully"
- echo "Comment URL: $(echo "$response_body" | jq -r '.html_url')"
- else
- echo "Failed to add comment. HTTP status: $http_code"
- echo "Response: $response_body"
- exit 1
- fi
- else
- echo "Not the first commit, skipping comment"
- fi
- else
- echo "Failed to get commits from GitHub API"
- echo "Response: $commits"
- exit 1
- fi
|