add pod release script

This commit is contained in:
gem
2026-05-14 18:14:43 +08:00
parent 9299d1db85
commit 7188fbc94f

170
release_pod.sh Executable file
View File

@@ -0,0 +1,170 @@
#!/usr/bin/env bash
set -euo pipefail
# 简化 openim_sdk_core_ios 私有 Pod 发版流程:
# 1. 可选:替换 OpenIMCore.xcframework
# 2. 更新 openim_sdk_core_ios.podspec 中的 s.version
# 3. 可选:执行 pod lib lint
# 4. git commit / tag / push
# 5. 可选:推送到私有 Specs 仓库pod repo push
#
# 用法:
# ./release_pod.sh
# ./release_pod.sh 0.18.0
# ./release_pod.sh 0.18.0 /path/to/OpenIMCore.xcframework
#
# 默认会从 openim_sdk_core_ios.podspec 读取当前版本并自动 +1 minor 作为新 tag
# 例如 0.17.0 -> 0.18.0。
# 默认会从 ../open-im-sdk-core/build/OpenIMCore.xcframework 拷贝 framework。
#
# 常用环境变量:
# SKIP_LINT=1 跳过 pod lib lint
# LINT_ARGS="--allow-warnings" 自定义 lint 参数,默认 --allow-warnings
# SKIP_GIT=1 只更新文件,不 commit/tag/push
# COMMIT_MSG="release 0.18.0" 自定义 commit message
# PRIVATE_SPEC_REPO="your-spec-repo" 执行 pod repo push your-spec-repo openim_sdk_core_ios.podspec
# POD_REPO_PUSH_ARGS="--allow-warnings" 自定义 pod repo push 参数
PODSPEC="openim_sdk_core_ios.podspec"
FRAMEWORK_DIR="openim_sdk_core_ios/frameworks"
FRAMEWORK_NAME="OpenIMCore.xcframework"
# 默认 xcframework 来源:当前 pod 仓库上级目录的同级 open-im-sdk-core/build
DEFAULT_XCFRAMEWORK_SRC="../open-im-sdk-core/build/${FRAMEWORK_NAME}"
usage() {
cat <<EOF
用法:
$0 [version] [OpenIMCore.xcframework路径]
示例:
$0
$0 0.18.0
$0 0.18.0 ~/Downloads/OpenIMCore.xcframework
说明:
不传 version 时,自动从 openim_sdk_core_ios.podspec 读取当前版本并 +1 minor中间版本号增加。
例如当前是 0.17.0,则默认发布 0.18.0。
不传 OpenIMCore.xcframework 路径时,默认使用:
../open-im-sdk-core/build/OpenIMCore.xcframework
环境变量:
SKIP_LINT=1 跳过 pod lib lint
LINT_ARGS="--allow-warnings" pod lib lint 参数
SKIP_GIT=1 跳过 git commit/tag/push
COMMIT_MSG="release <version>" 自定义提交信息
PRIVATE_SPEC_REPO="repo-name" 推送私有 Specs 仓库
POD_REPO_PUSH_ARGS="--allow-warnings" pod repo push 参数
EOF
}
log() {
printf '\033[1;32m[release_pod]\033[0m %s\n' "$*"
}
fail() {
printf '\033[1;31m[release_pod][ERROR]\033[0m %s\n' "$*" >&2
exit 1
}
run() {
log "$*"
"$@"
}
VERSION="${1:-}"
XCFRAMEWORK_SRC="${2:-$DEFAULT_XCFRAMEWORK_SRC}"
[[ -f "$PODSPEC" ]] || fail "未找到 $PODSPEC,请在仓库根目录执行脚本"
if [[ -z "$VERSION" ]]; then
VERSION="$(python3 - "$PODSPEC" <<'PY'
import re
import sys
from pathlib import Path
podspec = Path(sys.argv[1])
text = podspec.read_text()
match = re.search(r"s\.version\s*=\s*['\"]([^'\"]+)['\"]", text)
if not match:
raise SystemExit(f"未能在 {podspec} 中找到 s.version")
current = match.group(1)
parts = current.split(".")
if len(parts) != 3 or not all(part.isdigit() for part in parts):
raise SystemExit(f"当前版本号不支持自动递增:{current},请手动传入版本号,例如 0.18.0")
major, minor, patch = map(int, parts)
print(f"{major}.{minor + 1}.0")
PY
)"
log "未传版本号,自动从 $PODSPEC 递增得到:$VERSION"
fi
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+([-.][0-9A-Za-z.-]+)?$ ]]; then
fail "版本号格式不正确:${VERSION},例如 0.18.0"
fi
[[ -d "$XCFRAMEWORK_SRC" ]] || fail "xcframework 路径不存在:${XCFRAMEWORK_SRC}"
[[ "$(basename "$XCFRAMEWORK_SRC")" == "$FRAMEWORK_NAME" ]] || fail "请传入 ${FRAMEWORK_NAME} 目录"
log "替换 ${FRAMEWORK_DIR}/${FRAMEWORK_NAME},来源:${XCFRAMEWORK_SRC}"
rm -rf "$FRAMEWORK_DIR/$FRAMEWORK_NAME"
mkdir -p "$FRAMEWORK_DIR"
cp -R "$XCFRAMEWORK_SRC" "$FRAMEWORK_DIR/"
log "更新 ${PODSPEC} 版本号为 ${VERSION}"
python3 - "$PODSPEC" "$VERSION" <<'PY'
import re
import sys
from pathlib import Path
podspec = Path(sys.argv[1])
version = sys.argv[2]
text = podspec.read_text()
new_text, count = re.subn(
r"(s\.version\s*=\s*)['\"][^'\"]+['\"]",
rf"\1'{version}'",
text,
count=1,
)
if count != 1:
raise SystemExit(f"未能在 {podspec} 中找到唯一的 s.version")
podspec.write_text(new_text)
PY
if [[ "${SKIP_LINT:-0}" != "1" ]]; then
if ! command -v pod >/dev/null 2>&1; then
fail "未安装 CocoaPods或设置 SKIP_LINT=1 跳过 lint"
fi
# shellcheck disable=SC2206
LINT_ARGS_ARRAY=(${LINT_ARGS:---allow-warnings})
run pod lib lint "$PODSPEC" "${LINT_ARGS_ARRAY[@]}"
else
log "已跳过 pod lib lint"
fi
if [[ "${SKIP_GIT:-0}" != "1" ]]; then
git diff --quiet -- "$PODSPEC" "$FRAMEWORK_DIR" && fail "没有检测到 podspec/framework 变更,无需发版"
if git rev-parse "$VERSION" >/dev/null 2>&1; then
fail "tag 已存在:$VERSION"
fi
run git add "$PODSPEC" "$FRAMEWORK_DIR"
run git commit -m "${COMMIT_MSG:-release $VERSION}"
run git tag "$VERSION"
run git push origin HEAD
run git push origin "$VERSION"
else
log "已跳过 git commit/tag/push"
fi
if [[ -n "${PRIVATE_SPEC_REPO:-}" ]]; then
if ! command -v pod >/dev/null 2>&1; then
fail "未安装 CocoaPods无法 pod repo push"
fi
# shellcheck disable=SC2206
POD_REPO_PUSH_ARGS_ARRAY=(${POD_REPO_PUSH_ARGS:---allow-warnings})
run pod repo push "$PRIVATE_SPEC_REPO" "$PODSPEC" "${POD_REPO_PUSH_ARGS_ARRAY[@]}"
fi
log "完成:$VERSION"