@@ -3,12 +3,9 @@ name: Build and Release
33on :
44 push :
55 branches :
6- - main # main 分支触发
7- - master # master 分支触发
8- workflow_dispatch : # 手动触发
9-
10- permissions :
11- contents : write
6+ - main
7+ - master
8+ workflow_dispatch :
129
1310jobs :
1411 build-and-release :
@@ -17,22 +14,15 @@ jobs:
1714 - name : Checkout source
1815 uses : actions/checkout@v4
1916 with :
20- fetch-depth : 0 # 检查已有tag
17+ fetch-depth : 0
2118
2219 - name : Setup Node.js
2320 uses : actions/setup-node@v4
2421 with :
25- node-version : ' 22'
26- cache : npm
27-
28- - name : Install specific npm version
29- run : npm install -g npm@10
30-
31- - name : Use official npm registry
32- run : npm config set registry https://registry.npmjs.org/
22+ node-version : ' 20'
3323
3424 - name : Install dependencies
35- run : npm ci
25+ run : npm install
3626
3727 - name : Build project
3828 run : npm run build
@@ -69,53 +59,172 @@ jobs:
6959 VERSION=${{ env.VERSION }}
7060 EEXTNAME=${{ env.EEXTNAME }}
7161 echo "🔎 Extracting changelog for version $VERSION from CHANGELOG.md"
72-
73- # 从 CHANGELOG.md 提取当前版本的变更内容(匹配 ## [x.y.z] 开头,支持带或不带日期后缀)
74- NOTES=$(awk -v ver="$VERSION" '
75- BEGIN {flag=0}
76- /^## \[/ {
77- if (flag) exit
78- if (index($0, "[" ver "]")) { flag=1; next }
79- }
80- flag {print}
81- ' CHANGELOG.md)
82-
83- # 去除首尾空行
84- NOTES=$(echo "$NOTES" | sed -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba}')
85-
86- if [ -z "$NOTES" ]; then
87- echo "⚠️ No changelog entry found for version $VERSION, using default notes."
62+ ESCAPED_VERSION=$(echo "$VERSION" | sed 's/\./\\./g')
63+
64+ if [ -f ]; then
65+ # 支持多种 CHANGELOG 格式(兼容大小写 V):
66+ # - # v1.5.3 或 # V1.5.3 或 # 1.5.3
67+ # - ## v1.5.3 或 ## V1.5.3 或 ## 1.5.3
68+ # - ## [1.5.3] - 2024-01-01 或 ## [v1.5.3]
69+ NOTES=$(awk '
70+ BEGIN { found=0 }
71+ # 匹配版本行(兼容大小写 v/V)
72+ /^(#|##) \[?[vV]?'"$ESCAPED_VERSION"'\]?([[:space:]-]|$)/ {
73+ if (found) exit
74+ found=1
75+ next
76+ }
77+ # 遇到下一个版本标题时停止
78+ /^(#|##) \[?[vV]?[0-9]+\.[0-9]+\.[0-9]+\]?([[:space:]-]|$)/ {
79+ if (found) exit
80+ }
81+ # 遇到一级标题(如"更新日志"、"Changelog"、"修改记录")时停止
82+ /^# [^[\-0-9]/ {
83+ if (found) exit
84+ }
85+ found { print }
86+ ' CHANGELOG.md)
87+
88+ # 清理空行
89+ NOTES=$(echo "$NOTES" | sed '/^[[:space:]]*$/d' | sed '1{/^$/d}')
90+
91+ if [ -z "$NOTES" ]; then
92+ echo "⚠️ CHANGELOG.md 中未找到版本 $VERSION 的记录,使用默认说明"
93+ NOTES="Release v${VERSION}"
94+ else
95+ echo "✅ 已从 CHANGELOG.md 中提取版本 $VERSION 的更新日志"
96+ fi
97+ else
98+ echo "⚠️ 未找到 CHANGELOG.md 文件,使用默认说明"
8899 NOTES="Release v${VERSION}"
89100 fi
90101
91- # 使用 heredoc 安全写入多行内容到 GITHUB_ENV,避免反引号/特殊字符被解释
92- {
93- echo "RELEASE_NOTES<<CHANGELOG_EOF"
94- echo "$NOTES"
95- echo ""
96- echo "---"
97- echo "由GitHub Actions自动构建并发布"
98- echo "Built and released automatically by GitHub Actions"
99- echo ""
100- echo "也可前往[嘉立创EDA扩展广场](https://ext.lceda.cn/item/oshwhub/${EEXTNAME})下载"
101- echo "Also available at [JLCEDA Extension Plaza](https://extensions.oshwhub.com/item/oshwhub/${EEXTNAME})"
102- echo "CHANGELOG_EOF"
103- } >> "$GITHUB_ENV"
102+ # 添加页脚
103+ NOTES="${NOTES}
104+
105+ ---
106+ 由GitHub Actions自动构建并发布
107+ Built and released automatically by GitHub Actions
108+
109+ 也可前往[嘉立创EDA扩展广场](https://jlc-ext.com/item/oshwhub/${EEXTNAME})下载
110+ Also available at [JLCEDA Extension Plaza](https://jlcext.com/item/oshwlab/${EEXTNAME})"
111+
112+ # 使用 EOF 分隔符设置多行环境变量
113+ echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
114+ echo "$NOTES" >> $GITHUB_ENV
115+ echo "EOF" >> $GITHUB_ENV
104116
105117 echo "------ Release Notes ------"
106118 echo "$NOTES"
107119 echo "---------------------------"
108120
109- - name : Debug check artifact
121+ - name : Build zh-cn package
122+ if : env.SKIP_RELEASE == 'false'
123+ run : |
124+ VERSION=${{ env.VERSION }}
125+ EEXTNAME=${{ env.EEXTNAME }}
126+ DIST_DIR="build/dist"
127+ BASE_FILE="${DIST_DIR}/${EEXTNAME}_v${VERSION}.eext"
128+ ZH_FILE="${DIST_DIR}/${EEXTNAME}_v${VERSION}_zh-cn.eext"
129+
130+ echo "Building zh-cn package..."
131+
132+ # Find zh README
133+ ZH_README=""
134+ if [ -f "README_zh.md" ]; then
135+ ZH_README="README_zh.md"
136+ elif [ -f "README.zh.md" ]; then
137+ ZH_README="README.zh.md"
138+ else
139+ ZH_README=$(ls README_zh-*.md README.zh-*.md 2>/dev/null | head -1)
140+ fi
141+
142+ if [ -z "$ZH_README" ]; then
143+ echo "No zh README found, copying base eext as zh-cn"
144+ cp "$BASE_FILE" "$ZH_FILE"
145+ else
146+ echo "Using zh README: $ZH_README"
147+ # Backup and swap README.md
148+ mv README.md README.md.bak
149+ cp "$ZH_README" README.md
150+ # Re-package using npm run build
151+ npm run build
152+ mv "$BASE_FILE" "$ZH_FILE"
153+ # Restore original README.md
154+ mv README.md.bak README.md
155+ fi
156+
157+ echo "Done: $ZH_FILE"
158+
159+ - name : Build global package
160+ if : env.SKIP_RELEASE == 'false'
161+ run : |
162+ VERSION=${{ env.VERSION }}
163+ EEXTNAME=${{ env.EEXTNAME }}
164+ DIST_DIR="build/dist"
165+ BASE_FILE="${DIST_DIR}/${EEXTNAME}_v${VERSION}.eext"
166+ GLOBAL_FILE="${DIST_DIR}/${EEXTNAME}_v${VERSION}_global.eext"
167+
168+ echo "Building global package..."
169+
170+ # Find en README
171+ EN_README=""
172+ if [ -f "README_en.md" ]; then
173+ EN_README="README_en.md"
174+ elif [ -f "README.en.md" ]; then
175+ EN_README="README.en.md"
176+ else
177+ EN_README=$(ls README_en-*.md README.en-*.md 2>/dev/null | head -1)
178+ fi
179+
180+ if [ -z "$EN_README" ]; then
181+ echo "No en README found, copying base eext as global"
182+ cp "$BASE_FILE" "$GLOBAL_FILE"
183+ else
184+ echo "Using en README: $EN_README"
185+ # Backup and swap README.md
186+ mv README.md README.md.bak
187+ cp "$EN_README" README.md
188+ # Re-package using npm run build
189+ npm run build
190+ mv "$BASE_FILE" "$GLOBAL_FILE"
191+ # Restore original README.md
192+ mv README.md.bak README.md
193+ fi
194+
195+ echo "Done: $GLOBAL_FILE"
196+
197+ - name : Cleanup base eext
110198 if : env.SKIP_RELEASE == 'false'
111199 run : |
112200 VERSION=${{ env.VERSION }}
113201 EEXTNAME=${{ env.EEXTNAME }}
114- FILE="build/dist/${EEXTNAME}_v${VERSION}.eext"
115- if [ -f "$FILE" ]; then
116- echo "✅ 产物存在: $FILE"
202+ rm -f "build/dist/${EEXTNAME}_v${VERSION}.eext"
203+ echo "Removed base eext"
204+
205+ - name : Debug check artifacts
206+ if : env.SKIP_RELEASE == 'false'
207+ run : |
208+ VERSION=${{ env.VERSION }}
209+ EEXTNAME=${{ env.EEXTNAME }}
210+ DIST_DIR="build/dist"
211+ ZH_FILE="${DIST_DIR}/${EEXTNAME}_v${VERSION}_zh-cn.eext"
212+ GLOBAL_FILE="${DIST_DIR}/${EEXTNAME}_v${VERSION}_global.eext"
213+
214+ echo "🔍 检查构建产物..."
215+
216+ if [ -f "$ZH_FILE" ]; then
217+ echo "✅ 中文版产物存在: $ZH_FILE"
218+ else
219+ echo "❌ 中文版产物不存在: $ZH_FILE"
220+ ls -R build || true
221+ exit 1
222+ fi
223+
224+ if [ -f "$GLOBAL_FILE" ]; then
225+ echo "✅ 国际版产物存在: $GLOBAL_FILE"
117226 else
118- echo "❌ 未发现产物 : $FILE "
227+ echo "❌ 国际版产物不存在 : $GLOBAL_FILE "
119228 ls -R build || true
120229 exit 1
121230 fi
@@ -127,6 +236,8 @@ jobs:
127236 tag_name : v${{ env.VERSION }}
128237 name : Release v${{ env.VERSION }}
129238 body : ${{ env.RELEASE_NOTES }}
130- files : build/dist/${{ env.EEXTNAME }}_v${{ env.VERSION }}.eext
239+ files : |
240+ build/dist/${{ env.EEXTNAME }}_v${{ env.VERSION }}_zh-cn.eext
241+ build/dist/${{ env.EEXTNAME }}_v${{ env.VERSION }}_global.eext
131242 env :
132243 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
0 commit comments