name: Beta Release (PyPI Pre-release) concurrency: group: beta-release cancel-in-progress: true on: push: branches: - beta paths: - "Server/**" jobs: publish_pypi_prerelease: name: Publish beta to PyPI (pre-release) runs-on: ubuntu-latest environment: name: pypi url: https://pypi.org/p/mcpforunityserver permissions: contents: read id-token: write steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Install uv uses: astral-sh/setup-uv@v7 with: version: "latest" enable-cache: true cache-dependency-glob: "Server/uv.lock" - name: Generate beta version id: version shell: bash run: | set -euo pipefail RAW_VERSION=$(grep -oP '(?<=version = ")[^"]+' Server/pyproject.toml) # Strip any existing pre-release suffix (a, b, rc, dev, post) for safe parsing # e.g., "9.2.0b1" -> "9.2.0", "9.2.0.dev1" -> "9.2.0" BASE_VERSION=$(echo "$RAW_VERSION" | sed -E 's/(a|b|rc|\.dev|\.post)[0-9]+$//') # Validate we have a proper X.Y.Z format if ! [[ "$BASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "Error: Could not parse version '$RAW_VERSION' -> '$BASE_VERSION'" >&2 exit 1 fi # Bump minor version and use beta suffix (PEP 440 compliant: X.Y+1.0bN) # This ensures beta is "newer" than the stable release IFS='.' read -r MAJOR MINOR PATCH <<< "$BASE_VERSION" NEXT_MINOR=$((MINOR + 1)) BETA_NUMBER="$(date +%Y%m%d%H%M%S)" BETA_VERSION="${MAJOR}.${NEXT_MINOR}.0b${BETA_NUMBER}" echo "Raw version: $RAW_VERSION" echo "Base version: $BASE_VERSION" echo "Beta version: $BETA_VERSION" echo "beta_version=$BETA_VERSION" >> "$GITHUB_OUTPUT" - name: Update version for beta release env: BETA_VERSION: ${{ steps.version.outputs.beta_version }} shell: bash run: | set -euo pipefail sed -i "s/^version = .*/version = \"${BETA_VERSION}\"/" Server/pyproject.toml echo "Updated pyproject.toml:" grep "^version" Server/pyproject.toml - name: Build a binary wheel and a source tarball shell: bash run: uv build working-directory: ./Server - name: Publish distribution to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: packages-dir: Server/dist/