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