Merge pull request #601 from frenzymadness/packaging #336
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: 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 |