publish #8
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
| # This workflow will upload a Python Package using Twine when a release is created | |
| # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries | |
| # This workflow uses actions that are not certified by GitHub. | |
| # They are provided by a third-party and are governed by | |
| # separate terms of service, privacy policy, and support | |
| # documentation. | |
| name: publish | |
| on: | |
| release: | |
| types: [published] # publish full release to PyPI when a release is created on Github | |
| schedule: | |
| - cron: "0 17 * * FRI" # tag a pre-release on Github every Friday at 5 PM UTC | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| id-token: write | |
| jobs: | |
| tag_pre_release: | |
| if: github.event_name == 'schedule' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Create pre-release tag | |
| run: | | |
| git fetch --tags | |
| latest_tag=$(git tag --list --sort=-v:refname | grep -E '^[0-9]+\.[0-9]+\.[0-9]+(rc[0-9]+)?$' | head -n 1) | |
| if [ -z "$latest_tag" ]; then | |
| echo "Failed to find the latest git tag from list:" > /dev/stderr | |
| git tag --list --sort=-v:refname | |
| exit 1 | |
| else | |
| # Bump the tag rc version | |
| if [[ "$latest_tag" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)(rc([0-9]+))?$ ]]; then | |
| major="${BASH_REMATCH[1]}" | |
| minor="${BASH_REMATCH[2]}" | |
| patch="${BASH_REMATCH[3]}" | |
| rc="${BASH_REMATCH[5]}" | |
| echo "latest_tag: ${major}.${minor}.${patch}rc${rc:-0}" | |
| if [ -z "$rc" ]; then | |
| # No rc, so bump patch and set rc=1 # 0.2.1 -> 0.2.2rc1 | |
| patch=$((patch + 1)) | |
| new_tag="${major}.${minor}.${patch}rc1" | |
| else | |
| if [ "$rc" -ge 99 ]; then | |
| echo "Error: rc version is already at 99 for tag $latest_tag, refusing to increment further." > /dev/stderr | |
| exit 1 | |
| fi | |
| rc=$((rc + 1)) | |
| new_tag="${major}.${minor}.${patch}rc${rc}" # 0.2.1rc1 -> 0.2.1rc2 | |
| fi | |
| else | |
| echo "Error: latest_tag '$latest_tag' does not match expected version pattern." > /dev/stderr | |
| exit 1 | |
| fi | |
| fi | |
| echo "new_tag: $new_tag" | |
| git tag $new_tag | |
| git push origin $new_tag | |
| publish_to_pypi: | |
| if: github.event_name == 'release' || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-latest | |
| env: | |
| IN_DOCKER: 'True' | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| activate-environment: true | |
| - run: uv sync | |
| - run: uv run ruff check --no-fix --select PLE # quick check for syntax errors to avoid waiting time doing the rest of the build | |
| - run: uv build | |
| - name: Detect installed Playwright version | |
| run: echo "PLAYWRIGHT_VERSION=$(uv pip list --format json | jq -r '.[] | select(.name == "playwright") | .version')" >> $GITHUB_ENV | |
| - name: Cache playwright binaries | |
| uses: actions/cache@v3 | |
| with: | |
| path: | | |
| ~/.cache/ms-playwright | |
| key: ${{ runner.os }}-playwright-${{ env.PLAYWRIGHT_VERSION }} | |
| - run: playwright install chrome | |
| - run: playwright install chromium | |
| # TODO: just depend on the other test.yml action for this instead of re-running the tests here | |
| - run: uv run pytest tests/ci # dont push the package to PyPI if the tests fail | |
| # publish to PyPI | |
| - run: uv publish --trusted-publishing always | |
| - name: Push to stable branch (if stable release) | |
| if: github.event_name == 'release' && !contains(github.ref_name, 'rc') | |
| run: | | |
| git checkout -b stable | |
| git push origin -f stable |