#!/usr/bin/env bash
set -euo pipefail
MODE="dev"
REPO="testpypi"
PUBLISH="0"
SET_VERSION=""
usage() {
cat <<'EOF'
用法:
bash akg_agents/scripts/publish_akg_cli.sh --version VERSION [--mode dev|post|patch] [--repo testpypi|pypi] [--publish]
说明:
- version 为必填,脚本不再自动递增版本号
- 默认 mode=dev,repo=testpypi
- 默认仅更新版本号(不构建、不上传)
- --publish 才会更新版本号并执行构建与上传
- mode 仅用于标识/记录(不影响版本号)
- 上传需要 TWINE_PASSWORD 环境变量
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--mode)
MODE="${2:-}"
shift 2
;;
--repo)
REPO="${2:-}"
shift 2
;;
--publish)
PUBLISH="1"
shift
;;
--version)
SET_VERSION="${2:-}"
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown arg: $1" >&2
usage
exit 1
;;
esac
done
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
AIKG_DIR="${ROOT_DIR}"
CLI_DIR="${ROOT_DIR}/akg-cli"
if [[ ! -f "${AIKG_DIR}/version.txt" ]]; then
echo "Missing ${AIKG_DIR}/version.txt" >&2
exit 1
fi
if [[ ! -d "${CLI_DIR}" ]]; then
echo "Missing ${CLI_DIR} (akg-cli wrapper)" >&2
exit 1
fi
CURRENT_VERSION="$(cat "${AIKG_DIR}/version.txt" | tr -d '[:space:]')"
if [[ -z "${SET_VERSION}" ]]; then
echo "--version is required" >&2
exit 1
fi
NEXT_VERSION="${SET_VERSION}"
if ! V="${NEXT_VERSION}" python - <<'PY'
import os, re, sys
v = os.environ["V"]
pattern = r"^(\d+\.\d+\.\d+)(?:\.post(\d+))?(?:\.dev(\d+))?$"
if not re.match(pattern, v):
print(f"Unsupported version format: {v}", file=sys.stderr)
sys.exit(1)
PY
then
exit 1
fi
if [[ "${PUBLISH}" = "0" ]]; then
echo "Current: ${CURRENT_VERSION}"
echo "Next: ${NEXT_VERSION}"
echo "==> No changes applied (use --publish to update/build/upload)"
exit 0
fi
echo "Version bump: ${CURRENT_VERSION} -> ${NEXT_VERSION}"
echo "${NEXT_VERSION}" > "${AIKG_DIR}/version.txt"
echo "${NEXT_VERSION}" > "${CLI_DIR}/version.txt"
if [[ -z "${TWINE_PASSWORD:-}" ]]; then
echo "TWINE_PASSWORD is required for upload" >&2
exit 1
fi
TWINE_USERNAME="${TWINE_USERNAME:-__token__}"
python -m pip install -U build twine >/dev/null
echo "==> Build akg_agents"
(cd "${AIKG_DIR}" && python -m build --no-isolation)
echo "==> Build akg-cli"
(cd "${CLI_DIR}" && python -m build --no-isolation)
echo "==> Upload akg_agents"
env -u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY -u all_proxy \
TWINE_USERNAME="${TWINE_USERNAME}" TWINE_PASSWORD="${TWINE_PASSWORD}" \
twine upload -r "${REPO}" --skip-existing "${AIKG_DIR}/dist/akg_agents-${NEXT_VERSION}"*
echo "==> Upload akg-cli"
env -u http_proxy -u https_proxy -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY -u all_proxy \
TWINE_USERNAME="${TWINE_USERNAME}" TWINE_PASSWORD="${TWINE_PASSWORD}" \
twine upload -r "${REPO}" --skip-existing "${CLI_DIR}/dist/akg_cli-${NEXT_VERSION}"*