2015-03-05 11 views
12

Ho avuto problemi con la pre-compilazione delle risorse durante i deployment, quindi ho optato per la pre-compilazione locale e archiviare i file risultanti nella struttura dei sorgenti. Non ho alcun problema con questo approccio, eccetto che a volte mi dimentico di eseguire l'attività di precompilazione e rilasciare senza risorse di precompilazione! :(Rota risorse locali: precompilato: esiste un modo automatico per verificare le modifiche?

Mi chiedo se qualcuno si sia imbattuto in qualche modo per verificare se si sono verificati cambiamenti di asset? Idealmente mi piacerebbe eseguire una sorta di controllo sul mio server CI e fallire la compilazione se . ci sono cambiamenti di asset che non sono stati commessi

ho avuto un paio di pensieri:

  1. Run RAILS_ENV=production bundle exec rake assets:precompile sul server cI e vedere se c'è qualche uscita (il comando appare tutto quanto non output se. le risorse sono aggiornate.) Tuttavia, sembra che l'output del comando sia legato in qualche modo all'ambiente in cui viene eseguito, perché dopo aver eseguito la virgola nd localmente, confermando i risultati e quindi eseguendo il comando sul server CI, è ancora presente il comando! Mi piacerebbe sapere perché questo è legato all'ambiente, ma non riesco nemmeno a trovare la fonte per rake assets:precompile nel repository github dei binari. Qualcuno sa dove è la fonte?

  2. In qualche modo scrivere un comando che può guardare attraverso la cronologia git e determinare se qualche risorsa è stata modificata nella mia cartella assets/ dall'ultima pre-compilazione. Non realmente sicuro come dovrebbe funzionare ...

Questo mi ha poco più di un paio di volte, e qualche volta io non prenderlo quando i colleghi si impegnano variazioni patrimoniali - più esso sembra davvero come questo è qualcosa che un computer dovrebbe essere in grado di catturare per un umano. Immagino che una terza alternativa abbastanza ragionevole sarebbe avere il server CI semplicemente eseguendo il comando e commettere automaticamente i file generati nell'albero dei sorgenti, ma non mi piace l'idea che il mio server CI esegua commit.

Qualche idea? Grazie.

+0

Bene, ho scoperto che l'attività 'rake assets: precompile' è definita nel progetto [sprockets-rails] (https://github.com/rails/sprockets-rails). Ancora non hanno fatto progressi su questo ancora però. Spero di poter dedurre quello che sta succedendo scavando attraverso quel codice. –

+1

Ho riscontrato un problema nel progetto rotaie-rotaie intorno a questo - https://github.com/rails/sprockets-rails/issues/264 Se stai riscontrando questo problema ti suggerisco di upvotare. –

+0

Esiste un progetto pubblico in cui la variabilità dell'ambiente nelle risorse del rake: il precompilare potrebbe essere dimostrato (a patto naturalmente che si possa trovare la differenza fondamentale richiesta negli ambienti). – javabrett

risposta

6

È possibile trovare la fonte per l'attività precompile in sprockets-rails. Il motivo per cui non visualizzi alcuna modifica localmente potrebbe essere dovuto al rilevamento delle impronte digitali, che è abilitato di default nella produzione e disabilitato negli altri ambienti (poiché il debugging con le impronte digitali può essere una seccatura). Puoi abilitarlo usando config.assets.digest come descritto nello assets guide

Come hai detto, è facile dimenticare il passaggio di precompilazione. Un'automazione elegante sarebbe quella di rimuovere le risorse compilate dal repository e aggiungere un'attività capistrano (o CI) per precompilare le risorse ad ogni distribuzione. La pre-compilazione sarebbe idealmente avvenuta sul server CI (invece di eseguirlo su ogni server di produzione). Questo approccio allevia anche la necessità di continuare a scansionare le risorse compilate per le modifiche (che in realtà non dovresti preoccuparti).

L'invio automatico di qualsiasi cosa al repository non è una buona idea: oltre ai commit involontari, si finisce per confondere la cronologia dei commit.

+0

È un po 'strano che non ci sia una gemma o qualcosa di confezionato che gestisca tutto questo per te. Sembra una cosa che la maggior parte delle persone incontrerebbe ad un certo punto ??? –

+0

Ci sono alcune soluzioni per le gemme. Dai un'occhiata a 'rails_12factor' di Heroku, che affronta questo insieme ad una serie di altri standard/ottimizzazioni https://github.com/heroku/rails_12factor –

+0

Voglio accettare questa risposta perché sento che questo mi ha davvero indirizzato ad usare CloudFront, che sembra davvero più una "best practice" e si allontana completamente dalle risorse precompilate (fantastico!). Tuttavia, so che non tutte le persone potrebbero essere in grado di utilizzare i servizi AWS per la distribuzione delle loro rotaie. Se qualcuno è in grado di determinare come far funzionare questa attività in modo coerente in tutti gli ambienti, potrei cambiare le risposte, ma credo che questo sia davvero un approccio migliore. –

2

Sto attraversando lo stesso sforzo, ma non sono stato in grado di risolvere questo problema però. Un primo passo è usare un hook pre-commit git per compilare le risorse (che farà qualcosa solo se ci sono risorse modificate).

http://jimneath.org/2012/05/05/precompile-assets-using-a-git-hook.html

Edit: Sembra che puntano ottenuto nuked, ecco la versione archiviata: https://web.archive.org/web/20161022195654/http://jimneath.org/2012/05/05/precompile-assets-using-a-git-hook.html

+0

Questo link sembra essere rotto – Doug

+0

Sì sembra che sia stato rimosso, strano. Puoi ancora vederlo sulla strada del ritorno - aggiornerò il collegamento –

2

La mia risposta è basato su Git, un'implementazione del pensiero del PO 2: possiamo fallire la build basata su Git-metadata ci dice che la sorgente assets/ è più recente rispetto allo assets-precompile/ attualmente archiviato. La risposta potrebbe essere in grado di essere migliorata in base alle condizioni dell'ambiente di check-out o ad alcune conoscenze sulla build di Rails.

  1. git log -1 --format=%ct -- assets/ fornisce il timestamp dell'ultimo commit di origine.
  2. git log -1 --format=%ct -- assets-precompile/ ti darà il timestamp del più recente check-in pre-compilato.

Aggiungere all'inizio una condizione che confronta questi due numeri e, se 1> = 2, fallisce qualsiasi build di rilascio.In realtà, potresti voler creare un periodo di prova, nel caso in cui qualcuno inserisca un commit durante il checkout ed esegua la pre-compilazione e quando esegui il commit.

In alternativa, per essere più rigoroso con questo, si memorizzerebbe il commit-hash di {{assets /}} in un file, e se cambia e si differenzia da quello nell'ultima pre-compilazione, di nuovo, fallisce qualsiasi rilascio costruire, fino a quando non è di nuovo pre-compilato e il check-in:

git log --format=%H -- assets/ 

... e confrontare che con un commit hash si aggiorna con il pre-commit. È inoltre possibile utilizzare %T per l'albero-hash anziché il commit-hash, che potrebbe semplificare la ramificazione.

+1

Questo non risolve il problema originale però - perché l'esecuzione di 'rake asset: precompilare 'su una macchina dello sviluppatore non produce cambiamenti, ma poi esegue il lo stesso comando esatto sul computer di un altro sviluppatore produce modifiche. –