Files
open_pod/release_pod.sh
2026-05-14 18:14:43 +08:00

171 lines
5.3 KiB
Bash
Executable File
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.
#!/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"