Sto lavorando a un importatore personalizzato per poter importare dati dal nostro forum Woltlab in Discourse. L’ho fatto eseguendo Discourse direttamente sulla mia macchina di sviluppo senza Docker, e ora ho un mucchio di file in script/import_scripts/ che contengono il mio codice di migrazione. Al momento, quei file si trovano in una fork del repository GitHub ufficiale di Discourse.
Vorrei migrare a un’installazione ufficiale basata su Docker ora, ma avrò bisogno che il mio codice di importazione sia disponibile nella nuova installazione per un po’ di tempo, poiché la migrazione dovrà essere eseguita in modo graduale. Se possibile, vorrei mantenere il codice di importazione in un repository separato e renderlo disponibile nell’installazione di produzione in modo pulito.
La mia conoscenza di Rails è limitata, quindi potrei perdermi un approccio ovvio. Qualcuno può indicarmi la giusta direzione?
In questo caso suggerirei una delle seguenti opzioni:
durante la migrazione graduale, basa la tua istanza sul tuo fork. Se vuoi includere nuove funzionalità, sincronizza regolarmente il tuo fork con l’upstream. Al termine della migrazione, torna a discourse/discourse
clona il tuo repository all’esterno di docker e copia i file all’interno. Fallo dopo una ricostruzione, altrimenti lo script di precompilazione troverà il repository non pulito e la build richiederà molto più tempo.
Ho cambiato l’URL del repository all’interno del container Docker e sono stato in grado di eseguire il mio importer. Tuttavia, quando ho eseguito ./launcher rebuild app, il repository è stato reimpostato all’upstream. Ho esaminato il Dockerfile e sembra che il percorso del repository sia codificato in modo fisso, ma non sembra nemmeno che il container di base sia stato creato localmente, quindi le modifiche al Dockerfile non hanno l’effetto desiderato. Esiste un modo approvato per far funzionare questo?
Suggerisco di lavorare con due container. Puoi farlo creando una copia del tuo file app.yml corrente (lo trovi in /var/discourse/containers) e rinominandolo in qualcosa d’altro come import.yml. Quindi aggiorna il parametro version con il tuo branch di importazione personalizzato.
params:
version: your-branch
Ogni volta che hai bisogno di eseguire l’importazione, ferma il container app, avvia il container import ed esegui lo script all’interno del container import. Se sono state apportate modifiche significative in Discourse, potrebbe essere necessario effettuare il rebase del tuo branch con l’ultimo commit dal core e ricostruire il container.
cd /var/discourse
./launcher enter import
# vuoi passare a un branch diverso?
su discourse -c 'git checkout <branch>'
# vuoi scaricare nuovo codice?
su discourse -c 'git pull'
Una volta terminata la migrazione, ferma il container di importazione e riavvia quello dell’app.
cd /var/discourse
./launcher stop import
./launcher start app
Crediti a @gerhard che mi ha insegnato come fare tutto questo