GitHub Actions fallisce nel passaggio "Check SKIP_DB_AND_REDIS bootability"

Ho avuto un problema in cui il passaggio appena aggiunto “Check SKIP_DB_AND_REDIS bootability” è fallito per uno dei miei plugin.

Il boot di SKIP_DB_AND_REDIS non è riuscito. Assicurati che il database non venga accessibile durante il processo di avvio di Rails.

Per riprodurre localmente, esegui SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'".

Ho provato, ma non sono riuscito a riprodurre il problema in locale. È semplicemente passato.

Ho potuto utilizzare lo stack trace del passaggio fallito dell’azione GitHub per individuare esattamente quale codice fosse il colpevole.

Il codice problematico

In uno dei miei controller ho dichiarato una costante che recuperava l’elenco degli attributi di un active record:

REWARD_FIELDS = Reward.attribute_names.excluding("id", "created_at", "updated_at")

Cosa che, a quanto pare, non si dovrebbe fare.

Ma sarebbe stato meglio se avessi potuto simulare questo controllo in locale, così da non dover procedere per tentativi ed errori tramite GitHub Actions. Deve esserci quindi qualcosa di più rispetto all’esecuzione di:

SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'"

Interessante, grazie per la segnalazione!

È una cosa piuttosto specifica, che probabilmente non avevamo considerato in precedenza.

Potresti provare a modificare questa riga impostandola su false nella tua installazione locale:

E poi riprovare il comando di riproduzione?

Se ciò riproduce con successo il problema, dovremmo valutare l’aggiunta di una variabile d’ambiente per controllare quell’impostazione schema_cache_dump.

Non ha avuto alcun effetto. Nemmeno l’eliminazione del file db/schema_cache.yml.

Potreste provare queste due opzioni:

Modalità sviluppo, utilizzando un ambiente diverso per impostare il database:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB='nonexistent' bin/rails runner "puts 'booted successfully'"

In modalità test, con i plugin caricati:

LOAD_PLUGINS=1 RAILS_ENV=test SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'"

No, è comunque andato a buon fine.

Solo per verificare che il codice del plugin fosse stato caricato, ho usato puts DiscourseKofi::Engine.to_s e ha stampato il nome. Ma quando ho fatto riferimento alla classe che creerebbe una connessione al database puts DiscourseKofi::Admin::AccountsController.to_s, infine si è verificato un errore.

Quindi sembra che non carichi completamente il codice del plugin in locale come fa nell’azione di GitHub.

Il comando completo che ha fallito:

LOAD_PLUGINS=1 SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::AccountsController.to_s"

Senza LOAD_PLUGINS=1 o usando RAILS_DB=nonexistent non si è verificato alcun errore.

Correzione: LOAD_PLUGINS non ha avuto alcuna importanza.

Quindi, questo fallirà:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::AccountsController.to_s"
-> errore

Questo invece no:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts 'avviato con successo'"
-> nessun errore

Nemmeno il riferimento a una classe che non accede al database ha causato errori:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::PaymentsController.to_s"
-> nessun errore

Capito. Il comando corretto per riprodurre il problema localmente è:

CI=true RAILS_ENV=test LOAD_PLUGINS=1 SKIP_DB_AND_REDIS=1 RAILS_DB=nonexistent bin/rails runner "puts 'booted successfully'"

Tutte quelle variabili d’ambiente sono importanti. Non sono riuscito a farlo funzionare con RAILS_ENV=development. Senza CI=true e LOAD_PLUGINS=1 in modalità test, sembra che non vengano caricate tutte le classi dei plugin.