1+ #
2+ # Copyright (c) 2025, RT-Thread Development Team
3+ #
4+ # SPDX-License-Identifier: Apache-2.0
5+ #
6+ # Change Logs:
7+ # Date Author Notes
8+ # 2025-04-01 Hydevcode 定时自动发送Release版本
9+ #
10+ name : Auto Release with PR Notes
11+
12+ on :
13+ schedule :
14+ - cron : ' 0 16 * 3,6,9,12 *'
15+ workflow_dispatch :
16+
17+ jobs :
18+ release :
19+ runs-on : ubuntu-latest
20+ if : github.repository_owner == 'RT-Thread'
21+ steps :
22+ - name : Checkout Code
23+ uses : actions/checkout@v4
24+ with :
25+ fetch-depth : 0 # 获取完整提交历史
26+
27+ - name : Get Previous Tag
28+ id : prev_tag
29+ run : |
30+ # 获取上一个发布的标签(排除预发布标签)
31+ PREV_TAG=$(git describe --tags --abbrev=0 --match "v*" 2>/dev/null || echo "")
32+ echo "prev_tag=${PREV_TAG}" >> $GITHUB_OUTPUT
33+ echo "${PREV_TAG}"
34+ # 获取上一个版本的时间,如果有的话,没有就用基准时间
35+ PREV_TIME=$(gh release list -L 1 --json publishedAt | jq '.[].publishedAt')
36+
37+ echo "${PREV_TIME}"
38+ if [[ -z "$PREV_TIME" ]]; then
39+ # 基准时间
40+ PREV_TIME="2025-04-01"
41+ echo "${PREV_TIME}"
42+ fi
43+ echo "prev_time=${PREV_TIME}" >> $GITHUB_OUTPUT
44+
45+ echo "--------------------------------"
46+ if [[ -n "$PREV_TAG" ]]; then
47+ last_digit=$(echo "${PREV_TAG}" | grep -oE '[0-9]+$')
48+ new_last_digit=$((last_digit + 1))
49+ echo "$new_last_digit"
50+ new_version=$(echo "$PREV_TAG" | sed "s/[0-9]\+$/$new_last_digit/")
51+
52+ echo "$new_version"
53+ else
54+ echo "没有找到上一个版本"
55+ #默认第一个版本
56+ new_version=v1.0.0
57+ fi
58+ echo "new_version=${new_version}" >> $GITHUB_OUTPUT
59+ env :
60+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
61+ - name : Generate PR List
62+ id : pr_list
63+ run : |
64+ # 获取两个标签之间的 PR 列表(使用 GitHub CLI)
65+ # 依靠的是上一个版本的时间
66+ gh pr list \
67+ --base master \
68+ --state merged \
69+ --search "merged:>=${{steps.prev_tag.outputs.prev_time}}" \
70+ --json number,title,url \
71+ --jq 'map("- [#\(.number)](\(.url)) \(.title)") | join("\n")' \
72+ > pr_list.txt
73+
74+ # 将 PR 列表保存为变量
75+ PR_NOTES=$(cat pr_list.txt)
76+
77+ # 统计当前到上一个版本的pr做成描述
78+ RELEASE_NOTES="## ${{ steps.prev_tag.outputs.new_version }} ($(date -I))\n\n"
79+ if [ -n "$PR_NOTES" ]; then
80+ RELEASE_NOTES+="### Merged PRs since ${{ steps.prev_tag.outputs.prev_tag }}:\n"
81+ RELEASE_NOTES+="$PR_NOTES\n"
82+ else
83+ RELEASE_NOTES+="No new PRs since last release.\n"
84+ fi
85+
86+ echo -e "$RELEASE_NOTES" > release_notes.md
87+ echo "$RELEASE_NOTES"
88+ env :
89+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
90+ - name : Publish Release
91+ uses : softprops/action-gh-release@v2
92+ with :
93+ body_path : release_notes.md
94+ tag_name : ${{ steps.prev_tag.outputs.new_version }}
95+ name : RT-Thread ${{ steps.prev_tag.outputs.new_version }} released
96+ env :
97+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
0 commit comments