diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..b3c3d3f --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,153 @@ +name: ci +on: + # Trigger the workflow on push to master or develop, except tag creation + push: + branches: + - 'main' + - 'develop' + # Trigger the workflow on pull request + pull_request: ~ + # Trigger the workflow manually + workflow_dispatch: ~ + # Trigger after public PR approved for CI + pull_request_target: + types: [labeled] + release: + types: [created] +jobs: + qa: + name: qa + runs-on: ubuntu-20.04 + steps: + - name: Checkout Repository + uses: actions/checkout@v3 + with: + repository: ${{ inputs.repository }} + ref: ${{ inputs.ref }} + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: ${{ inputs.python_version }} + + - name: Install Python Dependencies + run: | + python -m pip install --upgrade pip + python -m pip install black flake8 isort + - name: Check isort + run: isort --check . + + - name: Check black + run: black --check . + + - name: Check flake8 + run: flake8 . + setup: + name: setup + runs-on: ubuntu-20.04 + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + inputs: ${{ steps.prepare-inputs.outputs.inputs }} + inputs-for-ubuntu: ${{ steps.prepare-inputs.outputs.inputs-for-ubuntu }} + steps: + - name: Set Matrix + id: set-matrix + shell: bash -eux {0} + run: | + MATRIX=$(cat << 'EOS' + name: + - gnu-11@ubuntu-22.04 + - clang-14@ubuntu-22.04 + include: + - name: gnu-11@ubuntu-22.04 + os: ubuntu-22.04 + compiler: gnu-11 + compiler_cc: gcc-11 + compiler_cxx: g++-11 + compiler_fc: gfortran-11 + - name: clang-14@ubuntu-22.04 + os: ubuntu-22.04 + compiler: clang-14 + compiler_cc: clang-14 + compiler_cxx: clang++-14 + compiler_fc: gfortran-11 + # Xcode compiler requires empty environment variables, so we pass null (~) here + EOS + ) + SKIP_MATRIX_JOBS=$(cat << 'EOS' + ${{ inputs.skip_matrix_jobs }} + EOS + ) + SELECT_NAME_COND="1 != 1" + SELECT_INCLUDE_COND="1 != 1" + for skip_job in $SKIP_MATRIX_JOBS; do SELECT_NAME_COND="$SELECT_NAME_COND or . == \"$skip_job\""; SELECT_INCLUDE_COND="$SELECT_INCLUDE_COND or .name == \"$skip_job\""; done + echo matrix=$(echo "$MATRIX" | yq eval "del(.name[] | select($SELECT_NAME_COND)) | del(.include[] | select($SELECT_INCLUDE_COND))" --output-format json --indent 0 -) >> $GITHUB_OUTPUT + - name: Prepare build-package Inputs + id: prepare-inputs + shell: bash -eux {0} + run: | + echo inputs=$(echo "${{ inputs.build_package_inputs || '{}' }}" | yq eval '.' --output-format json --indent 0 -) >> $GITHUB_OUTPUT + echo inputs-for-ubuntu=$(echo "${{ inputs.build_package_inputs || '{}' }}" | yq eval '. * {"os":"ubuntu-20.04","compiler":"gnu-10","compiler_cc":"gcc-10","compiler_cxx":"g++-10","compiler_fc":"gfortran-10"}' --output-format json --indent 0 -) >> $GITHUB_OUTPUT + test: + name: test + needs: + - qa + - setup + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.setup.outputs.matrix) }} + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: ${{ inputs.python_version }} + + - name: Install Python Dependencies + run: | + python -m pip install --upgrade pip + pip install --upgrade pip setuptools wheel + python -m pip install pytest pytest-cov + python -m pip install -r requirements.txt + python -m pip install -r ./tests/requirements_test.txt + + - name: Verify Source Distribution + shell: bash -eux {0} + run: | + python setup.py sdist + python -m pip install dist/* + - name: Run Tests with Repository Code + env: + LD_LIBRARY_PATH: ${{ steps.install-dependencies.outputs.lib_path }} + shell: bash -eux {0} + run: | + DYLD_LIBRARY_PATH=${{ env.LD_LIBRARY_PATH }} python -m pytest -m "not data" tests --cov=./ --cov-report=xml + python -m coverage report + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + files: coverage.xml + deploy: + needs: test + if: ${{ github.event_name == 'release' }} + name: Upload to Pypi + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: "__token__" + TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} + run: | + python setup.py sdist + twine upload dist/* diff --git a/tests/requirements.txt b/tests/requirements_test.txt similarity index 100% rename from tests/requirements.txt rename to tests/requirements_test.txt