| name | devops-review |
| description | 审查仓库状态、CHANGELOG、版本一致性等,支持发布前检查、代码审查、文档审查等多场景。 |
devops-review
统一审查仓库状态,为多种工作流程提供前置检查。
功能
- 验证 CHANGELOG.md 版本连续性
- 检查未追踪文件
- 验证子模块状态
- 检查标签与代码一致性
- 验证版本号格式
使用场景
验证项
1. 版本号格式验证
validate_version_format() {
local VERSION="$1"
if [[ "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$ ]] || \
[[ "$VERSION" =~ ^[a-zA-Z0-9_.-]+/v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$ ]]; then
echo "✓ 版本号格式正确: $VERSION"
return 0
else
echo "✗ 版本号格式错误: $VERSION"
echo " 预期格式: vX.Y.Z、vX.Y.Z-qualifier 或 scope/vX.Y.Z、scope/vX.Y.Z-qualifier"
echo " 示例: v1.0.0, v0.4.0-alpha.1, python/v0.1.0"
return 1
fi
}
2. CHANGELOG 验证
validate_changelog() {
local VERSION="$1"
local VERSION_NUM=$(echo "$VERSION" | sed 's|.*/v||; s|^v||')
if [ ! -f "CHANGELOG.md" ]; then
echo "✗ CHANGELOG.md 文件不存在"
return 1
fi
local CHANGELOG_HEADER=""
if grep -q "^## \[${VERSION_NUM}\]" CHANGELOG.md; then
CHANGELOG_HEADER="$VERSION_NUM"
elif grep -q "^## \[${VERSION}\]" CHANGELOG.md; then
CHANGELOG_HEADER="$VERSION"
else
echo "✗ CHANGELOG.md 未找到版本 [${VERSION_NUM}]"
echo " 已有版本:"
grep "^## \[" CHANGELOG.md | head -5
return 1
fi
local NOTES=$(sed -n "/^## \[${CHANGELOG_HEADER}\]/,/^## \[/p" CHANGELOG.md | sed '1d;$d')
if [ -z "$NOTES" ]; then
echo "✗ 版本 [${CHANGELOG_HEADER}] 内容为空"
return 1
fi
echo "✓ CHANGELOG.md 版本 [${CHANGELOG_HEADER}] 验证通过"
echo " 内容预览:"
echo "$NOTES" | head -3
return 0
}
3. 工作区状态验证
validate_working_directory() {
local STATUS=$(git status --porcelain)
if [ -z "$STATUS" ]; then
echo "✓ 工作区干净"
return 0
else
echo "✗ 工作区有未提交变更:"
echo "$STATUS"
return 1
fi
}
4. 子模块状态验证
validate_submodules() {
if [ ! -f ".gitmodules" ]; then
echo "✓ 无子模块"
return 0
fi
local INIT_STATUS=$(git submodule status | grep -c "^-")
if [ "$INIT_STATUS" -gt 0 ]; then
echo "✗ 有 $INIT_STATUS 个子模块未初始化"
git submodule status | grep "^-"
return 1
fi
local UPDATE_STATUS=$(git submodule status | grep -c "^+")
if [ "$UPDATE_STATUS" -gt 0 ]; then
echo "⚠ 有 $UPDATE_STATUS 个子模块有新提交"
git submodule status | grep "^+"
echo " 建议: git submodule update --remote"
fi
echo "✓ 子模块状态验证通过"
return 0
}
5. 标签验证
validate_tag() {
local VERSION="$1"
local SCOPE=""
if [[ "$VERSION" =~ ^([a-zA-Z0-9_.-]+)/ ]]; then
SCOPE="${BASH_REMATCH[1]}"
fi
if git tag -l | grep -q "^${VERSION}$"; then
echo "✗ 标签 $VERSION 已存在"
echo " 现有标签:"
if [ -n "$SCOPE" ]; then
git tag -l | grep "^${SCOPE}/v" | tail -5
else
git tag -l | grep "^v" | tail -5
fi
return 1
else
echo "✓ 标签 $VERSION 不存在,可以创建"
return 0
fi
}
6. 远程仓库验证
validate_remote() {
local REMOTE="$1"
if ! git remote | grep -q "^${REMOTE}$"; then
echo "✗ 远程仓库 '$REMOTE' 不存在"
git remote -v
return 1
fi
if ! git ls-remote "$REMOTE" &>/dev/null; then
echo "✗ 无法连接到远程仓库 '$REMOTE'"
return 1
fi
echo "✓ 远程仓库 '$REMOTE' 验证通过"
return 0
}
完整验证流程
validate_release() {
local VERSION="$1"
local REMOTE="${2:-origin}"
echo "=== 发布前验证: $VERSION ==="
echo
local ERRORS=0
validate_version_format "$VERSION" || ((ERRORS++))
validate_changelog "$VERSION" || ((ERRORS++))
validate_working_directory || ((ERRORS++))
validate_submodules || ((ERRORS++))
validate_tag "$VERSION" || ((ERRORS++))
validate_remote "$REMOTE" || ((ERRORS++))
echo
echo "=== 验证结果 ==="
if [ "$ERRORS" -eq 0 ]; then
echo "✓ 所有验证通过,可以发布"
return 0
else
echo "✗ 发现 $ERRORS 个错误,请修复后再发布"
return 1
fi
}
validate_release "v0.4.0"
集成到 devops-release
在 devops-release 的预检查步骤中调用:
.agents/skills/devops-review/SKILL.md validate_release "$VERSION"
if [ $? -ne 0 ]; then
echo "发布前审查失败,请修复后再试"
exit 1
fi