GitHub Actions CI for the pcr_optimizer Python package
Today I was quite busy and first worked on some other project that I hope will be done in a few days, but I also managed to add CI to a relatively simple Python package called pcr_optimizer
When I first added GitHub Actions it failed to install the dependencies listed in the requirements.txt file with a nasty error:
Collecting logging Downloading logging-0.4.9.6.tar.gz (96 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 96.0/96.0 kB 33.1 MB/s eta 0:00:00 Preparing metadata (setup.py): started Preparing metadata (setup.py): finished with status 'error' error: subprocess-exited-with-error × python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [27 lines of output] Traceback (most recent call last): File "<string>", line 2, in <module> File "<pip-setuptools-caller>", line 14, in <module> File "/opt/hostedtoolcache/Python/3.9.15/x64/lib/python3.9/site-packages/setuptools/__init__.py", line 18, in <module> from setuptools.dist import Distribution File "/opt/hostedtoolcache/Python/3.9.15/x64/lib/python3.9/site-packages/setuptools/dist.py", line 32, in <module> from setuptools.extern.more_itertools import unique_everseen File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 666, in _load_unlocked File "<frozen importlib._bootstrap>", line 565, in module_from_spec File "/opt/hostedtoolcache/Python/3.9.15/x64/lib/python3.9/site-packages/setuptools/extern/__init__.py", line 52, in create_module return self.load_module(spec.name) File "/opt/hostedtoolcache/Python/3.9.15/x64/lib/python3.9/site-packages/setuptools/extern/__init__.py", line 37, in load_module __import__(extant) File "/opt/hostedtoolcache/Python/3.9.15/x64/lib/python3.9/site-packages/setuptools/_vendor/more_itertools/__init__.py", line 1, in <module> from .more import * # noqa File "/opt/hostedtoolcache/Python/3.9.15/x64/lib/python3.9/site-packages/setuptools/_vendor/more_itertools/more.py", line 5, in <module> from concurrent.futures import ThreadPoolExecutor File "/opt/hostedtoolcache/Python/3.9.15/x64/lib/python3.9/concurrent/futures/__init__.py", line 8, in <module> from concurrent.futures._base import (FIRST_COMPLETED, File "/opt/hostedtoolcache/Python/3.9.15/x64/lib/python3.9/concurrent/futures/_base.py", line 7, in <module> import logging File "/tmp/pip-install-aq23csim/logging_1a1a3bc0ef754163a6f124b9848cdcfe/logging/__init__.py", line 618 raise NotImplementedError, 'emit must be implemented '\ ^ SyntaxError: invalid syntax [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed × Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details. Error: Process completed with exit code 1.
I recalled seeing this already, but I was not sure where. It looked like a Python 2 vs. Python 3 issue and started to scratch my head.
Then I noticed it is trying to install the logging module which comes with Python. There is no need to install. Maybe it was not coming with early versions of Python 2 ? I don't know. I think it was part of Python since I am using Python.
Anyway, I removed logging from the requirements.txt file.
I also had to set the PYTHONPATH environment variable to let the tests find the module.
Finally, I noticed that __pycache__ was generated while I ran the tests on my computer. So I added it to the .gitignore file to make sure this folder is not added to github by mistake.
That's it. The tests passed and I sent the Pull-Request.
Here is the configuration file:
examples/pcr_optimizer/ci.yml
name: CI on: push: pull_request: workflow_dispatch: schedule: - cron: '42 5 * * *' jobs: test: strategy: fail-fast: false matrix: runner: [ubuntu-latest, macos-latest, windows-latest] python-version: ["3.9", "3.10", "3.11"] runs-on: ${{matrix.runner}} name: OS ${{matrix.runner}} Python ${{matrix.python-version}} steps: - name: Checkout uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: pip install -r requirements.txt - name: Check Python version run: python -V - name: Test env: PYTHONPATH: . run: python Tests/test_pcrprotocoloptimizer.py
Conclusion
Sometimes you need to make slight changes for the CI to start working.
Published on 2022-12-06