gitlink-cli/skills/gitlink-community-ops/scripts/03-auto-release-notes.sh

92 lines
4.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ================================================================
# Phase 3: 自动 Release Notes
# 功能:获取最新 tag → 分析 commit → 推荐版本号 → 生成 Release Notes
# 使用bash 03-auto-release-notes.sh <owner> <repo>
# 环境变量DRY_RUN=true|false (默认 true)
# ================================================================
set -e
OWNER=${1:?"Usage: $0 <owner> <repo>"}
REPO=${2}
DRY_RUN=${DRY_RUN:-true}
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
OUTPUT_DIR="$SCRIPT_DIR/_output"
mkdir -p "$OUTPUT_DIR"
echo "[========================================]"
echo "[ Phase 3: 自动 Release Notes ]"
echo "[ Target: $OWNER/$REPO ]"
echo "[ DRY_RUN: $DRY_RUN ]"
echo "[========================================]"
# ---- Step 1: 获取最新 Release ----
echo "[INFO] 获取最新 Release..."
RELEASE_DATA=$(gitlink-cli release +list --owner "$OWNER" --repo "$REPO" --format json 2>&1) || {
echo "[WARN] 获取 Release 列表失败: $RELEASE_DATA"
echo "[INFO] 使用默认基线 v0.0.0"
LAST_TAG="v0.0.0"
}
echo "$RELEASE_DATA" > "$OUTPUT_DIR/releases.json"
# 提取最新 tag
LAST_TAG=$(echo "$RELEASE_DATA" | node -e "
let s='';
process.stdin.on('data',d=>s+=d).on('end',()=>{
try {
const d=JSON.parse(s).data||[];
const items=Array.isArray(d)?d:(d.releases||d);
if(items.length>0) process.stdout.write(String(items[0].tag_name||'v0.0.0'));
else process.stdout.write('v0.0.0');
} catch(e) { process.stdout.write('v0.0.0'); }
});
" 2>/dev/null || echo "v0.0.0")
echo "[INFO] 最新 tag: $LAST_TAG"
# ---- Step 2: 获取提交历史 ----
echo "[INFO] 获取提交历史 (基线: $LAST_TAG)..."
# 尝试从 git 获取(需要在 repo 目录下)
if git rev-parse --git-dir > /dev/null 2>&1; then
echo "[INFO] 在 git 仓库中,尝试获取 tags..."
git fetch --tags 2>&1 | tail -3 || true
# 检查 tag 是否存在
if git rev-parse -q --verify "$LAST_TAG" > /dev/null 2>&1; then
echo "[INFO] 找到本地 tag: $LAST_TAG"
git log "$LAST_TAG"..HEAD --format="%H|%s|%an|%ad" --date=short > "$OUTPUT_DIR/commits-since-$LAST_TAG.log" 2>&1
git log "$LAST_TAG"..HEAD --stat --oneline > "$OUTPUT_DIR/stats-since-$LAST_TAG.log" 2>&1
echo "[INFO] 提交历史已保存"
else
echo "[WARN] 本地未找到 tag '$LAST_TAG',尝试从远程获取..."
# 尝试从 remote 获取指定 tag
git fetch origin tag "$LAST_TAG" 2>&1 | tail -3 || true
if git rev-parse -q --verify "$LAST_TAG" > /dev/null 2>&1; then
git log "$LAST_TAG"..HEAD --format="%H|%s|%an|%ad" --date=short > "$OUTPUT_DIR/commits-since-$LAST_TAG.log" 2>&1
git log "$LAST_TAG"..HEAD --stat --oneline > "$OUTPUT_DIR/stats-since-$LAST_TAG.log" 2>&1
else
echo "[WARN] 远程也无此 tag获取全部提交历史"
git log --all --format="%H|%s|%an|%ad" --date=short -100 > "$OUTPUT_DIR/commits-since-$LAST_TAG.log" 2>&1
git log --all --oneline --stat -100 > "$OUTPUT_DIR/stats-since-$LAST_TAG.log" 2>&1
echo "[INFO] 已获取最近 100 条提交(未按 tag 过滤)"
fi
fi
else
echo "[WARN] 不在 git 仓库中,通过 CLI 获取提交历史..."
source "$SCRIPT_DIR/../../gitlink-shared/scripts/detect-cli.sh" 2>/dev/null || true
gitlink-cli commit +list --owner "$OWNER" --repo "$REPO" --limit 100 --format json > "$OUTPUT_DIR/commits-api.json" 2>&1 || {
echo "[ERROR] 通过 API 获取提交历史也失败"
echo "[INFO] Release Notes 生成跳过"
touch "$OUTPUT_DIR/commits-api.json"
}
fi
# ---- Step 3: 运行 Release 分析引擎 ----
echo "[INFO] 运行 Release Notes 分析引擎..."
node "$SCRIPT_DIR/release-analyze.js" "$OUTPUT_DIR" "$LAST_TAG"
echo ""
echo "[========================================]"
echo "[ Phase 3 完成 ]"
echo "[========================================]"