diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..4af059f --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,84 @@ +name: Cache Build + +on: + workflow_call: + inputs: + command: + required: true + type: string + name: + required: true + type: string + +jobs: + reusable-build: + name: ${{ inputs.name }} + runs-on: ubuntu-latest + steps: + + #------------------------------------------------ + # check-out repo and set-up python + #------------------------------------------------ + - name: Check out repository + uses: actions/checkout@v4 + - name: Set up python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + #------------------------------------------------ + # ----- install & configure poetry ----- + #------------------------------------------------ + - name: Load cached Poetry installation + id: cached-poetry + uses: actions/cache@v4 + with: + path: ~/.local # the path depends on the OS + key: poetry-0 # increment to reset cache + + - name: Install Poetry + if: steps.cached-poetry.outputs.cache-hit != 'true' + uses: snok/install-poetry@v1 + with: + version: latest + virtualenvs-create: true + virtualenvs-in-project: true + virtualenvs-path: .venv + installer-parallel: true + + # If cache was loaded, we must redo configuration + - name: Configure poetry + if: steps.cached-poetry.outputs.cache-hit == 'true' + run: | + poetry config virtualenvs.create true + poetry config virtualenvs.in-project true + poetry config virtualenvs.path .venv + + #------------------------------------------------ + # Load cached venv if exists + #------------------------------------------------ + - name: Load cached venv + id: cached-poetry-dependencies + uses: actions/cache@v4 + with: + path: .venv + key: venv-${{ runner.os }}-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('**/poetry.lock') }} + + #------------------------------------------------ + # Install dependencies if cache does not exist + #------------------------------------------------ + - name: Install dependencies + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + run: poetry install --no-interaction --no-root + + #------------------------------------------------ + # Install your root project + #------------------------------------------------ + - name: Install project + run: poetry install --no-interaction + + #------------------------------------------------ + # Run custom command(s) within venv + #------------------------------------------------ + - name: Run commands + run: ${{ inputs.command }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..63e9043 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,71 @@ +name: CI + +on: + pull_request: + push: + branches: [master, staging, dev] + +jobs: + #---------------------------------------------- + # Build Environment + #---------------------------------------------- + build: + name: Build + uses: ./.github/workflows/build.yml + with: + name: Cache + command: | + poetry run python -m pip list + poetry run python --version + poetry --version + poetry run echo "Build successful" + + #---------------------------------------------- + # Run Linters + #---------------------------------------------- + lint-black: + name: Linter + needs: build + uses: ./.github/workflows/build.yml + with: + name: Black + command: poetry run python -m black --check . + lint-isort: + name: Linter + needs: build + uses: ./.github/workflows/build.yml + with: + name: Isort + command: poetry run python -m isort --check-only . + lint-mypy: + name: Linter + needs: build + if: false # This condition ensures the job is never executed + uses: ./.github/workflows/build.yml + with: + name: Mypy + command: poetry run python -m mypy --verbose 0 . + lint-flake8: + name: Linter + needs: build + uses: ./.github/workflows/build.yml + with: + name: Flake8 + command: poetry run python -m flake8 . + + #---------------------------------------------- + # Run Tests + #---------------------------------------------- + test-unittest: + name: Tests + needs: [ + lint-black, + lint-isort, + lint-mypy, + lint-flake8, + ] + if: ${{ always() }} # will run the tests regardless of linting success + uses: ./.github/workflows/build.yml + with: + name: Unittests + command: poetry run pytest tests/