Day 3: CI for farmworld, a Python package - a failed attempt
Tags: python, opensource, testing, programming
Published: 2022-12-03 09:02:00

---
title: Day 3: CI for farmworld, a Python package - a failed attempt
published: true
description: Sometimes it does not work
tags: python, opensource, testing, programming 
# cover_image: https://direct_url_to_image.jpg
# Use a ratio of 100:42 for best results.
published_at: 2022-12-03 09:02 +0000
canonical_url: https://code-maven.com/ci-for-farmworld-python
series: ci-2022-12
---

[FarmWorld](https://github.com/tomgrek/farmworld) is a reinforcement learning library for agriculture written in Python.

This package had instruction in the `README` file on how to install and how to release.

It came with a `Makefile` which is a bit strange as there are python-based tools that could do the same job, but that makefile did not have a "test" target either.

I tried to follow the instruction in the `README` file.

On Python 3.11 the installation failed with

```
Unable to find installation candidates for ale-py (0.7.4)
```

I reported it: [Dependencies are missing on python 3.11](https://github.com/tomgrek/farmworld/issues/1)

On Python 3.10 the installation worked, but the tests failed with

```
pytest: command not found
```
Fair enough. There is no `pytest` installed.

At this point, however, I got a bit fed up and thought I should try it locally in a Docker container:

## Trying to run in Docker container

After cloning the repository:

Start the container:

```bash
docker run -it -v$(pwd):/opt --workdir /opt --name farm ubuntu:22.04 bash
```

Install make, python and virtualenv:

```bash
apt-get update
apt-get install -y make
apt-get install -y python3
apt-get install -y python3.10-venv
```

Just to make sure we have a good version of Python I also ran `python3 --version` and the response was `Python 3.10.6`.
So it is fine.

I tried to run `make venv` but that relies on the command `python` being available. However in Linux the package is called `python3`. So instead I executed the command manually:

```bash
python3 -m venv .venv
```

I also reported it: [python is called python3 on Linux - Makefile assumes python](https://github.com/tomgrek/farmworld/issues/2)

Then I continued:

```bash
make install
```

Everything installed fine.

Apparently at first looking at the `README` file I missed the instructions on how to run the tests, but I saw two test scripts in the `test/` folder so I installed `pytest` and then tried to run the tests:

```bash
.venv/bin/pip install pytest
PYTHONPATH=. .venv/bin/pytest test/
```

This gave me an error:

```
pygame.error: No available video device
```

At this point I feel I am stuck. I found some instruction on how to add video device to Docker,
but I somehow doubt I'd be able to do this on GitHub Actions.

## Including test-running in the Makefile

Although I don't particularly like the use of Makefile here, but if that's what the author prefers then let's go
all the way and add the test running to it as well.

I sent a [Pull-request](https://github.com/tomgrek/farmworld/pull/3) adding `tests` target to the `Makefile`.


## No available video device

Finally I opened and issue with the [pygame.error: No available video device](https://github.com/tomgrek/farmworld/issues/4) asking if there could be tests that don't require a video device.

## GitHub Actions configuration file

It does not work yet (?), but let me share the configuration file I created so far. It might be useful later on.

```yaml
name: CI

on:
  push:
  pull_request:
  workflow_dispatch:
  #schedule:
  #  - cron: '42 5 * * *'

jobs:
  build:
    runs-on: ubuntu-latest
    name: Build

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'

    - name: Install dependencies
      run: |
        make venv
        make install
        .venv/bin/pip install pytest

    - name: Check Python version
      run: .venv/bin/python -V

    - name: Test with pytest
      env:
        PYTHONPATH: .
      run: .venv/bin/pytest -vs
```

## Conclusion

This time my attempt to add GitHub Actions failed, but I hope I managed to contribute a bit to this project.