à quoi ça sert ?
PyTaskRunner sert Ă organiser et exĂ©cuter des âtĂąches projetâ rĂ©currentes : build, tests, lint, release, backup, jobs dâops, scripts de maintenance, etc. LâidĂ©e : au lieu dâavoir 25 scripts Ă©parpillĂ©s, tu Ă©cris des fonctions Python annotĂ©es et tu les exĂ©cutes via une commande unique pytask.
- Tu standardises la maniĂšre de lancer les tĂąches (local, CI, serveur)
- Tu factorises dĂ©pendances + ordre dâexĂ©cution (ex :
deploydépend debuildettest) - Tu peux activer
--drypour vérifier sans exécuter - Tu charges automatiquement un
.envpour secrets/config locale (API_KEY, HOST, etc.) - Tu gardes du Python : conditions, boucles, génération de commandes, etc.
Dépendances & Orchestration
DĂ©finis une tĂąche deploy qui dĂ©pend de build et test. PyTaskRunner garantit lâordre.
Shell streaming
sh() exĂ©cute une commande et laisse le stdout/stderr âen liveâ (parfait pour pytest, rsync, docker).
.env intégré
Charge un .env local et expose ctx.env pour tes tùches (sans dépendance python-dotenv).
Comparaison (PyTaskRunner vs scripts dispersés)
| ProblĂšme courant | Sans runner | Avec PyTaskRunner |
|---|---|---|
| Ordre build/test/deploy | docs + âfaut penser Ă âŠâ | deps=["build","test"] (automatique) |
| Secrets & config | env bricolé / export manuel | .env chargé + ctx.env |
| Lisibilité / maintenance | bash + scripts multiples | 1 fichier tasks.py versionnable/testable |
| Dry-run | souvent absent | --dry (validation safe) |
Installation (.whl)
PyTaskRunner est livré en wheel (installation rapide dans ton venv). Une fois installé, tu obtiens la commande pytask.
/static/toolbox/pytaskrunner-0.1.0-py3-none-any.whl
Commande dâinstallation
# venv activé
pip install /chemin/local/pytaskrunner-0.1.0-py3-none-any.whlVérifier que la CLI est disponible
pytask --help
pytask list- vérifie que ton venv est bien activé
- ou lance via
python -m pytaskrunner(option alternative si tu ajoutes un entrypoint plus tard)
Quickstart (5 minutes)
Ătape 1 â CrĂ©e un fichier tasks.py Ă la racine
from pytaskrunner import task, sh
@task(desc="Run unit tests")
def test(ctx):
sh("pytest -q")
@task(desc="Build wheel")
def build(ctx):
sh("python -m build")
@task(desc="Deploy (example)", deps=["build", "test"])
def deploy(ctx):
sh("echo Deploying...")Ătape 2 â Liste les tĂąches
pytask listĂtape 3 â ExĂ©cute une tĂąche simple
pytask run testĂtape 4 â ExĂ©cute une tĂąche avec deps
pytask run deployĂtape 5 â Dry-run pour valider sans exĂ©cuter
pytask run deploy --dryExemples concrets (dev, ops, Django)
1) Tasks âDevâ classiques (lint / tests / format)
from pytaskrunner import task, sh
@task(desc="Format code")
def fmt(ctx):
sh("ruff format .")
@task(desc="Lint")
def lint(ctx):
sh("ruff check .")
@task(desc="Tests", deps=["lint"])
def test(ctx):
sh("pytest -q")2) Wheel + Release local
Centralise build + vérifications + génération artefacts.
@task(desc="Build dist")
def build(ctx):
sh("python -m build")
@task(desc="Check dist")
def check(ctx):
sh("python -m pip install -U twine")
sh("twine check dist/*")
@task(desc="Release local", deps=["build", "check"])
def release(ctx):
sh("ls -lh dist")3) Django : migrations / collectstatic / runserver
@task(desc="Django migrate")
def migrate(ctx):
sh("python manage.py migrate")
@task(desc="Collect static")
def collectstatic(ctx):
sh("python manage.py collectstatic --noinput")
@task(desc="Run dev server", deps=["migrate"])
def run(ctx):
sh("python manage.py runserver 0.0.0.0:8000")4) Ops : backup PostgreSQL (env via .env)
Exemple : dans .env : PGHOST, PGUSER, PGDATABASE, BACKUP_DIR.
@task(desc="Backup Postgres")
def pg_backup(ctx):
host = ctx.env.get("PGHOST","localhost")
user = ctx.env.get("PGUSER","postgres")
db = ctx.env.get("PGDATABASE","app")
out = ctx.env.get("BACKUP_DIR","./backups")
sh(f"mkdir -p {out}")
sh(f"pg_dump -h {host} -U {user} {db} | gzip > {out}/{db}.sql.gz")sh() stream le stdout/stderr. Pour des secrets, privilĂ©gie env plutĂŽt que lâinline.5) TĂ©lĂ©charger/Sync artefacts (rsync)
@task(desc="Sync dist to server", deps=["build"])
def sync(ctx):
host = ctx.env.get("DEPLOY_HOST","myserver")
sh(f"rsync -av dist/ {host}:/srv/releases/")6) Exemple de sortie attendue (logs)
# pytask run deploy
[12:01:03] INFO Running task: build â Build wheel
... build output ...
[12:01:07] OK Done: build (4.12s)
[12:01:07] INFO Running task: test â Run unit tests
... pytest output ...
[12:01:15] OK Done: test (7.88s)
[12:01:15] INFO Running task: deploy â Deploy (example)
Deploying...
[12:01:15] OK Done: deploy (0.12s)Avancé (deps, jobs, patterns, piÚges)
Dépendances : rÚgles & erreurs
PyTaskRunner calcule un ordre via tri topologique. En cas de cycle (A dĂ©pend de B et B dĂ©pend de A), lâexĂ©cution Ă©choue volontairement.
- Task inconnue dans deps â âUnknown taskâ
- Cycle de dĂ©pendances â âCycle detectedâ
- Commande shell rc!=0 â stop (fail-fast) + code retour non zĂ©ro
Jobs parallĂšles (-j) best-effort
Si plusieurs dĂ©pendances sont indĂ©pendantes, PyTaskRunner peut les lancer en parallĂšle. Attention : si deux tĂąches touchent les mĂȘmes fichiers, tu peux crĂ©er des race conditions.
pytask run deploy -j 4Pattern recommandé : tùches petites + composables
| Pattern | Pourquoi |
|---|---|
tùches courtes (lint, test, build) | plus faciles à réutiliser comme deps (ex: deploy dépend de build+test) |
tĂąches âmetaâ (ci, release) | juste des deps, pas de logique compliquĂ©e |
utiliser .env pour config locale | évite hardcode, simplifie usage multi-env |
Trucs utiles Ă ajouter en V2 (si tu veux)
- Arguments de task :
pytask run backup -- --full(pass-through args) - Hooks :
pre=["lint"]/post=["report"] - Capture output optionnelle (pour logs structurés)
- Affichage âplanâ dâexĂ©cution (graph deps)
