@@ -3,9 +3,9 @@ name: Build and Release
33on :
44 push :
55 branches :
6- - main # main 分支触发
7- - master # master 分支触发
8- workflow_dispatch : # 手动触发
6+ - main
7+ - master
8+ workflow_dispatch :
99
1010jobs :
1111 build-and-release :
1414 - name : Checkout source
1515 uses : actions/checkout@v4
1616 with :
17- fetch-depth : 0 # 检查已有tag
17+ fetch-depth : 0
1818
1919 - name : Setup Node.js
2020 uses : actions/setup-node@v4
@@ -59,29 +59,172 @@ jobs:
5959 VERSION=${{ env.VERSION }}
6060 EEXTNAME=${{ env.EEXTNAME }}
6161 echo "🔎 Extracting changelog for version $VERSION from CHANGELOG.md"
62- NOTES=$(awk "/^# ${VERSION}/ {flag=1; next} /^#/ {if(flag) exit} flag" CHANGELOG.md)
63- if [ -z "$NOTES" ]; then
64- NOTES=$(awk "/^# ${VERSION}/ {flag=1; next} flag" CHANGELOG.md)
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 文件,使用默认说明"
99+ NOTES="Release v${VERSION}"
65100 fi
66- NOTES="$NOTES\n\n---\n由GitHub Actions自动构建并发布\nBuilt and released automatically by GitHub Actions\n\n也可前往[嘉立创EDA扩展广场](https://ext.lceda.cn/item/oshwhub/${EEXTNAME})下载\nAlso available at [EasyEDA Extension Plaza](https://ext.easyeda.com/item/oshwhub/${EEXTNAME})"
67-
101+
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 分隔符设置多行环境变量
68113 echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
69- echo -e "$NOTES" >> $GITHUB_ENV
114+ echo "$NOTES" >> $GITHUB_ENV
70115 echo "EOF" >> $GITHUB_ENV
116+
71117 echo "------ Release Notes ------"
72- echo -e "$NOTES"
118+ echo "$NOTES"
73119 echo "---------------------------"
74120
75- - 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
76160 if : env.SKIP_RELEASE == 'false'
77161 run : |
78162 VERSION=${{ env.VERSION }}
79163 EEXTNAME=${{ env.EEXTNAME }}
80- FILE="build/dist/${EEXTNAME}_v${VERSION}.eext"
81- if [ -f "$FILE" ]; then
82- echo "✅ 产物存在: $FILE"
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
198+ if : env.SKIP_RELEASE == 'false'
199+ run : |
200+ VERSION=${{ env.VERSION }}
201+ EEXTNAME=${{ env.EEXTNAME }}
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"
83226 else
84- echo "❌ 未发现产物 : $FILE "
227+ echo "❌ 国际版产物不存在 : $GLOBAL_FILE "
85228 ls -R build || true
86229 exit 1
87230 fi
93236 tag_name : v${{ env.VERSION }}
94237 name : Release v${{ env.VERSION }}
95238 body : ${{ env.RELEASE_NOTES }}
96- 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
97242 env :
98243 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
0 commit comments