CI/CD #1707
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
# This workflow will install Python dependencies and run tests on | |
# windows and linux systems with a variety of Python versions | |
# For more information see: | |
# https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions | |
name: CI/CD | |
on: | |
push: | |
pull_request: | |
workflow_dispatch: | |
schedule: # only upstream, won't trigger on forks! | |
- cron: '0 0 * * *' # daily | |
jobs: | |
build: | |
strategy: | |
matrix: | |
# as we build C extension for users to download, we want to include as many python versions | |
# and OS versions as possible (especially windows to create .whl packages, | |
# see step "Create wheel and dist package") | |
python-version: ['3.9', '3.10', '3.11', '3.12'] | |
os: ["ubuntu-latest", "windows-latest", "macos-latest"] | |
name: py${{ matrix.python-version }}@${{ matrix.os }} | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
submodules: true | |
fetch-depth: 0 | |
- uses: conda-incubator/setup-miniconda@v3 | |
with: | |
miniconda-version: "latest" | |
auto-update-conda: true | |
python-version: ${{ matrix.python-version }} | |
environment-file: environment.yml | |
activate-environment: pytesmo | |
channel-priority: flexible | |
auto-activate-base: false | |
- name: Print Infos | |
run: | | |
git status | |
conda info -a | |
conda list | |
pip list | |
which pip | |
which python | |
gcc -v | |
- name: Export Environment | |
shell: bash -l {0} | |
run: | | |
mkdir -p artifacts | |
filename=env_py${{ matrix.python-version }}_${{ matrix.os }}.yml | |
conda env export --no-builds | grep -v "prefix" > artifacts/$filename | |
- name: Install package and dependencies | |
shell: bash -l {0} | |
run: | | |
pip install -e .[testing] | |
- name: Run unit tests | |
shell: bash -l {0} | |
run: | | |
pytest | |
- name: Upload Coverage | |
shell: bash -l {0} | |
run: | | |
pip install coveralls && coveralls --service=github-actions | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
COVERALLS_FLAG_NAME: ${{ matrix.python-version }} | |
COVERALLS_PARALLEL: true | |
- name: Build dist and whl packages | |
shell: bash -l {0} | |
run: | | |
# Remove dots from Python version for use with cibuildwheel | |
PY="${{ matrix.python-version }}"; PY="${PY//./}" | |
# Get current OS on cibuildwheel compatible form | |
if [ "${{ runner.os }}" == "Linux" ]; then | |
OS="manylinux" | |
elif [ "${{ runner.os }}" == "macOS" ]; then | |
OS="macosx" | |
elif [ "${{ runner.os }}" == "Windows" ]; then | |
OS="win" | |
fi | |
pip install setuptools_scm twine cibuildwheel | |
python setup.py sdist --dist-dir artifacts/dist_whl | |
export CIBW_BUILD="cp${PY}-${OS}*" | |
cibuildwheel --output-dir artifacts/dist_whl | |
twine check artifacts/dist_whl/* | |
- name: Upload Artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: Artifacts-${{ matrix.python-version }}-${{ matrix.os }} | |
path: artifacts/* | |
wrapup: | |
name: Wrap-Up Builds | |
needs: build | |
runs-on: ubuntu-latest | |
container: python:3-slim | |
steps: | |
# Merge artifacts from multiple builds | |
- name: Merge Uploaded Artifacts | |
uses: actions/upload-artifact/merge@v4 | |
with: | |
name: Artifacts | |
delete-merged: true | |
# Send the coverage reports to Coveralls.io | |
- name: Finish Coverage | |
run: | | |
pip3 install --upgrade coveralls && coveralls --service=github-actions --finish | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
publish: | |
# Upload the dist and whl packages from artifacts to pypi | |
name: Upload to PyPI | |
if: | | |
startsWith(github.ref, 'refs/tags/v') && | |
startsWith(github.repository, 'TUW-GEO') | |
needs: wrapup | |
runs-on: ubuntu-latest | |
steps: | |
- name: Print environment variables | |
run: | | |
echo "GITHUB_REF = $GITHUB_REF" | |
echo "GITHUB_REPOSITORY = $GITHUB_REPOSITORY" | |
- name: Download Artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: Artifacts | |
pattern: Artifacts* | |
merge-multiple: true | |
- name: Display downloaded files | |
run: ls -aR | |
- name: Upload to PyPI | |
uses: pypa/[email protected] | |
with: | |
skip_existing: true | |
verbose: true | |
verify_metadata: true | |
packages_dir: Artifacts/dist_whl/ | |
user: __token__ | |
# token needs to be uploaded to github actions secrets | |
password: ${{ secrets.PYPI_API_TOKEN }} |