Skip to content

Merge pull request #601 from frenzymadness/packaging #336

Merge pull request #601 from frenzymadness/packaging

Merge pull request #601 from frenzymadness/packaging #336

name: basemap-for-manylinux
env:
PKGDIR: "packages/basemap"
PIP_DEFAULT_TIMEOUT: 10
PIP_DISABLE_PIP_VERSION_CHECK: 1
PIP_PREFER_BINARY: 1
PIP_RETRIES: 0
PYTHONUNBUFFERED: "1"
PYTHONWARNINGS: "ignore:DEPRECATION"
on:
push:
paths:
- ".github/workflows/basemap-for-manylinux.yml"
- "packages/basemap/**"
pull_request:
paths:
- ".github/workflows/basemap-for-manylinux.yml"
- "packages/basemap/**"
workflow_dispatch:
jobs:
checkout:
runs-on: ubuntu-latest
steps:
-
name: Checkout
uses: actions/checkout@v1
-
name: Upload checkout
uses: actions/upload-artifact@v1
with:
name: checkout
path: .
lint:
runs-on: ubuntu-latest
strategy:
matrix:
python-version:
["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
max-parallel: 3
fail-fast: false
needs: checkout
container: "pylegacy/python:${{ matrix.python-version }}-debian-10"
steps:
-
name: Download checkout
uses: actions/download-artifact@v1
with:
name: checkout
path: .
-
name: Install lint requirements
run: |
cd ${{ env.PKGDIR }}
pip install -r requirements-lint.txt
-
name: Install library requirements
run: |
cd ${{ env.PKGDIR }}
pip install -r requirements.txt
-
name: Run Flake8
run: |
cd ${{ env.PKGDIR }}
if [ -x "$(command -v flake8)" ]; then
flake8 src/mpl_toolkits/basemap/cm.py src/mpl_toolkits/basemap/diagnostic.py src/mpl_toolkits/basemap/proj.py src/mpl_toolkits/basemap/solar.py test;
fi
-
name: Run PyLint
run: |
cd ${{ env.PKGDIR }}
if [ -x "$(command -v pylint)" ]; then
pylint src/mpl_toolkits/basemap/cm.py src/mpl_toolkits/basemap/diagnostic.py src/mpl_toolkits/basemap/proj.py src/mpl_toolkits/basemap/solar.py test;
fi
build-geos:
strategy:
matrix:
arch:
["x64", "x86"]
max-parallel: 2
fail-fast: false
needs: lint
runs-on: ubuntu-latest
container: "pylegacy/${{ matrix.arch }}-python:3.8-debian-4"
steps:
-
name: Download checkout
uses: actions/download-artifact@v1
with:
name: checkout
path: .
-
name: Install CMake 3.6.2
run: |
apt-get update
apt-get install -y libidn11
pkgvers=3.6.2
pkgname=cmake
pkgcode=cmake-${pkgvers}
case "${{ matrix.arch }}" in
x86) pkgfile=${pkgcode}-Linux-i386.tar.gz;;
*) pkgfile=${pkgcode}-Linux-x86_64.tar.gz;;
esac
wget https://github.com/Kitware/CMake/releases/download/v${pkgvers}/${pkgfile} -P /tmp
tar -xf /tmp/${pkgfile} --strip-components=1 -C /usr
rm -rf /tmp/${pkgfile}
-
name: Install GCC toolchain
run: |
apt-get update
apt-get install -y gcc g++ make
-
name: Build GEOS from source
run: |
cd ${{ env.PKGDIR }}
python -c "import utils; utils.GeosLibrary('3.6.5').build('extern', njobs=16)"
-
name: Upload GEOS artifacts
uses: actions/upload-artifact@v1
with:
name: artifacts-geos-${{ matrix.arch }}
path: ${{ env.PKGDIR }}/extern
build:
strategy:
matrix:
arch:
["x64", "x86"]
python-version:
["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
max-parallel: 3
fail-fast: false
needs: build-geos
runs-on: ubuntu-latest
container: "pylegacy/${{ matrix.arch }}-python:${{ matrix.python-version }}-debian-4"
steps:
-
name: Download checkout
uses: actions/download-artifact@v1
with:
name: checkout
path: .
-
name: Download GEOS artifacts
uses: actions/download-artifact@v1
with:
name: artifacts-geos-${{ matrix.arch }}
path: ${{ env.PKGDIR }}/extern
-
name: Install GCC toolchain
run: |
apt-get update
apt-get install -y gcc g++ make
-
name: Build old numpy from source
run: |
case "${{ matrix.arch }}" in
x64) arch="x86_64" ;;
x86) arch="i686" ;;
esac
case "${{ matrix.python-version }}" in
2.6|3.[23]) pkgvers=1.11.3; tag=manylinux1 ;;
2.7|3.[456789]) pkgvers=1.16.6; tag=manylinux1 ;;
3.10) pkgvers=1.21.4; tag=manylinux1 ;;
3.11) pkgvers=1.23.3; tag=manylinux_2_17 ;;
*) pkgvers=1.26.1; tag=manylinux_2_28 ;;
esac
case "${{ matrix.python-version }}" in
3.11|3.12)
# Dirty solution to get NumPy headers for Python 3.11 and 3.12.
kwds="--plat=${tag}_${arch}"
pip download --no-deps ${kwds} "numpy==${pkgvers}"
oldpkgfile=$(ls *.whl | head -n1)
newpkgfile=$(echo "${oldpkgfile}" | sed "s/${tag}/linux/")
mv "${oldpkgfile}" "${newpkgfile}"
pip install "${newpkgfile}"
rm "${newpkgfile}"
;;
*)
pip install "numpy == ${pkgvers}"
;;
esac
-
name: Build wheel
run: |
sitepkgdir=$(pip show numpy 2>/dev/null | grep Location: | cut -d' ' -f2)
export GEOS_DIR="${GITHUB_WORKSPACE}/${{ env.PKGDIR }}/extern"
export NUMPY_INCLUDE_PATH=${sitepkgdir}/numpy/core/include
case "${{ matrix.python-version }}" in
3.11|3.12)
kwds="--no-build-isolation"
pip install setuptools wheel "cython >= 0.29, < 3.1"
;;
esac
cd ${{ env.PKGDIR }}
python setup.py sdist
pip wheel -w dist --no-deps ${kwds} dist/*.zip
-
name: Upload build artifacts
uses: actions/upload-artifact@v1
with:
name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }}
path: ${{ env.PKGDIR }}/dist
repair:
strategy:
matrix:
arch:
["x64", "x86"]
python-version:
["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
max-parallel: 3
fail-fast: false
needs: build
runs-on: ubuntu-latest
container: "pylegacy/${{ matrix.arch }}-python:3.8-debian-10"
steps:
-
name: Download GEOS artifacts
uses: actions/download-artifact@v1
with:
name: artifacts-geos-${{ matrix.arch }}
path: ${{ env.PKGDIR }}/extern
-
name: Download build artifacts
uses: actions/download-artifact@v1
with:
name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }}
path: ${{ env.PKGDIR }}/dist
-
name: Install auditwheel
run: |
apt-get update
apt-get install -y unzip
pip install patchelf
pip install "auditwheel < 4.0"
-
name: Repair wheel
run: |
cd ${{ env.PKGDIR }}
export LD_LIBRARY_PATH="$(readlink -f extern/lib)"
auditwheel repair -w dist dist/*.whl
-
name: Upload build artifacts
uses: actions/upload-artifact@v1
with:
name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }}
path: ${{ env.PKGDIR }}/dist
test:
strategy:
matrix:
arch:
["x64", "x86"]
python-version:
["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
exclude:
# Missing precompiled binaries for `numpy`, `matplotlib`,
# `pyproj`, `pillow` and `lxml`.
- arch: "x86"
python-version: "3.12"
max-parallel: 3
fail-fast: false
needs: repair
runs-on: ubuntu-latest
container: "pylegacy/${{ matrix.arch }}-python:${{ matrix.python-version }}-debian-10"
steps:
-
name: Download checkout
uses: actions/download-artifact@v1
with:
name: checkout
path: .
-
name: Download build artifacts
uses: actions/download-artifact@v1
with:
name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }}
path: ${{ env.PKGDIR }}/dist
-
name: Install numpy from source
run: |
apt-get update
apt-get install -y gcc g++ make
pip install "numpy < 1.24"
if: matrix.arch == 'x86' && (matrix.python-version >= '3.8' || matrix.python-version >= '3.10')
-
name: Install test requirements
run: |
cd ${{ env.PKGDIR }}
pip install -r requirements-test.txt
-
name: Install package (full)
run: |
whlpath=$(ls ${{ env.PKGDIR }}/dist/*-manylinux1*.whl | head -n1)
pip install "${whlpath}[owslib,pillow]"
-
name: Test package
run: |
cd ${{ env.PKGDIR }}
export COVERAGE_FILE=.coverage.${{ matrix.python-version }}
python -m pytest \
--cov="mpl_toolkits.basemap" --cov-report=term \
--ignore=dist --ignore=build
-
name: Upload test artifacts
uses: actions/upload-artifact@v1
with:
name: artifacts-test
path: ${{ env.PKGDIR }}/.coverage.${{ matrix.python-version }}
coverage:
needs: test
runs-on: ubuntu-latest
container: "pylegacy/python:3.8-debian-10"
steps:
-
name: Checkout
uses: actions/checkout@v1
-
name: Download test artifacts
uses: actions/download-artifact@v1
with:
name: artifacts-test
path: ${{ env.PKGDIR }}
-
name: Install test requirements
run: |
cd ${{ env.PKGDIR }}
pip install -r requirements-test.txt
-
name: Compute combined coverage
run: |
cd ${{ env.PKGDIR }}
coverage combine
coverage html
coverage report
-
name: Upload coverage artifacts
uses: actions/upload-artifact@v1
with:
name: artifacts-coverage
path: ${{ env.PKGDIR }}/htmlcov
docs:
needs: test
runs-on: ubuntu-latest
container: "pylegacy/python:3.8-debian-10"
steps:
-
name: Download checkout
uses: actions/download-artifact@v1
with:
name: checkout
path: .
-
name: Install doc requirements
run: |
cd ${{ env.PKGDIR }}
pip install -r requirements-doc.txt
-
name: Download build artifacts
uses: actions/download-artifact@v1
with:
name: artifacts-build-x64-3.8
path: ${{ env.PKGDIR }}/dist
-
name: Install package
run: |
cd ${{ env.PKGDIR }}
pip install dist/*-manylinux1*.whl
-
name: Run sphinx
run: |
cd ${{ env.PKGDIR }}
python -m sphinx doc/source public
-
name: Upload docs artifacts
uses: actions/upload-artifact@v1
with:
name: artifacts-docs
path: ${{ env.PKGDIR }}/public
-
name: Upload github-pages artifact
uses: actions/upload-pages-artifact@v3
with:
name: github-pages
path: ${{ env.PKGDIR }}/public
pages:
if: startsWith(github.event.ref, 'refs/tags/v')
needs: docs
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
permissions:
pages: write
id-token: write
steps:
- name: Deploy github-pages
uses: actions/deploy-pages@v3
id: deployment
upload:
strategy:
matrix:
arch:
["x64", "x86"]
python-version:
["2.7", "3.5", "3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
max-parallel: 1
if: startsWith(github.event.ref, 'refs/tags/v')
needs: test
runs-on: ubuntu-latest
container: "pylegacy/${{ matrix.arch }}-python:${{ matrix.python-version }}-debian-10"
environment: PyPI
steps:
-
name: Download build artifacts
uses: actions/download-artifact@v1
with:
name: artifacts-build-${{ matrix.arch }}-${{ matrix.python-version }}
path: ${{ env.PKGDIR }}/dist
-
name: Install upload requirements
run: |
pip install twine
-
name: Check distributables
run: |
python -m twine check \
${{ env.PKGDIR }}/dist/*.zip \
${{ env.PKGDIR }}/dist/*-manylinux1*.whl
-
name: Upload distributables
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: "${{ secrets.PYPI_TOKEN }}"
TWINE_REPOSITORY_URL: "${{ secrets.PYPI_REPOSITORY_URL }}"
run: |
python -m twine upload --skip-existing \
${{ env.PKGDIR }}/dist/*.zip \
${{ env.PKGDIR }}/dist/*-manylinux1*.whl