๐Ÿ Python projects now supported on Bitrise

Python is now a first-class project type on Bitrise. The scanner detects your package manager, reads your declared Python version, checks for pytest, and generates a run_tests workflow tailored to your project. No manual config editing needed after scanning.

:puzzle_piece: What problem are we solving

Python projects had no scanner support on Bitrise. Setting up a Python project meant starting from a generic manual config and editing it to match your actual setup: your package manager (pip, Poetry, or uv), your Python version, whether you use pytest, and whether you have a separate dev requirements file. Each of those was a manual step with room for error, and none of it was reflected in the generated config automatically.

:package: What the solution looks like

The scanner identifies Python projects by looking for requirements.txt, pyproject.toml, Pipfile, or setup.py in your repository. Each directory containing one of those files is treated as a separate project.

Package manager is detected from your lock or marker file. A uv.lock means uv, a poetry.lock means Poetry, a requirements.txt means pip. If none of those are present, you select the package manager during setup and a config is generated for each choice.

Python version is read from your version files in priority order: .python-version (pyenv format), .tool-versions (asdf/mise format), and the requires-python field in pyproject.toml. When a version is found, it is set declaratively via a tools: { python: } block in the generated bitrise.yml, with no explicit install step in the workflow. When no version is found, the stackโ€™s default is used.

pytest is detected from pytest.ini, conftest.py, a [tool.pytestโ€ฆ] section in pyproject.toml, or a pytest entry in your requirements files. A test step is included only when pytest is found.

Dev requirements are detected automatically for pip projects. If a requirements-dev.txt or requirements-test.txt file is present, it is installed alongside requirements.txt.

Poetry projects get smart --no-root handling. The scanner reads your pyproject.toml to determine whether your project has an installable root package and only adds --no-root when it is needed, avoiding install failures for projects that donโ€™t ship a package.

Framework detection (Django, Flask, FastAPI) is also performed but is informational only and does not currently affect the generated workflow.

:guide_dog: How to use it

When you add a new Python project to Bitrise, select Python as the project type and run the scanner. It will detect your setup automatically.

To get the most accurate config:

  • Python version: pin it in .python-version, .tool-versions, or the requires-python field in pyproject.toml
  • Package manager: commit your lock file (uv.lock or poetry.lock) so the scanner can detect it without prompting
  • Tests: ensure pytest is configured in your project if you want a test step included