ci: enforce tag-based version and strict sync checks
Use Git tag as release version, validate SKILL.md version consistency, and fail workflow when API business code is not success.
This commit is contained in:
40
.github/workflows/release_skill.yaml
vendored
40
.github/workflows/release_skill.yaml
vendored
@@ -30,8 +30,26 @@ jobs:
|
||||
import frontmatter, os, json, shutil
|
||||
post = frontmatter.load('SKILL.md')
|
||||
metadata = post.metadata
|
||||
slug = metadata['name']
|
||||
version = metadata['version']
|
||||
# slug 优先从 openclaw.slug 读取,兼容历史用 name
|
||||
openclaw_meta = metadata.get('metadata', {}).get('openclaw', {})
|
||||
slug = (openclaw_meta.get('slug') or metadata.get('slug') or metadata.get('name') or '').strip()
|
||||
if not slug:
|
||||
raise Exception('SKILL.md 缺少 slug/name,无法构建发布包')
|
||||
|
||||
# 以 Git Tag 为准(严格模式)
|
||||
ref_name = (os.environ.get('GITHUB_REF_NAME') or '').strip()
|
||||
if not ref_name:
|
||||
ref_name = (os.environ.get('GITHUB_REF') or '').strip().split('/')[-1]
|
||||
if not ref_name.startswith('v'):
|
||||
raise Exception(f'非法标签: {ref_name},要求以 v 开头,例如 v1.0.10')
|
||||
|
||||
version = ref_name.lstrip('v')
|
||||
skill_version = str(metadata.get('version') or '').strip()
|
||||
if skill_version != version:
|
||||
raise Exception(f'SKILL.md 版本({skill_version})与 Git Tag 版本({version})不一致')
|
||||
|
||||
# 统一覆盖,确保后续输出与上传完全一致
|
||||
metadata['version'] = version
|
||||
# 安全写入输出
|
||||
with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
|
||||
f.write(f'slug={slug}\n')
|
||||
@@ -53,7 +71,14 @@ jobs:
|
||||
url = 'https://jc2009.com/api/skill/update'
|
||||
res = requests.post(url, json=metadata)
|
||||
print(f'DB Sync Result: {res.text}')
|
||||
if res.status_code != 200: exit(1)
|
||||
if res.status_code != 200:
|
||||
exit(1)
|
||||
try:
|
||||
payload = res.json()
|
||||
except Exception:
|
||||
exit(1)
|
||||
if payload.get('code') != 200:
|
||||
exit(1)
|
||||
"
|
||||
|
||||
# 6. 上传物理包
|
||||
@@ -71,5 +96,12 @@ jobs:
|
||||
with open(f'{slug}.zip', 'rb') as f:
|
||||
res = requests.post(url, data=payload, files={'file': f})
|
||||
print(f'Upload Result: {res.text}')
|
||||
if res.status_code != 200: exit(1)
|
||||
if res.status_code != 200:
|
||||
exit(1)
|
||||
try:
|
||||
payload = res.json()
|
||||
except Exception:
|
||||
exit(1)
|
||||
if payload.get('code') != 200:
|
||||
exit(1)
|
||||
"
|
||||
|
||||
Reference in New Issue
Block a user