fix(etl): fiabilise airflow-init, borne les DAGs ML et ajoute la CI Airflow
Airflow / Lint et intégrité des DAGs (push) Successful in 1m10s
Airflow / Construction de l'image (push) Successful in 1m47s

This commit is contained in:
Dorian
2026-09-21 11:18:02 +02:00
parent 6f6f451eb4
commit 901ceffd72
10 changed files with 205 additions and 40 deletions
+11 -3
View File
@@ -8,7 +8,7 @@ ce DAG ne reentraine jamais rien. Si aucun modele n'a encore ete entraine, la ta
from __future__ import annotations
from datetime import datetime
from datetime import datetime, timedelta
from airflow.models.dag import DAG
from airflow.operators.bash import BashOperator
@@ -21,13 +21,21 @@ with DAG(
schedule="@hourly",
start_date=datetime(2026, 1, 1),
catchup=False,
# Deux scorings qui se chevauchent inseraient en meme temps dans `prediction` (pas de contrainte
# d'unicite sur `(site_id, target_at)`, chaque run garde sa ligne).
max_active_runs=1,
tags=["ml"],
) as dag:
# `--frozen --no-dev` : cf. `ml_train.py`, meme raisonnement.
# `--no-sync`, `env -u VIRTUAL_ENV` : cf. `ml_train.py`, meme raisonnement.
BashOperator(
task_id="score",
bash_command=(
"cd /opt/ml && uv run --frozen --no-dev python -m enervision_ml.score "
"cd /opt/ml && env -u VIRTUAL_ENV uv run --no-sync python -m enervision_ml.score "
f"--model {MODEL_PATH}"
),
# Un incident transitoire sur Postgres ne doit pas faire perdre le creneau horaire.
retries=2,
retry_delay=timedelta(minutes=2),
# Bien en dessous du pas horaire : un scoring pendu ne doit pas empieter sur le suivant.
execution_timeout=timedelta(minutes=30),
)