4 pattern di GitHub Actions per ETL in un monorepo
Gestire tre siti da un unico monorepo crea problemi. Ti ritrovi con tre job ETL separati, tre ricostruzioni di contenuti e tre pipeline di deployment. Se non li coordini, vanno in conflitto.
Ho trascorso sei settimane a testare le pianificazioni per stabilizzare questa configurazione. Ecco i quattro pattern che utilizzo.
- Usa gli offset temporali per i job Cron
Eseguire tutti i job ETL contemporaneamente causa fallimenti. I job competono per i limiti di velocità (rate limits) delle API. Quando HuggingFace o GitHub restituiscono un errore 429, l'esecuzione fallisce.
Uso offset di 30 minuti per evitare questo problema.
- Il primo job inizia alle 02:00
- Il secondo job inizia alle 02:30
- Il terzo job inizia alle 03:00
Trenta minuti sono sufficienti per completare una pull pesante prima dell'inizio del job successivo. Questo mantiene i log puliti ed evita collisioni con le API.
- Usa i flag di skip per interrompere le ricostruzioni non necessarie
Ogni job ETL termina con un deployment su Vercel. Un problema sorge quando i commit degli articoli attivano anche le ricostruzioni. Senza un piano, ogni aggiornamento di un articolo costringe tutti e tre i siti a ricostruirsi. Questo spreca minuti di build.
Uso un tag [skip publish-articles] nei messaggi di commit ETL.
Ho aggiunto uno step nel mio workflow per controllare questo flag. Se il tag esiste, il workflow salta lo step di build e deploy. Questo mantiene le pipeline ETL separate da quelle degli articoli.
- Usa i filtri per percorso per mirare a siti specifici
Non vuoi che l'aggiornamento di un sito attivi tre deployment. Configuro il workflow di ogni sito affinché monitori solo la propria cartella e la cartella dei pacchetti condivisi.
Esempio di logica:
- Il sito degli strumenti AI monitora solo apps/ai-tools/
- Il sito OSS monitora solo apps/oss-alternatives/
Se modifichi il codice nella directory condivisa, tutti i siti verranno ricostruiti. Accetto questo compromesso perché le modifiche al codice condiviso sono rare.
- Aggiungi il
