add pod release script
This commit is contained in:
170
release_pod.sh
Executable file
170
release_pod.sh
Executable 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"
|
||||
Reference in New Issue
Block a user