- Update actions/upload-artifact from v3 to v4 (v3 deprecated April 2024) - Update actions/setup-python from v4 to v5 (latest version) - Add Python 3.12 and 3.13 to CI test matrix - Ensure compatibility with latest Python versions and GitHub Actions
124 lines
4.1 KiB
YAML
124 lines
4.1 KiB
YAML
name: Manual Release
|
||
|
||
on:
|
||
workflow_dispatch:
|
||
inputs:
|
||
version:
|
||
description: 'Version to release (e.g., 0.1.1)'
|
||
required: true
|
||
type: string
|
||
test_pypi:
|
||
description: 'Test on TestPyPI first'
|
||
required: false
|
||
type: boolean
|
||
default: true
|
||
|
||
jobs:
|
||
validate-and-release:
|
||
runs-on: ubuntu-latest
|
||
permissions:
|
||
contents: write
|
||
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
token: ${{ secrets.GITHUB_TOKEN }}
|
||
|
||
- name: Check CI status
|
||
run: |
|
||
echo "ℹ️ This workflow assumes CI has already passed on the current commit."
|
||
echo " If not, please wait for CI to complete before releasing."
|
||
echo ""
|
||
|
||
- name: Validate version format
|
||
run: |
|
||
if ! [[ "${{ inputs.version }}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||
echo "❌ Invalid version format. Use semantic versioning (e.g., 0.1.1)"
|
||
exit 1
|
||
fi
|
||
echo "✅ Version format valid: ${{ inputs.version }}"
|
||
|
||
- name: Check if version already exists
|
||
run: |
|
||
if git tag | grep -q "^v${{ inputs.version }}$"; then
|
||
echo "❌ Version v${{ inputs.version }} already exists!"
|
||
exit 1
|
||
fi
|
||
echo "✅ Version is new"
|
||
|
||
- name: Set up Python
|
||
uses: actions/setup-python@v5
|
||
with:
|
||
python-version: '3.13'
|
||
|
||
- name: Install uv
|
||
run: |
|
||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
||
|
||
- name: Update versions
|
||
run: |
|
||
./scripts/bump_version.sh ${{ inputs.version }}
|
||
git config user.name "GitHub Actions"
|
||
git config user.email "actions@github.com"
|
||
git add packages/*/pyproject.toml
|
||
git commit -m "chore: release v${{ inputs.version }}"
|
||
|
||
- name: Build packages for TestPyPI
|
||
run: |
|
||
echo "🔨 Building packages for testing..."
|
||
./scripts/build_and_test.sh all
|
||
echo "✅ Build successful! (Already tested on multiple platforms)"
|
||
|
||
- name: Test on TestPyPI (optional)
|
||
if: inputs.test_pypi
|
||
env:
|
||
TWINE_USERNAME: __token__
|
||
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
||
run: |
|
||
pip install twine
|
||
echo "📦 Uploading to TestPyPI..."
|
||
twine upload --repository testpypi packages/*/dist/* --verbose
|
||
echo "✅ Test upload successful!"
|
||
echo "📋 Check packages at: https://test.pypi.org/user/your-username/"
|
||
echo ""
|
||
echo "To test installation:"
|
||
echo "pip install -i https://test.pypi.org/simple/ leann"
|
||
|
||
- name: Create and push tag
|
||
run: |
|
||
git tag "v${{ inputs.version }}"
|
||
git push origin main
|
||
git push origin "v${{ inputs.version }}"
|
||
echo "✅ Tag v${{ inputs.version }} created and pushed"
|
||
|
||
- name: Create GitHub Release
|
||
uses: softprops/action-gh-release@v1
|
||
with:
|
||
tag_name: v${{ inputs.version }}
|
||
name: Release v${{ inputs.version }}
|
||
body: |
|
||
## 🚀 Release v${{ inputs.version }}
|
||
|
||
### What's Changed
|
||
See the [full changelog](https://github.com/${{ github.repository }}/compare/...v${{ inputs.version }})
|
||
|
||
### Installation
|
||
```bash
|
||
pip install leann==${{ inputs.version }}
|
||
```
|
||
|
||
### Test Installation (if using TestPyPI)
|
||
```bash
|
||
pip install -i https://test.pypi.org/simple/ leann==${{ inputs.version }}
|
||
```
|
||
draft: false
|
||
prerelease: false
|
||
env:
|
||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
|
||
- name: Trigger PyPI publish
|
||
run: |
|
||
echo "🚀 Triggering PyPI publish workflow..."
|
||
# The existing build-and-publish.yml will be triggered by the tag push
|
||
echo "✅ Release process completed! The publish workflow will run automatically." |