Skip to content

ci: tester aussi sur Python 3.14 et corriger un test qui bloque les threads - #288

Merged
traoreera merged 2 commits into
mainfrom
ci/python-3.14-matrix
Oct 2, 2026
Merged

traoreera merged 2 commits into
mainfrom
ci/python-3.14-matrix

Conversation

@traoreera

@traoreera traoreera commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Résumé

Garde requires-python = ">=3.12,<4.0" (pas de breaking change, pas de release) et corrige ce qui empêchait de tester sérieusement sur 3.14. Remplace la PR #287 (plancher Python 3.14), abandonnée au profit de « 3.12 et supérieur ».

Changements

  • CI : 3.14 ajouté à la matrice (3.12, 3.13, 3.14). 3.14 est dans la plage supportée et c'est la version utilisée en développement, mais la matrice ne testait que 3.12 et 3.13.
  • Test corrigé : TestMemoryLimiter.test_apply_positive appelait MemoryLimiter.apply(512) pour de bon dans le process pytest. setrlimit(RLIMIT_AS, 512 Mo) est irréversible (la limite dure baisse) et valable pour toute la session : chaque thread créé ensuite réserve ~72 Mo d'espace d'adressage (pile + arène glibc) et, après 8 threads, RuntimeError: can't start new thread (reproduit en local). Les tests placés plus loin (les TestClient de test_xcore_plugin_routes) échouaient selon l'empreinte mémoire de l'interpréteur : jamais en 3.12/3.13, systématiquement sur le runner en 3.14 (dans Quick Test, avec en plus un abort dans pydantic-core sur un thread de portail). Le test vérifie maintenant l'appel avec resource.setrlimit patché.
  • Garde-fou dans tests/conftest.py : fixture autouse qui fait échouer tout test modifiant RLIMIT_AS / RLIMIT_DATA / RLIMIT_CPU du process pytest.

À savoir

  • Les jobs Tests & Coverage lancent make test-cov STRICT=0 || echo "Tests échoués" sur toutes les branches sauf main : ils sont verts même quand un test échoue. Seul Quick Test (strict) bloque sur une PR. Politique inchangée ici ; vérifier les logs (passed/FAILED) plutôt que la coche.
  • Pas de bump de version ni de tag : aucun code du paquet ne change.

Vérification

Suite complète en local sur 3.14 : 1406 passed, 1 skipped (avec un Redis local comme dans Quick Test).

Summary by Sourcery

Test the project on Python 3.14 and isolate process-wide resource-limit tests to keep the suite reliable.

Bug Fixes:

  • Prevent resource-limit tests from altering the pytest process and causing later thread creation failures.
  • Add coverage for handling resource-limit application failures without raising.

Enhancements:

  • Add an automatic test guard that detects and reports process-wide resource-limit leaks.

CI:

  • Expand the CI Python test matrix to include Python 3.14.

Tests:

  • Update memory limiter tests to mock resource-limit changes and verify the expected calls.

…rt new thread en 3.14)

TestMemoryLimiter.test_apply_positive appelait MemoryLimiter.apply(512) pour de
bon dans le process pytest : setrlimit(RLIMIT_AS, 512 Mo) est irréversible (la
limite dure baisse) et valable pour toute la session. Chaque thread créé ensuite
réserve ~72 Mo d'espace d'adressage (pile + arène glibc) : après 8 threads,
RuntimeError « can't start new thread » — reproduit en local. Les tests placés
plus loin dans la session (TestClient de test_xcore_plugin_routes) échouaient
selon l'empreinte mémoire de l'interpréteur : jamais en 3.12/3.13, systématiquement
sur le runner en 3.14 (Quick Test : « can't start new thread » puis abort dans
pydantic-core sur un thread de portail).

- le test vérifie l'appel (resource.setrlimit patché) au lieu de l'exécuter, plus un
  test du cas d'échec (journalisé, pas levé)
- tests/conftest.py : fixture autouse qui échoue si un test modifie RLIMIT_AS /
  RLIMIT_DATA / RLIMIT_CPU du process pytest
requires-python est >=3.12,<4.0 : 3.14 est dans la plage supportée, et c'est la
version utilisée en développement et pour les smoke tests de release, mais la
matrice CI ne testait que 3.12 et 3.13. Elle couvre maintenant 3.12, 3.13 et 3.14.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @traoreera, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 1 day and 12 hours by commenting @sourcery-ai review. Upgrade to get a review now.

@sourcery-ai

sourcery-ai Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

La PR ajoute Python 3.14 à la matrice CI et sécurise les tests de MemoryLimiter afin qu’ils ne réduisent plus irréversiblement les limites de ressources du processus pytest, avec une fixture de détection des fuites pour prévenir les régressions.

Flow diagram for safe resource-limit testing

flowchart TD
    A[TestMemoryLimiter.test_apply_positive] --> B[resource.setrlimit patched]
    B --> C[MemoryLimiter.apply 512]
    C --> D[Assert resource-limit call]
    D --> E[pytest process limits unchanged]
    E --> F[Later threaded tests remain runnable]
    G[autouse fixture] --> H[Track RLIMIT_AS RLIMIT_DATA RLIMIT_CPU]
    H --> I{Test changed a process limit?}
    I -->|Yes| J[Fail test]
    I -->|No| K[Allow test suite to continue]
Loading

File-Level Changes

Change Details Files
Étend la matrice CI à Python 3.14 sans modifier la plage de versions supportées.
  • Ajoute Python 3.14 aux jobs testés avec 3.12 et 3.13.
  • Conserve requires-python >=3.12,<4.0 et ne change ni le code du paquet ni la version publiée.
.github/workflows/ci.yml
Empêche les tests de modifier durablement les limites de ressources du processus pytest.
  • Ajoute une fixture autouse qui surveille RLIMIT_AS, RLIMIT_DATA et RLIMIT_CPU sur les plateformes non-Windows.
  • Restaure autant que possible la limite souple puis échoue explicitement si un test laisse une modification.
tests/conftest.py
Rend le test de limitation mémoire sans effet de bord tout en conservant la couverture des comportements attendus.
  • Mocke resource.setrlimit pour vérifier l’appel à RLIMIT_AS avec une limite de 512 MiB sans l’appliquer au processus.
  • Ajoute un test vérifiant qu’un échec de setrlimit est absorbé par MemoryLimiter.apply.
tests/unit/kernel/test_isolation.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

@traoreera
traoreera merged commit f03f8f1 into main Oct 2, 2026
25 checks passed
traoreera added a commit that referenced this pull request Oct 2, 2026
…t corrigé (#289)

## Résumé

Release de maintenance **2.7.1, sans changement runtime** : `xcore/` et
les bornes de dépendances de `pyproject.toml` sont identiques à la 2.7.0
(vérifié : `git diff v2.7.0 main -- xcore pyproject.toml` est vide). Le
wheel publié se comporte exactement comme la 2.7.0 ; cette version
embarque le rafraîchissement de sécurité et les correctifs de test/CI
déjà fusionnés dans `main`.

## Contenu (déjà dans `main`)

- **Lock** (#286) : 11 alertes Dependabot fermées (1 critique, 6 hautes,
4 moyennes) — `anyio` 4.14.1 → 4.15.1, `urllib3` 2.7.0 → 2.8.0,
`virtualenv` 21.6.0 → 21.14.3, `mkdocs-material` 9.7.6 → 9.7.7. Concerne
le dev, la CI et les builds qui installent depuis le lock ; `pip install
XCoreRuntime` résout ses propres versions.
- **Alerte CodeQL #29** rejetée comme faux positif (littéral
d'énumération `ExecutionMode.TRUSTED = "trusted"` journalisé), sans
changement de code.
- **Test** (#288) : `test_apply_positive` posait réellement
`RLIMIT_AS=512 Mo` sur le process pytest (irréversible) → `can't start
new thread` en 3.14. Corrigé + garde-fou dans `tests/conftest.py`.
- **CI** (#288) : matrice 3.12 / 3.13 / **3.14**.

## Cette PR

Bump `2.7.0 → 2.7.1` (`pyproject.toml`, `xcore/__version__.py` —
`__version__` et `__version_info__`), entrée `[2.7.1]` dans
`CHANGELOG.md` et `doc/changelog.md`, `CLAUDE.md`.

## Vérification

- Wheel 2.7.1 construit et installé dans un **virtualenv vierge**
(dépendances de base seulement) : `import xcore`, boot zero-config, un
plugin trusted et un plugin sandboxed appelés — OK.
- Le tag `v2.7.1` (donc la publication PyPI) ne sera posé qu'après la
fusion.

## Summary by Sourcery

Release version 2.7.1 with refreshed locked dependencies, safer
resource-limit testing, and Python 3.14 CI coverage.

Bug Fixes:
- Prevent tests from altering process resource limits and causing later
test failures, particularly on Python 3.14.

Enhancements:
- Add Python 3.14 to the CI test matrix.

Build:
- Refresh the dependency lockfile to address 11 Dependabot security
alerts without changing runtime dependency constraints.

Documentation:
- Document the 2.7.1 maintenance release and update the project version
references.

Chores:
- Bump the project version from 2.7.0 to 2.7.1 without changing runtime
behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant