Skip to content

Commit f705cfd

Browse files
ci: update GitHub Actions build workflow
Updated for multi-language support Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent bd89e0f commit f705cfd

1 file changed

Lines changed: 238 additions & 107 deletions

File tree

.github/workflows/build.yml

Lines changed: 238 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,243 @@
11
name: Build and Release
22

33
on:
4-
push:
5-
branches:
6-
- main # main 分支触发
7-
- master # master 分支触发
8-
workflow_dispatch: # 手动触发
4+
push:
5+
branches:
6+
- main
7+
- master
8+
workflow_dispatch:
99

1010
jobs:
11-
build-and-release:
12-
runs-on: ubuntu-latest
13-
steps:
14-
- name: Checkout source
15-
uses: actions/checkout@v4
16-
with:
17-
fetch-depth: 0 # 检查已有tag
18-
19-
- name: Setup Node.js
20-
uses: actions/setup-node@v4
21-
with:
22-
node-version: '22'
23-
cache: 'npm'
24-
25-
- name: Install specific npm version
26-
run: npm install -g npm@10
27-
28-
- name: Use official npm registry
29-
run: npm config set registry https://registry.npmjs.org/
30-
31-
- name: Install dependencies
32-
run: npm ci
33-
34-
- name: Build project
35-
run: npm run build
36-
37-
- name: Get version & extension name from extension.json
38-
id: meta
39-
run: |
40-
echo "VERSION=$(jq -r .version extension.json)" >> $GITHUB_ENV
41-
echo "EEXTNAME=$(jq -r .name extension.json)" >> $GITHUB_ENV
42-
43-
- name: Check and create tag
44-
id: check_tag
45-
run: |
46-
VERSION=${{ env.VERSION }}
47-
TAG="v${VERSION}"
48-
49-
echo "🔎 检查 tag $TAG 是否存在..."
50-
if git rev-parse "$TAG" >/dev/null 2>&1; then
51-
echo "⚠️ Tag $TAG 已存在,跳过发布。"
52-
echo "SKIP_RELEASE=true" >> $GITHUB_ENV
53-
else
54-
echo "✅ Tag $TAG 不存在,创建并推送。"
55-
git config user.name "github-actions[bot]"
56-
git config user.email "github-actions[bot]@users.noreply.github.com"
57-
git tag -a "$TAG" -m "Release $TAG"
58-
git push origin "$TAG"
59-
echo "SKIP_RELEASE=false" >> $GITHUB_ENV
60-
fi
61-
62-
- name: Extract changelog for version
63-
if: env.SKIP_RELEASE == 'false'
64-
id: changelog
65-
run: |
66-
VERSION=${{ env.VERSION }}
67-
EEXTNAME=${{ env.EEXTNAME }}
68-
echo "🔎 Extracting changelog for version $VERSION from CHANGELOG.md"
69-
70-
NOTES=$(awk -v ver="$VERSION" '
71-
BEGIN {flag=0}
72-
/^# / {
73-
if(flag) exit
74-
if($2==ver){flag=1; next}
75-
}
76-
flag {print}
77-
' CHANGELOG.md)
78-
79-
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 [JLCEDA Extension Plaza](https://extensions.oshwhub.com/item/oshwhub/${EEXTNAME})"
80-
81-
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
82-
echo -e "$NOTES" >> $GITHUB_ENV
83-
echo "EOF" >> $GITHUB_ENV
84-
85-
echo "------ Release Notes ------"
86-
echo -e "$NOTES"
87-
echo "---------------------------"
88-
89-
- name: Debug check artifact
90-
if: env.SKIP_RELEASE == 'false'
91-
run: |
92-
VERSION=${{ env.VERSION }}
93-
EEXTNAME=${{ env.EEXTNAME }}
94-
FILE="build/dist/${EEXTNAME}_v${VERSION}.eext"
95-
if [ -f "$FILE" ]; then
96-
echo "✅ 产物存在: $FILE"
97-
else
98-
echo "❌ 未发现产物: $FILE"
99-
ls -R build || true
100-
exit 1
101-
fi
102-
103-
- name: Upload Release
104-
if: env.SKIP_RELEASE == 'false'
105-
uses: softprops/action-gh-release@v2
106-
with:
107-
tag_name: v${{ env.VERSION }}
108-
name: Release v${{ env.VERSION }}
109-
body: ${{ env.RELEASE_NOTES }}
110-
files: build/dist/${{ env.EEXTNAME }}_v${{ env.VERSION }}.eext
111-
env:
112-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
11+
build-and-release:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- name: Checkout source
15+
uses: actions/checkout@v4
16+
with:
17+
fetch-depth: 0
18+
19+
- name: Setup Node.js
20+
uses: actions/setup-node@v4
21+
with:
22+
node-version: '20'
23+
24+
- name: Install dependencies
25+
run: npm install
26+
27+
- name: Build project
28+
run: npm run build
29+
30+
- name: Get version & extension name from extension.json
31+
id: meta
32+
run: |
33+
echo "VERSION=$(jq -r .version extension.json)" >> $GITHUB_ENV
34+
echo "EEXTNAME=$(jq -r .name extension.json)" >> $GITHUB_ENV
35+
36+
- name: Check and create tag
37+
id: check_tag
38+
run: |
39+
VERSION=${{ env.VERSION }}
40+
TAG="v${VERSION}"
41+
42+
echo "🔎 检查 tag $TAG 是否存在..."
43+
if git rev-parse "$TAG" >/dev/null 2>&1; then
44+
echo "⚠️ Tag $TAG 已存在,跳过发布。"
45+
echo "SKIP_RELEASE=true" >> $GITHUB_ENV
46+
else
47+
echo "✅ Tag $TAG 不存在,创建并推送。"
48+
git config user.name "github-actions[bot]"
49+
git config user.email "github-actions[bot]@users.noreply.github.com"
50+
git tag -a "$TAG" -m "Release $TAG"
51+
git push origin "$TAG"
52+
echo "SKIP_RELEASE=false" >> $GITHUB_ENV
53+
fi
54+
55+
- name: Extract changelog for version
56+
if: env.SKIP_RELEASE == 'false'
57+
id: changelog
58+
run: |
59+
VERSION=${{ env.VERSION }}
60+
EEXTNAME=${{ env.EEXTNAME }}
61+
echo "🔎 Extracting changelog for version $VERSION from 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}"
100+
fi
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 分隔符设置多行环境变量
113+
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
114+
echo "$NOTES" >> $GITHUB_ENV
115+
echo "EOF" >> $GITHUB_ENV
116+
117+
echo "------ Release Notes ------"
118+
echo "$NOTES"
119+
echo "---------------------------"
120+
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
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"
226+
else
227+
echo "❌ 国际版产物不存在: $GLOBAL_FILE"
228+
ls -R build || true
229+
exit 1
230+
fi
231+
232+
- name: Upload Release
233+
if: env.SKIP_RELEASE == 'false'
234+
uses: softprops/action-gh-release@v2
235+
with:
236+
tag_name: v${{ env.VERSION }}
237+
name: Release v${{ env.VERSION }}
238+
body: ${{ env.RELEASE_NOTES }}
239+
files: |
240+
build/dist/${{ env.EEXTNAME }}_v${{ env.VERSION }}_zh-cn.eext
241+
build/dist/${{ env.EEXTNAME }}_v${{ env.VERSION }}_global.eext
242+
env:
243+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

0 commit comments

Comments
 (0)