How do I setup a GitHub action that runs pytest with pipenv?

Question:

I have a Python project that uses pipenv to run pytest. I want to create a GitHub Action that will run pytest each time I submit a pull request.

I’ve tried using the python-app.yml starter workflow.

name: Python application

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python 3.8
      uses: actions/setup-python@v1
      with:
        python-version: 3.8
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Lint with flake8
      run: |
        pip install flake8
        # stop the build if there are Python syntax errors or undefined names
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
    - name: Test with pytest
      run: |
        pip install pytest
        pytest

But I get the following build failure.

ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'
##[error]Process completed with exit code 1.

I would like to avoid creating a requirements.txt file and simply use pipenv to run pytest.

How do I create a GitHub Action that uses pipenv to run pytest?

Asked By: Ryan Payne

||

Answers:

Install pipenv first and then you can run pytest using pipenv.

name: Python application

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1
      - name: Set up Python 3.8
        uses: actions/setup-python@v1
        with:
          python-version: 3.8
      - name: Install pipenv
        run: pip install pipenv
      - name: Run tests
        run: |
          pipenv install --dev
          pipenv run pytest
Answered By: Ryan Payne

I just wanted to add that I also had an FileNotFoundError when using pipenv and pytest:

when using pipenv run pytest I got include errors on every project file there was (you can look the log up here: https://github.com/johannesgrothe/Smarthome_Bridge/runs/3080772118)
what I needed to to is use pipenv run python -m pytest, everything runs like a charm now (https://github.com/johannesgrothe/Smarthome_Bridge/runs/3098788625). I need a lot of pipenv libraries, so it is definitely using the pipenv python instance.

I believed both commands doing exactly the same, and I have no idea why the first one does not work but the latter does.

Since it cost me a lot of time to figure this out I thought sharing it would benefit others, I hope this is the right place for it.

Answered By: J. Klink

Note: The dschep/install-pipenv-action action listed in a previous answer is archived.

An alternative is palewire/install-python-pipenv-pipfile which installs python and pipenv.

Example using it to run pytest:

name: Project Tests
on:
  push:
    branches: 
      - main
  pull_request:
    branches:
      - main 
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Install Python, pipenv and Pipfile packages
        uses: palewire/install-python-pipenv-pipfile@v2
        with:
          python-version: 3.10.0
      - name: Run tests
        run: |
          pipenv install --dev
          pipenv run pytest

The pipenv install in the above script assumes that pytest is listed under the [dev-packages] section of the project’s Pipfile.

Answered By: Monica Granbois