DEV Community

John Ajera
John Ajera

Posted on

How to Configure GitHub Actions CI for Python Using Poetry on Multiple Versions

How to Configure GitHub Actions CI for Python Using Poetry on Multiple Versions 🚀

Learn how to set up a robust GitHub Actions CI pipeline for your Python project using Poetry, testing across multiple Python versions to ensure compatibility and reliability.

Continuous Integration (CI) is a critical part of any modern software development workflow. If you’re managing dependencies and environments with Poetry, this guide will help you configure a robust GitHub Actions CI pipeline for your Python project across multiple Python versions. For a practical example, you can refer to the actual code in this GitHub repository: jdevto/python-poetry-hello. 🎉


Why Poetry for Python Projects? 🐍

Poetry simplifies Python dependency management and packaging. It provides:

  • A clear pyproject.toml file for dependencies and project metadata.
  • A virtual environment management system.
  • Commands to build, publish, and manage dependencies.

Configuring GitHub Actions for Python Using Poetry on Multiple Versions

Below is a complete GitHub Actions workflow configuration to automate your CI pipeline with Poetry across Python versions 3.9 to 3.13. This example includes three types of triggers: on push to the main branch, on pull requests, and on a scheduled daily cron job. You can adjust these triggers to suit your own requirements.

name: ci on: push: branches: - main pull_request: schedule: - cron: 0 12 * * * workflow_dispatch: jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ['3.9', '3.10', '3.11', '3.12', '3.13'] fail-fast: false steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install Poetry run: | curl -sSL https://install.python-poetry.org | python3 - echo "PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV - name: Install dependencies with Poetry run: | cd hello-world poetry install --with dev - name: Set PYTHONPATH to include the source directory run: echo "PYTHONPATH=$PWD/hello-world" >> $GITHUB_ENV - name: Run tests run: | cd hello-world poetry run pytest --cov=hello-world --cov-report=term-missing 
Enter fullscreen mode Exit fullscreen mode

Key Steps in the Workflow

1. Checkout Code

The actions/checkout@v4 action fetches your code from the repository so it can be used in subsequent steps.

2. Set Up Python

The actions/setup-python@v4 action installs the specified Python versions using a matrix strategy, enabling tests to run on multiple Python versions.

3. Install Poetry

The script installs the latest version of Poetry using its official installation method and ensures it’s added to the PATH.

4. Install Dependencies

poetry install --with dev installs all the project’s dependencies, including development dependencies.

5. Set PYTHONPATH

The PYTHONPATH environment variable is configured to include the src directory, enabling proper module imports during testing.

6. Run Tests

poetry run pytest runs the tests defined in your project, with coverage reporting enabled via --cov=src --cov-report=term-missing.


Enhancements

1. Add Caching for Dependencies

To speed up your workflow, you can cache Poetry dependencies:

 - name: Cache Poetry dependencies uses: actions/cache@v4 with: path: ~/.cache/pypoetry key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} restore-keys: | ${{ runner.os }}-poetry- 
Enter fullscreen mode Exit fullscreen mode

Add this step before installing dependencies to skip re-installing dependencies if nothing has changed.


Conclusion

By configuring this GitHub Actions workflow, you can automate testing across multiple Python versions and ensure that your Python project using Poetry is always in top shape. This setup includes steps to install dependencies, run tests, and even cache dependencies for faster builds. 🚀

If you have any questions or suggestions, feel free to share! 🙌 For more inspiration and a working example, visit the GitHub repository: jdevto/python-poetry-hello.

Top comments (0)