name: release run-name: Release on push to main # Builds a wheel + sdist and publishes a Gitea release v on every push to # main. The version comes from pyproject.toml (kept in lockstep with __version__, D19); # if a release for that tag already exists, the job is a no-op — so bump the version # (and CHANGELOG) to cut a new release. on: push: branches: [main] jobs: release: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.12" - name: Build wheel + sdist run: | python -m pip install --upgrade build python -m build - name: Build self-extracting installer (.run) run: | (apt-get update && apt-get install -y makeself && sh packaging/make-run.sh) \ || echo "makeself unavailable — skipping .run" - name: Read version id: ver run: | V=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])") echo "version=$V" >> "$GITHUB_OUTPUT" - name: Publish Gitea release env: TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | set -euo pipefail API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}" TAG="v${{ steps.ver.outputs.version }}" code=$(curl -sS -o /tmp/existing.json -w '%{http_code}' \ -H "Authorization: token ${TOKEN}" "${API}/releases/tags/${TAG}") if [ "$code" = "200" ]; then echo "Release ${TAG} already exists — nothing to do." exit 0 fi echo "Creating release ${TAG}…" rid=$(curl -sS -X POST \ -H "Authorization: token ${TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"${TAG}\",\"target_commitish\":\"${{ github.sha }}\",\"name\":\"${TAG}\",\"body\":\"Automated release for ${TAG}. See CHANGELOG.md.\"}" \ "${API}/releases" | python -c "import sys, json; print(json.load(sys.stdin)['id'])") for f in dist/*; do echo "Uploading $(basename "$f")…" curl -sS -X POST \ -H "Authorization: token ${TOKEN}" \ -F "attachment=@${f}" \ "${API}/releases/${rid}/assets?name=$(basename "$f")" >/dev/null done echo "Published ${TAG}."