Skip to content

Commit 3da3080

Browse files
author
Realsee CI Bot
committed
ci: package job 不再依赖 example_build,独立并行执行
0 parents  commit 3da3080

1,913 files changed

Lines changed: 182868 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 335 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,335 @@
1+
name: Publish npm package
2+
3+
on:
4+
push:
5+
branches: [package]
6+
paths:
7+
- 'package.json'
8+
- 'CHANGELOG.md'
9+
10+
env:
11+
NODE_VERSION: 18
12+
PACKAGE_NAME: "@realsee/dnalogel"
13+
14+
jobs:
15+
validate:
16+
name: 验证版本
17+
runs-on: ubuntu-latest
18+
timeout-minutes: 10
19+
outputs:
20+
version: ${{ steps.package-info.outputs.current-version }}
21+
dist_tag: ${{ steps.dist-tag.outputs.tag }}
22+
is_new_version: ${{ steps.version-check.outputs.is_new }}
23+
steps:
24+
- uses: actions/checkout@v4
25+
with:
26+
fetch-depth: 1
27+
28+
- name: 设置 Node.js
29+
uses: actions/setup-node@v4
30+
with:
31+
node-version: ${{ env.NODE_VERSION }}
32+
registry-url: "https://registry.npmjs.org"
33+
34+
- name: 获取包信息
35+
id: package-info
36+
uses: martinbeentjes/npm-get-version-action@v1.3.1
37+
38+
- name: 确定发布标签
39+
id: dist-tag
40+
run: |
41+
VERSION="${{ steps.package-info.outputs.current-version }}"
42+
if [[ -z "$VERSION" ]]; then
43+
echo "错误:无法获取版本号"
44+
exit 1
45+
fi
46+
47+
if [[ $VERSION =~ "-" ]]; then
48+
# 提取预发布标识符(alpha、beta、rc等)
49+
TAG=$(echo "$VERSION" | cut -d'-' -f2 | cut -d'.' -f1)
50+
if [[ -z "$TAG" ]]; then
51+
echo "错误:无法解析预发布标签"
52+
exit 1
53+
fi
54+
echo "tag=$TAG" >> $GITHUB_OUTPUT
55+
else
56+
echo "tag=latest" >> $GITHUB_OUTPUT
57+
fi
58+
59+
echo "处理的版本号: $VERSION"
60+
echo "发布标签: ${TAG:-latest}"
61+
62+
- name: 检查版本是否已发布
63+
id: version-check
64+
run: |
65+
VERSION="${{ steps.package-info.outputs.current-version }}"
66+
if [[ -z "$VERSION" ]]; then
67+
echo "错误:版本号为空"
68+
exit 1
69+
fi
70+
71+
# 添加重试机制
72+
MAX_RETRIES=3
73+
RETRY_COUNT=0
74+
75+
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
76+
if npm view "${{ env.PACKAGE_NAME }}@$VERSION" version &>/dev/null; then
77+
echo "is_new=false" >> $GITHUB_OUTPUT
78+
echo "版本 $VERSION 已存在,跳过发布"
79+
exit 0
80+
else
81+
# 如果是最后一次尝试,确认版本不存在
82+
if [ $RETRY_COUNT -eq $((MAX_RETRIES-1)) ]; then
83+
echo "is_new=true" >> $GITHUB_OUTPUT
84+
echo "版本 $VERSION 未发布,将进行发布"
85+
exit 0
86+
fi
87+
fi
88+
89+
RETRY_COUNT=$((RETRY_COUNT+1))
90+
echo "重试检查版本 ($RETRY_COUNT/$MAX_RETRIES)..."
91+
sleep 2
92+
done
93+
94+
publish:
95+
name: 发布包
96+
needs: validate
97+
if: needs.validate.outputs.is_new_version == 'true'
98+
runs-on: ubuntu-latest
99+
timeout-minutes: 15
100+
steps:
101+
- uses: actions/checkout@v4
102+
with:
103+
fetch-depth: 1
104+
105+
- name: 设置 Node.js
106+
uses: actions/setup-node@v4
107+
with:
108+
node-version: ${{ env.NODE_VERSION }}
109+
registry-url: "https://registry.npmjs.org"
110+
111+
- name: 发布到 NPM
112+
env:
113+
NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
114+
run: |
115+
echo "准备发布版本 ${{ needs.validate.outputs.version }} 到 NPM,标签: ${{ needs.validate.outputs.dist_tag }}"
116+
npm publish --tag ${{ needs.validate.outputs.dist_tag }} --ignore-scripts
117+
118+
- name: 同步到 CNPM
119+
if: success()
120+
run: |
121+
echo "同步包 ${{ env.PACKAGE_NAME }} 到 CNPM"
122+
npx cnpm sync ${{ env.PACKAGE_NAME }} || (echo "同步失败,重试..." && sleep 5 && npx cnpm sync ${{ env.PACKAGE_NAME }})
123+
124+
notify:
125+
name: 发送通知
126+
needs: [validate, publish]
127+
runs-on: ubuntu-latest
128+
if: always()
129+
timeout-minutes: 5
130+
steps:
131+
- uses: actions/checkout@v4
132+
with:
133+
fetch-depth: 1
134+
135+
- name: 获取更新日志
136+
id: changelog
137+
if: needs.validate.outputs.is_new_version == 'true' && needs.publish.result == 'success'
138+
shell: /usr/bin/bash {0}
139+
run: |
140+
# 移除 -e 选项,防止任何命令失败就退出
141+
142+
# 添加调试信息
143+
echo "========== 调试信息 =========="
144+
echo "检查常用命令是否可用:"
145+
which sed && echo "sed: 可用" || echo "sed: 不可用"
146+
which grep && echo "grep: 可用" || echo "grep: 不可用"
147+
which awk && echo "awk: 可用" || echo "awk: 不可用"
148+
149+
echo "GITHUB_OUTPUT 文件路径: $GITHUB_OUTPUT"
150+
echo "=============================="
151+
152+
# 首先设置默认消息到输出文件
153+
echo "content<<EOF" >> $GITHUB_OUTPUT
154+
echo "暂无详细更新说明" >> $GITHUB_OUTPUT
155+
echo "EOF" >> $GITHUB_OUTPUT
156+
157+
# 检查文件是否存在
158+
if [ ! -f "CHANGELOG.md" ]; then
159+
echo "CHANGELOG.md 文件不存在,使用默认内容"
160+
exit 0
161+
fi
162+
163+
VERSION="${{ needs.validate.outputs.version }}"
164+
echo "处理版本: $VERSION"
165+
166+
# 转义版本号中的特殊字符,防止正则表达式问题
167+
ESCAPED_VERSION=$(echo "$VERSION" | sed 's/\./\\./g' | sed 's/\+/\\+/g' | sed 's/\*/\\*/g' | sed 's/\[/\\[/g' | sed 's/\]/\\]/g' | sed 's/\^/\\^/g' | sed 's/\$/\\$/g' | sed 's/\-/\\-/g')
168+
echo "转义后的版本号: $ESCAPED_VERSION"
169+
170+
# 显示文件内容前几行用于调试
171+
echo "CHANGELOG.md 文件前10行:"
172+
head -10 CHANGELOG.md || echo "无法读取文件"
173+
echo "=============================="
174+
175+
# 检查是否包含版本标记 - 直接使用字符串比较而不是正则
176+
VERSION_MARKER="## $VERSION"
177+
if grep -F "## $VERSION" CHANGELOG.md; then
178+
echo "找到版本 $VERSION 的标记"
179+
180+
# 提取内容 - 多种方法尝试,任何方法失败都不会中断
181+
echo "尝试提取更新日志内容..."
182+
183+
# 方法1: 使用sed并确保正则表达式安全
184+
changelog_content=$(sed -n -e "/## $ESCAPED_VERSION/,/## /p" CHANGELOG.md | sed '1d;$d' || echo "")
185+
186+
# 如果内容为空,尝试方法2
187+
if [ -z "$(echo "$changelog_content" | tr -d '[:space:]')" ]; then
188+
echo "方法1失败,尝试方法2..."
189+
# 方法2: 使用固定字符串匹配,避免正则表达式
190+
changelog_content=$(grep -F -A 100 "## $VERSION" CHANGELOG.md || echo "")
191+
if [ -n "$changelog_content" ]; then
192+
next_version=$(grep -F -A 1 "## $VERSION" CHANGELOG.md | grep -F "## " | grep -v "## $VERSION" || echo "")
193+
if [ -n "$next_version" ]; then
194+
# 如果找到下一个版本标记,提取到下一个版本之前的内容
195+
end_line=$(grep -F -n "$next_version" CHANGELOG.md | head -1 | cut -d':' -f1)
196+
start_line=$(grep -F -n "## $VERSION" CHANGELOG.md | head -1 | cut -d':' -f1)
197+
start_line=$((start_line + 1))
198+
end_line=$((end_line - 1))
199+
if [ $start_line -le $end_line ]; then
200+
changelog_content=$(sed -n "${start_line},${end_line}p" CHANGELOG.md)
201+
fi
202+
else
203+
# 如果没有找到下一个版本,提取到文件末尾
204+
start_line=$(grep -F -n "## $VERSION" CHANGELOG.md | head -1 | cut -d':' -f1)
205+
start_line=$((start_line + 1))
206+
changelog_content=$(tail -n +$start_line CHANGELOG.md)
207+
fi
208+
fi
209+
fi
210+
211+
# 如果内容仍为空,尝试方法3
212+
if [ -z "$(echo "$changelog_content" | tr -d '[:space:]')" ]; then
213+
echo "方法2失败,尝试方法3..."
214+
# 方法3: 最基本的提取,按行处理,避免正则匹配
215+
in_section=0
216+
temp_file=$(mktemp)
217+
while IFS= read -r line; do
218+
if [ "$line" = "## $VERSION" ]; then
219+
in_section=1
220+
continue
221+
elif [[ "$line" == \#\#* ]] && [ $in_section -eq 1 ]; then
222+
break
223+
elif [ $in_section -eq 1 ]; then
224+
echo "$line" >> "$temp_file"
225+
fi
226+
done < CHANGELOG.md
227+
changelog_content=$(cat "$temp_file")
228+
rm -f "$temp_file"
229+
fi
230+
231+
if [ -n "$(echo "$changelog_content" | tr -d '[:space:]')" ]; then
232+
# 覆盖之前的默认输出
233+
echo "成功提取内容,更新输出..."
234+
echo "content<<EOF" > $GITHUB_OUTPUT
235+
echo "$changelog_content" >> $GITHUB_OUTPUT
236+
echo "EOF" >> $GITHUB_OUTPUT
237+
echo "成功提取版本 $VERSION 的更新日志"
238+
else
239+
echo "无法提取版本 $VERSION 的更新日志,使用默认内容"
240+
fi
241+
else
242+
echo "在CHANGELOG.md中未找到版本 $VERSION 的标记,使用默认内容"
243+
echo "尝试搜索内容:"
244+
grep "##" CHANGELOG.md | head -5 || echo "未找到任何版本标记"
245+
fi
246+
247+
# 确认 GITHUB_OUTPUT 的内容
248+
echo "GITHUB_OUTPUT 中的内容:"
249+
cat $GITHUB_OUTPUT || echo "无法读取 GITHUB_OUTPUT"
250+
251+
- name: 获取名言
252+
id: get-proverb
253+
run: |
254+
# 检查curl是否可用
255+
if command -v curl &> /dev/null; then
256+
echo "使用curl获取在线名言"
257+
# 尝试从API获取
258+
quote=$(curl -s --connect-timeout 3 'https://v1.hitokoto.cn/?c=i&encode=text' || echo "")
259+
else
260+
echo "curl命令不可用,直接使用本地名言"
261+
quote=""
262+
fi
263+
264+
# 如果API调用失败或curl不可用,使用本地数组
265+
if [ -z "$quote" ]; then
266+
# 定义谚语数组
267+
PROVERBS=(
268+
"工欲善其事,必先利其器。"
269+
"千里之行,始于足下。"
270+
"不积跬步,无以至千里。"
271+
"读书破万卷,下笔如有神。"
272+
"业精于勤,荒于嬉。"
273+
"学而不思则罔,思而不学则殆。"
274+
"温故而知新,可以为师矣。"
275+
"纸上得来终觉浅,绝知此事要躬行。"
276+
"学海无涯苦作舟。"
277+
"天道酬勤。"
278+
)
279+
280+
# 随机选择一条谚语
281+
# 保证随机机制在不同环境都能工作
282+
if [ -n "$RANDOM" ]; then
283+
# bash内置$RANDOM可用
284+
RANDOM_INDEX=$((RANDOM % ${#PROVERBS[@]}))
285+
else
286+
# 使用日期秒数作为随机源
287+
RANDOM_INDEX=$(($(date +%s) % ${#PROVERBS[@]}))
288+
fi
289+
290+
quote="${PROVERBS[$RANDOM_INDEX]}"
291+
echo "使用本地谚语:$quote"
292+
else
293+
echo "使用API获取的名言:$quote"
294+
fi
295+
296+
# 保存输出
297+
echo "quote=$quote" >> $GITHUB_OUTPUT
298+
299+
- name: 生成通知消息
300+
id: notification
301+
run: |
302+
WORKFLOW_URL="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
303+
VERSION="${{ needs.validate.outputs.version }}"
304+
NPM_URL="https://www.npmjs.com/package/${{ env.PACKAGE_NAME }}/v/$VERSION"
305+
306+
# 生成通知消息
307+
echo "message<<EOF" >> $GITHUB_OUTPUT
308+
309+
if [[ "${{ needs.validate.result }}" == "failure" ]]; then
310+
echo "❌ 版本验证失败,[查看日志]($WORKFLOW_URL)" >> $GITHUB_OUTPUT
311+
elif [[ "${{ needs.validate.outputs.is_new_version }}" == "false" ]]; then
312+
echo "⚠️ 版本 $VERSION 已存在,跳过发布" >> $GITHUB_OUTPUT
313+
elif [[ "${{ needs.publish.result }}" == "success" ]]; then
314+
echo "✅ 版本 $VERSION 发布成功![查看包]($NPM_URL)" >> $GITHUB_OUTPUT
315+
echo "" >> $GITHUB_OUTPUT
316+
echo "更新内容:" >> $GITHUB_OUTPUT
317+
echo "${{ steps.changelog.outputs.content }}" >> $GITHUB_OUTPUT
318+
echo "" >> $GITHUB_OUTPUT
319+
echo "---" >> $GITHUB_OUTPUT
320+
echo "*${{ steps.get-proverb.outputs.quote }}*" >> $GITHUB_OUTPUT
321+
elif [[ "${{ needs.publish.result }}" == "skipped" ]]; then
322+
echo "⏭️ 跳过发布流程" >> $GITHUB_OUTPUT
323+
else
324+
echo "❌ 版本 $VERSION 发布失败,[查看日志]($WORKFLOW_URL)" >> $GITHUB_OUTPUT
325+
fi
326+
327+
echo "EOF" >> $GITHUB_OUTPUT
328+
329+
- name: 发送企业微信通知
330+
uses: chf007/action-wechat-work@master
331+
env:
332+
WECHAT_WORK_BOT_WEBHOOK: ${{ secrets.QY_WECHAT_BOT_HOOK }}
333+
with:
334+
msgtype: markdown
335+
content: ${{ steps.notification.outputs.message }}

0 commit comments

Comments
 (0)