-
Notifications
You must be signed in to change notification settings - Fork 452
159 lines (140 loc) · 6.05 KB
/
semantic-version-update.yml
File metadata and controls
159 lines (140 loc) · 6.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
name: Semantic Version Update
on:
push:
branches: [ main ]
paths-ignore:
- 'version.properties'
- 'pom.xml'
- 'CHANGELOG.md'
jobs:
update-version:
runs-on: ubuntu-latest
# 添加写入权限
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0
# 使用GITHUB_TOKEN进行初始检出
token: ${{ secrets.GITHUB_TOKEN }}
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'
- name: Get current version
id: current-version
run: |
if [ -f "version.properties" ]; then
CURRENT_VERSION=$(grep "version=" version.properties | cut -d'=' -f2)
else
# 从pom.xml中提取当前版本
CURRENT_VERSION=$(grep -m 1 "<version>" pom.xml | sed 's/.*<version>\(.*\)<\/version>.*/\1/')
fi
echo "CURRENT_VERSION=${CURRENT_VERSION}" >> $GITHUB_ENV
echo "Current version: ${CURRENT_VERSION}"
- name: Determine version increment
id: version-increment
run: |
# 获取最近一次提交信息
COMMIT_MSG=$(git log -1 --pretty=%B)
echo "Commit message: ${COMMIT_MSG}"
# 解析当前版本
IFS='.' read -r MAJOR MINOR PATCH <<< "${CURRENT_VERSION}"
# 根据提交信息决定版本增量
if [[ "${COMMIT_MSG}" =~ ^(feat|feature)(\(.*\))?!:.*$ || "${COMMIT_MSG}" =~ ^BREAKING[[:space:]]CHANGE:.*$ ]]; then
# 破坏性变更 - 增加主版本号
MAJOR=$((MAJOR + 1))
MINOR=0
PATCH=0
CHANGE_TYPE="MAJOR"
elif [[ "${COMMIT_MSG}" =~ ^feat(\(.*\))?:.*$ ]]; then
# 新功能 - 增加次版本号
MINOR=$((MINOR + 1))
PATCH=0
CHANGE_TYPE="MINOR"
elif [[ "${COMMIT_MSG}" =~ ^(fix|bugfix|hotfix)(\(.*\))?:.*$ ]]; then
# 错误修复 - 增加修订号
PATCH=$((PATCH + 1))
CHANGE_TYPE="PATCH"
elif [[ "${COMMIT_MSG}" =~ ^(refactor|perf|style|test|docs|build|ci|chore)(\(.*\))?:.*$ ]]; then
# 重构、性能优化、样式、测试、文档、构建、CI、杂项 - 增加修订号
PATCH=$((PATCH + 1))
CHANGE_TYPE="PATCH"
elif [[ "${COMMIT_MSG}" =~ ^update(\(.*\))?:.*$ ]]; then
# 更新 - 增加修订号
PATCH=$((PATCH + 1))
CHANGE_TYPE="PATCH"
else
# 默认情况 - 增加修订号
PATCH=$((PATCH + 1))
CHANGE_TYPE="PATCH"
fi
# 设置新版本
NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}"
echo "NEW_VERSION=${NEW_VERSION}" >> $GITHUB_ENV
echo "CHANGE_TYPE=${CHANGE_TYPE}" >> $GITHUB_ENV
echo "New version will be: ${NEW_VERSION} (${CHANGE_TYPE} change)"
- name: Update version files
run: |
# 更新version.properties文件
echo "version=${NEW_VERSION}" > version.properties
# 更新Maven版本
mvn versions:set -DnewVersion=${NEW_VERSION} -DgenerateBackupPoms=false
- name: Commit version changes
run: |
git config --global user.name 'GitHub Actions'
git config --global user.email 'actions@github.com'
git add version.properties pom.xml
if [ -f "src/main/resources/application.properties" ]; then
git add src/main/resources/application.properties
fi
git commit -m "chore: update version to ${NEW_VERSION} [skip ci]"
- name: Generate changelog entry
run: |
# 获取上一个标签以来的所有提交
PREVIOUS_TAG=$(git describe --tags --abbrev=0 --always 2>/dev/null || echo "")
if [ -n "${PREVIOUS_TAG}" ]; then
echo "## [${NEW_VERSION}] - $(date +'%Y-%m-%d')" > changelog_entry.md
echo "" >> changelog_entry.md
# 特性
FEATURES=$(git log ${PREVIOUS_TAG}..HEAD --pretty=format:"- %s" --grep="^feat" --grep="^feature")
if [ -n "${FEATURES}" ]; then
echo "### 新功能" >> changelog_entry.md
echo "${FEATURES}" >> changelog_entry.md
echo "" >> changelog_entry.md
fi
# 修复
FIXES=$(git log ${PREVIOUS_TAG}..HEAD --pretty=format:"- %s" --grep="^fix" --grep="^bugfix" --grep="^hotfix")
if [ -n "${FIXES}" ]; then
echo "### 修复" >> changelog_entry.md
echo "${FIXES}" >> changelog_entry.md
echo "" >> changelog_entry.md
fi
# 其他变更
OTHERS=$(git log ${PREVIOUS_TAG}..HEAD --pretty=format:"- %s" --grep="^refactor" --grep="^perf" --grep="^style" --grep="^test" --grep="^docs" --grep="^build" --grep="^ci" --grep="^chore" --grep="^update")
if [ -n "${OTHERS}" ]; then
echo "### 其他变更" >> changelog_entry.md
echo "${OTHERS}" >> changelog_entry.md
echo "" >> changelog_entry.md
fi
# 更新CHANGELOG.md
if [ -f "CHANGELOG.md" ]; then
# 将新条目插入到CHANGELOG.md的顶部(在标题之后)
sed -i '1r changelog_entry.md' CHANGELOG.md
else
# 创建新的CHANGELOG.md
echo "# 变更日志" > CHANGELOG.md
echo "" >> CHANGELOG.md
cat changelog_entry.md >> CHANGELOG.md
fi
git add CHANGELOG.md
git commit -m "docs: update changelog for v${NEW_VERSION} [skip ci]"
fi
# 使用 GitHub CLI 直接推送更改
- name: Push changes with GitHub CLI
run: |
# 直接使用 GitHub CLI 推送更改(只推送分支,不推送标签)
git push