New deployment #187
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: Test, Build and Deploy | |
on: | |
push: | |
branches: | |
- master | |
pull_request: | |
branches: | |
- master | |
release: | |
types: [ published ] | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
test-code: | |
name: Test Code | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: [ ubuntu-latest, windows-latest, macos-latest ] | |
python-version: [ 3.9, '3.10', '3.11', '3.12' ] | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
- name: Setup Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Get pip cache dir | |
id: pip-cache | |
run: | | |
echo "::set-output name=dir::$(pip cache dir)" | |
- name: pip cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ steps.pip-cache.outputs.dir }} | |
key: ${{ runner.os }}-pip-${{ hashFiles('build-requirements.txt') }} | |
restore-keys: | | |
${{ runner.os }}-pip- | |
- name: Install dependencies | |
if: steps.pip-cache.outputs.cache-hit != 'true' | |
run: | | |
python -m pip install --upgrade pip | |
pip install -r build-requirements.txt | |
- name: Build Extensions | |
run: python setup.py build_ext --inplace | |
- name: Test package | |
run: python -m pytest tests/ | |
- name: Coveralls | |
if: matrix.python-version == '3.10' && matrix.os == 'ubuntu-latest' && startsWith(github.ref, 'refs/tags/') | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
pip install wheel coveralls | |
coveralls --service=github | |
build-src: | |
name: Build SDist (Source) | |
needs: test-code | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
- name: Setup Python 3.10 | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.10' | |
- name: Package source distribution | |
run: | | |
python -m pip install --upgrade pip | |
pip install -r build-requirements.txt | |
python setup.py sdist | |
- name: List items | |
run: | | |
echo "Listing dist directory" | |
ls -R dist | |
- name: Place distribution in artifacts folder | |
uses: actions/upload-artifact@v4 | |
with: | |
name: bdist | |
path: dist/*.tar.gz | |
if-no-files-found: error | |
build-wheel: | |
name: Build wheels | |
needs: test-code | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: [ ubuntu-latest, macos-latest, windows-latest ] | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
- name: Setup Python 3.10 | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.10' | |
- name: Build BDist Package | |
env: | |
# specify python environments. Skip 32-bit builds | |
CIBW_BUILD: cp39-* cp310-* cp311-* cp312-* | |
CIBW_SKIP: "*-win32 *-manylinux_i686 *-musllinux_*" | |
# install dependencies, these are the minimum dependencies for building the wheels | |
CIBW_BEFORE_BUILD: pip install numpy cython scipy | |
CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 | |
run: | | |
python -m pip install --upgrade pip | |
pip install cibuildwheel | |
python -m cibuildwheel --output-dir dist | |
- name: List items | |
run: | | |
echo "Listing dist directory" | |
ls -R dist | |
- name: Place wheels in artifacts folder | |
uses: actions/upload-artifact@v4 | |
with: | |
name: whl-${{ matrix.os }} | |
path: dist/*.whl | |
if-no-files-found: error | |
# the following step ensures that the package is usable after installing the source files/wheels | |
# by running a mock import of copulae | |
install-package: | |
name: Test package installation | |
needs: [ build-src, build-wheel ] | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: [ ubuntu-latest, macos-latest, windows-latest ] | |
python-version: [ 3.9, '3.10', '3.11', '3.12' ] | |
# ext: [ tar.gz, whl ] | |
ext: [ whl ] | |
steps: | |
- name: Setup Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Retrieve packages | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
- name: List items | |
run: | | |
echo "Listing current directory" | |
ls -R | |
- name: Test Package Installation | |
run: | | |
pip install --upgrade pip | |
# finds path to the right wheel or source file to install later | |
if [[ "${{ matrix.ext }}" == "whl" ]]; then | |
os=$(echo ${{ runner.os }} | awk '{print tolower($0)}' | head -c3) | |
version=$(echo ${{ matrix.python-version }} | sed 's/\.//g') | |
filename="copulae-*${version}*${os}*.whl" | |
else | |
# Following packages are needed to install copulae from source | |
pip install numpy wheel cython scipy | |
filename="copulae-*.tar.gz" | |
fi; | |
echo "Looking for file ${filename}" | |
file=$(find dist -name "${filename}" -type f); | |
pip list | |
pip install ${file} | |
# if we can import this, all should be gucci | |
python -c "import copulae" | |
deploy-test: | |
name: Deploy packages to TestPyPI | |
runs-on: ubuntu-latest | |
needs: install-package | |
if: ${{ !startsWith(github.ref, 'refs/tags/') }} | |
steps: | |
- name: Setup Python 3.10 | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.10' | |
- name: Install twine | |
run: pip install twine | |
- name: Checkout utilities | |
uses: actions/checkout@v4 | |
with: | |
sparse-checkout: | | |
.github/utils | |
sparse-checkout-cone-mode: false | |
- name: Retrieve packages | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
- name: Find and copy packages to files/ | |
run: | | |
mkdir files | |
ls -ltR | |
python .github/utils/find.py -from dist -to files -pattern "(.tar.gz|.whl)$" | |
- name: Upload packages to testpypi | |
env: | |
TWINE_USERNAME: ${{ secrets.PYPI_TEST_TOKEN_NAME }} | |
TWINE_PASSWORD: ${{ secrets.PYPI_TEST_API_TOKEN }} | |
run: python -m twine upload --skip-existing --repository testpypi files/* --verbose | |
deploy: | |
name: Deploy packages to PyPI | |
runs-on: ubuntu-latest | |
needs: install-package | |
if: startsWith(github.ref, 'refs/tags/') | |
steps: | |
- name: Setup Python 3.10 | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.10' | |
- name: Install twine | |
run: pip install twine | |
- name: Checkout utilities | |
uses: actions/checkout@v4 | |
with: | |
sparse-checkout: | | |
.github/utils | |
sparse-checkout-cone-mode: false | |
- name: Retrieve packages | |
uses: actions/download-artifact@v4 | |
with: | |
path: dist | |
- name: Find and copy packages to files/ | |
run: | | |
mkdir files | |
ls -ltR | |
python .github/utils/find.py -from dist -to files -pattern "(.tar.gz|.whl)$" | |
- name: Upload packages to pypi | |
env: | |
TWINE_USERNAME: ${{ secrets.PYPI_PROD_TOKEN_NAME }} | |
TWINE_PASSWORD: ${{ secrets.PYPI_PROD_API_TOKEN }} | |
run: python -m twine upload --skip-existing files/* --verbose |