Skip to content

Commit 1e03ef7

Browse files
committed
【维护】添加发布流程和版本检查脚本
- 新增 Release.yml 工作流,用于创建发布 - 添加 check-version-and-push-tag.yml 工作流,用于检查版本并推送标签 - 新增 check-version.bash 脚本,用于提取版本号 - 新增 is-newer-version.bash 脚本,用于比较版本号 - 新增 release.bash 脚本,用于生成版本号并推送标签
1 parent 8ae0c47 commit 1e03ef7

5 files changed

Lines changed: 228 additions & 0 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: check version and push tag
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
branches:
7+
- main
8+
9+
jobs:
10+
check:
11+
runs-on: ubuntu-latest
12+
permissions: write-all
13+
steps:
14+
15+
- name: Checkout
16+
uses: actions/checkout@v4
17+
18+
- name: Check version
19+
id: version-check
20+
run: |
21+
VERSION=$(./scripts/is-newer-version.bash)
22+
echo "version=${VERSION}" >> $GITHUB_OUTPUT
23+
if [ "$VERSION" != "0" ]; then
24+
echo "New version detected: $VERSION"
25+
else
26+
echo "No new version to release"
27+
fi
28+
29+
- name: Push tag
30+
if: steps.version-check.outputs.version != '0'
31+
uses: actions-ecosystem/action-push-tag@v1
32+
with:
33+
tag: "v${{ steps.version-check.outputs.version }}"

.github/workflows/release.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: release
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
jobs:
9+
release:
10+
runs-on: ubuntu-latest
11+
permissions: write-all
12+
name: Export
13+
steps:
14+
15+
- name: Checkout
16+
uses: actions/checkout@v4
17+
18+
- name: Create release
19+
uses: ncipollo/release-action@v1
20+
with:
21+
token: ${{ secrets.TOKEN }}
22+
generateReleaseNotes: true
23+
tag: ${{ github.ref_name }}
24+
artifacts: "index.html,index.min.html"

scripts/check-version.bash

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env bash
2+
# 从 ../index.html 中获取版本号 | Get version number from ../index.html
3+
4+
# 设置定量 | Quantities
5+
## 当前脚本所在目录 | Current Script Directory
6+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7+
## 仓库目录 | Repository Directory
8+
REPO_DIR="$(dirname "$SCRIPT_DIR")"
9+
## 文件路径 | File Path
10+
FILE_PATH="$REPO_DIR/index.html"
11+
## 当前语言 | Current Language
12+
CURRENT_LANG=0 ### 0: en-US, 1: zh-Hans-CN
13+
14+
# 语言检测 | Language Detection
15+
if [ $(echo ${LANG/_/-} | grep -Ei "\\b(zh|cn)\\b") ]; then CURRENT_LANG=1; fi
16+
17+
# 本地化 | Localization
18+
recho() {
19+
if [ $CURRENT_LANG == 1 ]; then
20+
## zh-Hans-CN
21+
echo $1;
22+
else
23+
## en-US
24+
echo $2;
25+
fi
26+
}
27+
28+
# 提取版本号并打印 | Extract version number and print
29+
if [ ! -f "$FILE_PATH" ]; then
30+
recho "错误:文件 $FILE_PATH 不存在" "Error: File $FILE_PATH does not exist"
31+
exit 1
32+
fi
33+
34+
## 从 <markdown-html> 标签中提取第一个 version 属性的值
35+
VERSION=$(grep -oP '<markdown-html\s+version="\K[^"]+' "$FILE_PATH" | head -1)
36+
if [ -z "$VERSION" ]; then
37+
recho "错误:未找到版本号" "Error: Version not found"
38+
exit 1
39+
fi
40+
41+
echo "$VERSION"

scripts/is-newer-version.bash

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env bash
2+
# 从 ../index.html 中获取版本号 | Get version number from ../index.html
3+
4+
# 设置定量 | Quantities
5+
## 当前脚本所在目录 | Current Script Directory
6+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7+
## 仓库目录 | Repository Directory
8+
REPO_DIR="$(dirname "$SCRIPT_DIR")"
9+
## 当前语言 | Current Language
10+
CURRENT_LANG=0 ### 0: en-US, 1: zh-Hans-CN
11+
12+
# 语言检测 | Language Detection
13+
if [ $(echo ${LANG/_/-} | grep -Ei "\\b(zh|cn)\\b") ]; then CURRENT_LANG=1; fi
14+
15+
# 本地化 | Localization
16+
recho() {
17+
if [ $CURRENT_LANG == 1 ]; then
18+
## zh-Hans-CN
19+
echo $1;
20+
else
21+
## en-US
22+
echo $2;
23+
fi
24+
}
25+
26+
# 获取当前版本号 | Get current version number
27+
CURRENT_VERSION=$("$SCRIPT_DIR/check-version.bash")
28+
if [ $? -ne 0 ]; then
29+
exit 1
30+
fi
31+
32+
# 获取最新的 git 标签版本 | Get the latest git tag version
33+
LATEST_TAG=$(git -C "$REPO_DIR" tag -l 'v*' --sort=-v:refname | head -1)
34+
if [ -z "$LATEST_TAG" ]; then
35+
# 没有标签时默认为需要发布 | No tags, assume it needs to be released
36+
echo "$CURRENT_VERSION"
37+
exit 0
38+
fi
39+
40+
# 去除标签中的 v 前缀 | Remove the v prefix from the tag
41+
LATEST_VERSION=${LATEST_TAG#v}
42+
43+
# 比较版本号 | Compare version numbers
44+
if [ "$(printf "%s\n%s" "$CURRENT_VERSION" "$LATEST_VERSION" | sort -V | head -n1)" != "$CURRENT_VERSION" ]; then
45+
# 当前版本较新,需要发布 | The current version is newer, needs to be released
46+
echo "$CURRENT_VERSION"
47+
else
48+
# 已经是最新版本 | Already the latest version
49+
echo "0"
50+
fi

scripts/release.bash

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#!/usr/bin/env bash
2+
# 根据参数生成版本号,并推送标签到远程仓库 | Automatically generate version number and push tags to remote repository
3+
4+
# 设置定量 | Quantities
5+
## 当前脚本所在目录 | Current Script Directory
6+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7+
## 仓库目录 | Repository Directory
8+
REPO_DIR="$(dirname "$SCRIPT_DIR")"
9+
## 当前语言 | Current Language
10+
CURRENT_LANG=0 ### 0: en-US, 1: zh-Hans-CN
11+
12+
# 语言检测 | Language Detection
13+
if [ $(echo ${LANG/_/-} | grep -Ei "\\b(zh|cn)\\b") ]; then CURRENT_LANG=1; fi
14+
15+
# 本地化 | Localization
16+
recho() {
17+
if [ $CURRENT_LANG == 1 ]; then
18+
## zh-Hans-CN
19+
echo $1;
20+
else
21+
## en-US
22+
echo $2;
23+
fi
24+
}
25+
26+
# 参数解析 | Argument Parsing
27+
version=""
28+
while [[ $# -gt 0 ]]; do
29+
case "$1" in
30+
-v|--version)
31+
version="$2"
32+
shift 2
33+
;;
34+
*)
35+
recho "错误: 未知参数 $1" "Error: Unknown argument $1"
36+
exit 1
37+
;;
38+
esac
39+
done
40+
41+
# 版本号验证函数 | Version Validation Function
42+
validate_version() {
43+
if [[ ! "$1" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
44+
recho "错误: 版本号格式不正确" "Error: Invalid version format"
45+
exit 1
46+
fi
47+
}
48+
49+
# 如果未通过参数指定版本号,则交互式输入 | Interactive input if version not specified
50+
if [ -z "$version" ]; then
51+
while true; do
52+
recho "请输入版本号 (格式: X.X.X): " "Please enter version number (format: X.X.X): "
53+
read -r version
54+
validate_version "$version" && break
55+
done
56+
else
57+
validate_version "$version"
58+
fi
59+
60+
# 切换到仓库目录 | Change to repository directory
61+
recho "切换到仓库目录..." "Changing to repository directory..."
62+
cd "$REPO_DIR" || {
63+
recho "错误: 无法切换到仓库目录" "Error: Failed to change to repository directory"
64+
exit 1
65+
}
66+
67+
# 创建并推送标签 | Create and push tag
68+
recho "创建标签 v$version..." "Creating tag v$version..."
69+
git tag "v$version" || {
70+
recho "错误: 创建标签失败" "Error: Failed to create tag"
71+
exit 1
72+
}
73+
74+
recho "推送标签到远程仓库..." "Pushing tag to remote repository..."
75+
git push origin "v$version" || {
76+
recho "错误: 推送标签失败" "Error: Failed to push tag"
77+
exit 1
78+
}
79+
80+
recho "版本 $version 发布成功!" "Version $version released successfully!"

0 commit comments

Comments
 (0)