Feat/210 #161
Workflow file for this run
This file contains hidden or 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: Build | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - develop/* | |
| pull_request: | |
| branches: | |
| - master | |
| release: | |
| types: [ published ] | |
| concurrency: | |
| cancel-in-progress: false | |
| # This creates different concurrency groups depending on the trigger | |
| # For PRs: uses the PR number (e.g., "build-pr-123") | |
| # For branch pushes: uses the branch name (e.g., "build-develop/feature-x") | |
| # For releases: uses the release tag plus a unique run ID so each release runs independently | |
| # For manual dispatches: uses a unique run ID so each dispatch runs independently | |
| group: ${{ github.event_name == 'pull_request' && format('build-pr-{0}', github.event.pull_request.number) || github.event_name == 'push' && format('build-{0}', github.ref) || github.event_name == 'release' && format('build-release-{0}-{1}', github.event.release.tag_name, github.run_id) || format('build-dispatch-{0}', github.run_id) }} | |
| defaults: | |
| run: | |
| shell: bash | |
| jobs: | |
| build_wheels_windows: | |
| name: Build wheels on Windows | |
| runs-on: windows-latest | |
| strategy: | |
| fail-fast: False | |
| matrix: | |
| python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| - name: Setup Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Build wheels | |
| run: | | |
| python -m pip install -U pip numpy swig wheel setuptools | |
| python setup.py bdist_wheel -d dist | |
| ls -al ./dist | |
| - name: Place wheels in artifacts folder | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: windows-${{ matrix.python-version }} | |
| path: ./dist/*.whl | |
| build_wheels_unix: | |
| name: Build wheels on ${{ matrix.os }} | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: False | |
| matrix: | |
| os: [ ubuntu-latest, macos-latest, macos-14 ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| - name: Setup Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: '3.11' | |
| - name: Build wheels | |
| env: | |
| # only build CPython-3.9+ and skip 32-bit builds | |
| CIBW_BUILD: cp39-* cp310-* cp311-* cp312-* cp313-* | |
| CIBW_SKIP: "*-manylinux_i686 *-musllinux*" | |
| # use latest build | |
| CIBW_MANYLINUX_X86_64_IMAGE: quay.io/pypa/manylinux2014_x86_64 | |
| CIBW_BEFORE_ALL_MACOS: brew install swig | |
| CIBW_BEFORE_BUILD: pip install numpy swig | |
| run: | | |
| python -m pip install -U pip cibuildwheel | |
| python -m cibuildwheel --output-dir dist | |
| ls -R dist | |
| - name: Place wheels in artifacts folder | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.os }} | |
| path: ./dist/*.whl | |
| test-wheels: | |
| name: Test wheels | |
| needs: [ build_wheels_windows, build_wheels_unix ] | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| os: [ windows-latest, ubuntu-latest, macos-latest, macos-14 ] | |
| python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| - name: Setup Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Retrieve packages | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: dist | |
| - name: List items | |
| run: | | |
| ls -alR dist | |
| - name: Test Package Installation | |
| run: | | |
| python -m pip install --upgrade pip | |
| # list all files in the dist folder | |
| ls -R dist | |
| # finds path to the right wheel or source file to install later | |
| os=$(echo ${{ runner.os }} | awk '{print tolower($0)}' | head -c3) | |
| # version refers to the python version. So 3.8 -> 38 | |
| version=$(echo ${{ matrix.python-version }} | sed 's/\.//g') | |
| if [[ "${{ matrix.os }}" == "windows-latest" ]]; then | |
| chunk="windows-*" | |
| else | |
| chunk="${{matrix.os}}" | |
| fi | |
| echo "Runner OS: ${{ runner.os }}" | |
| echo "os : ${os}" | |
| echo "version : ${version}" | |
| echo "chunk : ${chunk}" | |
| # this finds files like | |
| # nlopt-2.6.2-cp36-cp36m-win_amd64.whl | |
| # nlopt-2.6.2-cp36-cp36m-manylinux10_amd64.whl | |
| # nlopt-2.7.1-cp310-cp310-win_amd64.whl | |
| file=$(find dist/${chunk} -name "nlopt-*${version}*${os}*.whl" -type f); | |
| echo "Installing file: ${file}" | |
| pip install ${file} | |
| python extern/nlopt/test/t_python.py | |
| deploy: | |
| name: Deploy packages | |
| runs-on: ubuntu-latest | |
| needs: test-wheels | |
| permissions: | |
| id-token: write | |
| contents: read | |
| steps: | |
| - name: Setup Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Retrieve packages | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: dist | |
| - name: Install twine | |
| run: | | |
| pip install twine | |
| pip install -U packaging | |
| - name: Move files to top level directory | |
| run: | | |
| ls -ltR dist | |
| python - << EOF | |
| from pathlib import Path | |
| import shutil | |
| d = Path('dist') | |
| for f in d.rglob('*.whl'): | |
| shutil.move(f, d / f.name) | |
| for f in d.iterdir(): | |
| if f.is_dir(): | |
| shutil.rmtree(f) | |
| EOF | |
| - name: Upload packages to testpypi | |
| if: ${{ !startsWith(github.ref, 'refs/tags/') }} | |
| run: python -m twine upload --skip-existing --repository testpypi dist/* --verbose | |
| - name: Upload packages to pypi | |
| if: startsWith(github.ref, 'refs/tags/') | |
| run: python -m twine upload --skip-existing dist/* --verbose |