Fix ci.yml ignore-paths #3
Workflow file for this run
This file contains 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: release | |
on: | |
push: | |
tags: | |
- 'v[0-9]+.[0-9]+.[0-9]+' | |
- 'v[0-9]+.[0-9]+.[0-9]+a[0-9]+' | |
- 'v[0-9]+.[0-9]+.[0-9]+b[0-9]+' | |
- 'v[0-9]+.[0-9]+.[0-9]+rc[0-9]+' | |
jobs: | |
details: | |
runs-on: ubuntu-latest | |
outputs: | |
tag_version: ${{ steps.release.outputs.tag_version }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Extract tag details | |
id: release | |
run: | | |
if [[ "${{ github.ref_type }}" = "tag" ]]; then | |
TAG_VERSION=${GITHUB_REF#refs/tags/v} | |
echo "tag_version=$TAG_VERSION" >> "$GITHUB_OUTPUT" | |
echo "Tag version is $TAG_VERSION" | |
else | |
echo "No tag found" | |
exit 1 | |
fi | |
check-version: | |
needs: details | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.13' | |
- name: Fetch info from PyPI | |
run: | | |
response=$(curl -s https://pypi.org/pypi/thevenin/json || echo "{}") | |
latest_pypi_version=$(echo "$response" | jq -r '.releases | keys | .[]' | sort -rV | head -n 1) | |
if [[ -z "$latest_pypi_version" ]]; then | |
echo "Package not found on PyPI." | |
latest_pypi_version="0.0.0" | |
fi | |
echo "Latest version on PyPI: $latest_pypi_version" | |
echo "latest_pypi_version=$latest_pypi_version" >> $GITHUB_ENV | |
- name: Compare version against PyPI and exit if not newer | |
run: | | |
TAG_VERSION=${{ needs.details.outputs.tag_version }} | |
PYPI_VERSION=$latest_pypi_version | |
TAG_BASE=${TAG_VERSION%%[a-z]} | |
PYPI_BASE=${PYPI_VERSION%%[a-z]} | |
TAG_SUFFIX=${TAG_VERSION#$TAG_BASE} | |
PYPI_SUFFIX=${PYPI_VERSION#$PYPI_BASE} | |
suffix_count=0 | |
[[ -n "$TAG_SUFFIX" ]] && ((suffix_count++)) | |
[[ -n "$PYPI_SUFFIX" ]] && ((suffix_count++)) | |
if [[ "$TAG_VERSION" == "$PYPI_VERSION" ]]; then | |
echo "The tag $TAG_VERSION matches the PyPI version $PYPI_VERSION." | |
exit 1 | |
elif [[ "$suffix_count" == 1 && "$TAG_BASE" == "$PYPI_BASE" ]]; then | |
if [[ -n "$PYPI_SUFFIX" ]]; then | |
echo "The tag $TAG_VERSION is newer than PyPI $PYPI_VERSION." | |
else | |
echo "The tag $TAG_VERSION is older than PyPI $PYPI_VERSION." | |
exit 1 | |
fi | |
else | |
newest=$(printf "%s\n%s" "$TAG_VERSION" "$PYPI_VERSION" | sort -V | tail -n 1) | |
if [[ "$TAG_VERSION" == "$newest" ]]; then | |
echo "The tag $TAG_VERSION is newer than PyPI $PYPI_VERSION." | |
else | |
echo "The tag $TAG_VERSION is older than PyPI $PYPI_VERSION." | |
exit 1 | |
fi | |
fi | |
- name: Verify tag and pyproject.toml versions match | |
run: | | |
python -m pip install --upgrade pip | |
pip install . | |
PKG_VERSION=$(python -c "import thevenin; print(thevenin.__version__)") | |
TAG_VERSION=${{ needs.details.outputs.tag_version }} | |
if [[ "$PKG_VERSION" != "$TAG_VERSION" ]]; then | |
echo "Version mismatch: setup.py has $PKG_VERSION, but tag is $TAG_VERSION." | |
exit 1 | |
else | |
echo "Package and tag versions match: $PKG_VERSION == $TAG_VERSION." | |
fi | |
build-and-test: | |
name: (build ubuntu-latest, 3.13) | |
needs: [details, check-version] | |
runs-on: ubuntu-latest | |
defaults: | |
run: | |
shell: bash -l {0} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.13' | |
- name: Install build | |
run: pip install build | |
- name: Build distributions | |
run: python -m build | |
- name: Upload | |
uses: actions/upload-artifact@v4 | |
with: | |
name: builds | |
path: dist/* | |
pypi-publish: | |
name: Upload to PyPI | |
needs: build-and-test | |
runs-on: ubuntu-latest | |
steps: | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist/ | |
pattern: builds* | |
merge-multiple: true | |
- name: Check files | |
run: ls dist | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.13' | |
- name: Install twine | |
run: pip install twine | |
- name: Check builds and upload to PyPI | |
env: | |
TWINE_USERNAME: __token__ | |
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} | |
run: | | |
twine check dist/* | |
twine upload dist/* |