Beta Release (Thursday) #18
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Beta Release (Thursday) | |
| on: | |
| schedule: | |
| - cron: '0 2 * * 4' # Thursday at 2 AM UTC | |
| workflow_dispatch: | |
| inputs: | |
| dry_run: | |
| description: 'Dry run (skip PyPI publish)' | |
| required: false | |
| default: 'false' | |
| type: boolean | |
| force_build: | |
| description: 'Force build even if no changes' | |
| required: false | |
| default: 'false' | |
| type: boolean | |
| jobs: | |
| check-changes: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| has_changes: ${{ steps.changes.outputs.has_changes }} | |
| commit_count: ${{ steps.changes.outputs.commit_count }} | |
| last_beta: ${{ steps.changes.outputs.last_beta }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| ref: dev | |
| - name: Check for changes since last beta release | |
| id: changes | |
| run: | | |
| LAST_BETA=$(git tag -l "*b*" --sort=-version:refname | head -n1) | |
| if [ -z "$LAST_BETA" ]; then | |
| echo "No previous beta release found" | |
| COMMIT_COUNT=$(git rev-list --count --since="1 week ago" dev) | |
| else | |
| echo "Last beta release: $LAST_BETA" | |
| COMMIT_COUNT=$(git rev-list --count ${LAST_BETA}..dev) | |
| fi | |
| echo "commit_count=$COMMIT_COUNT" >> $GITHUB_OUTPUT | |
| echo "last_beta=$LAST_BETA" >> $GITHUB_OUTPUT | |
| if [ "$COMMIT_COUNT" -gt 0 ] || [ "${{ github.event.inputs.force_build }}" = "true" ]; then | |
| echo "has_changes=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "has_changes=false" >> $GITHUB_OUTPUT | |
| fi | |
| beta-release: | |
| needs: check-changes | |
| if: needs.check-changes.outputs.has_changes == 'true' | |
| runs-on: ubuntu-latest | |
| outputs: | |
| beta_version: ${{ steps.version.outputs.beta_version }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| ref: dev | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.11' | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install bump2version build twine | |
| pip install -e ".[all,dev]" | |
| - name: Configure git | |
| run: | | |
| git config --local user.email "[email protected]" | |
| git config --local user.name "GitHub Action" | |
| - name: Generate beta version | |
| id: version | |
| run: | | |
| set -e | |
| CURRENT_VERSION=$(python -c "from datafog.__about__ import __version__; print(__version__)") | |
| echo "Current version: $CURRENT_VERSION" | |
| if [[ $CURRENT_VERSION == *"b"* ]]; then | |
| BASE_VERSION=$(echo $CURRENT_VERSION | cut -d'b' -f1) | |
| BETA_NUM=$(echo $CURRENT_VERSION | cut -d'b' -f2) | |
| BETA_VERSION="${BASE_VERSION}b$((BETA_NUM + 1))" | |
| elif [[ $CURRENT_VERSION == *"a"* ]]; then | |
| BASE_VERSION=$(echo $CURRENT_VERSION | cut -d'a' -f1) | |
| BETA_VERSION="${BASE_VERSION}b1" | |
| else | |
| BASE_VERSION=$(python3 -c "import sys; version='$CURRENT_VERSION'; parts=version.split('.'); parts[1]=str(int(parts[1])+1); parts[2]='0'; print('.'.join(parts))") | |
| BETA_VERSION="${BASE_VERSION}b1" | |
| fi | |
| echo "beta_version=$BETA_VERSION" >> $GITHUB_OUTPUT | |
| sed -i "s/__version__ = \".*\"/__version__ = \"$BETA_VERSION\"/" datafog/__about__.py | |
| sed -i "s/version=\".*\"/version=\"$BETA_VERSION\"/" setup.py | |
| - name: Generate changelog | |
| run: | | |
| python scripts/generate_changelog.py --beta --output BETA_CHANGELOG.md | |
| - name: Run tests | |
| run: | | |
| python -m pytest tests/ -v --tb=short | |
| python -m pytest -m integration -v | |
| python -m pytest tests/benchmark_text_service.py -v | |
| - name: Build package | |
| run: | | |
| python -m build | |
| python scripts/check_wheel_size.py | |
| - name: Create GitHub release | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| BETA_VERSION="${{ steps.version.outputs.beta_version }}" | |
| git add datafog/__about__.py setup.py | |
| git commit -m "chore: bump version to $BETA_VERSION for beta release" | |
| git tag -a "v$BETA_VERSION" -m "Beta release $BETA_VERSION" | |
| git push origin "v$BETA_VERSION" | |
| gh release create "v$BETA_VERSION" \ | |
| --title "🚧 Beta Release $BETA_VERSION" \ | |
| --notes-file BETA_CHANGELOG.md \ | |
| --prerelease \ | |
| --target dev \ | |
| dist/* | |
| - name: Publish to PyPI | |
| if: github.event.inputs.dry_run != 'true' | |
| env: | |
| TWINE_USERNAME: __token__ | |
| TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} | |
| run: | | |
| python -m twine upload dist/* --verbose | |
| - name: Dry run summary | |
| if: github.event.inputs.dry_run == 'true' | |
| run: | | |
| echo "🏃 DRY RUN COMPLETE" | |
| echo "Would have published: ${{ steps.version.outputs.beta_version }}" | |
| ls -la dist/ | |
| - name: Cleanup old betas | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| BETA_RELEASES=$(gh release list --limit 30 | grep b | tail -n +6 | cut -f3) | |
| for release in $BETA_RELEASES; do | |
| echo "Deleting $release" | |
| gh release delete "$release" --yes || true | |
| git push --delete origin "$release" || true | |
| done | |
| notify-beta: | |
| needs: [check-changes, beta-release] | |
| if: needs.check-changes.outputs.has_changes == 'true' && success() | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Beta release notification | |
| run: | | |
| echo "🚧 Beta release completed!" | |
| echo "Install: pip install datafog==${{ needs.beta-release.outputs.beta_version }}" | |
| echo "Commits since last beta: ${{ needs.check-changes.outputs.commit_count }}" |