--- a +++ b/.github/workflows/python-ci.yml @@ -0,0 +1,154 @@ +# This GitHub Action workflow will + +# - Format code using Black +# - Build project with all dependencies +# - Check code with flake8 linter +# - Run tests with pytest + + +# ubuntu-latest has 7GB RAM and 14GB SSD. macos-latest has 14GB RAM and 14GB SSD. Using macos assuming more RAM -> faster tests -> less timeouts +# Nonetheless, our tests seem to need >10 GB RAM and >16,7 GB SSD Space. Test refactoring needed. +# https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources + +name: Build and test + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + formatting: + outputs: + new_sha: ${{ steps.sha.outputs.SHA }} + runs-on: macos-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.ref }} # ${{ github.event.pull_request.head.sha }} + + - name: Setup Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: "3.8" + cache: 'pip' + + - name: Setup isort and Black + run: | + python -m pip install --upgrade pip + pip install isort black + + - name: Run isort + run: | + isort --profile black . + + - name: Run Black formatter + run: | + black . + + - name: Commit changes + uses: EndBug/add-and-commit@v8 + with: + message: 'Fix styling' + add: '*.py' + + - name: Get commit hash + id: sha + run: | + sha_new=$(git rev-parse HEAD) + echo $sha_new + echo "::set-output name=SHA::$sha_new" + + + build: + if: always() + needs: formatting + runs-on: macos-latest + + steps: + - name: Checkout to latest changes + uses: actions/checkout@v3 + with: + ref: ${{ needs.formatting.outputs.new_sha }} + fetch-depth: 0 + + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: "3.8" + cache: 'pip' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest pytest-cov pytest-github-actions-annotate-failures + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + pip install -e . + + - name: Install model dependencies + run: | + python src/medigan/execute_model/install_model_dependencies.py + + lint: + needs: build + runs-on: macos-latest + + steps: + - name: Checkout to latest changes + uses: actions/checkout@v3 + with: + ref: ${{ needs.formatting.outputs.new_sha }} + fetch-depth: 0 + + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: "3.8" + cache: 'pip' + + - name: Install cached dependencies + run: | + python -m pip install --upgrade pip + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + pip install flake8 + pip install -e . + + - name: Lint with flake8 + run: | + # stop the build if there are Python syntax errors or undefined names + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --max-line-length=88 --extend-ignore=E203,E501 + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88 --extend-ignore=E203,E501 --statistics + + test: + needs: build + runs-on: macos-latest #windows-latest + + steps: + - name: Checkout to latest changes + uses: actions/checkout@v3 + with: + ref: ${{ needs.formatting.outputs.new_sha }} + fetch-depth: 0 + + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: "3.8" + cache: 'pip' + + - name: Install cached dependencies + run: | + python -m pip install --upgrade pip + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + pip install pytest pytest-cov pytest-github-actions-annotate-failures + pip install -e . + python src/medigan/execute_model/install_model_dependencies.py + # for windows: pip install -r requirements.txt + # for mac/linux: if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + - name: Test with pytest + run: | + pytest tests -W ignore::DeprecationWarning --verbose --failed-first --log-cli-level=INFO #--cov=. --cov-report html #--capture=tee-sys