Come mantenere aggiornate le librerie di terze parti?

27

Diciamo che ho un progetto che dipende da 10 librerie, e nel bagagliaio del mio progetto sono libero di usare qualsiasi versione di quelle librerie. Quindi inizio con le versioni più recenti. Quindi, ciascuna di queste librerie riceve un aggiornamento una volta al mese (in media). Ora, per mantenere il mio bagaglio aggiornato, è necessario aggiornare un riferimento alla libreria ogni tre giorni.

Questo è ovviamente troppo. Anche se di solito la versione 1.2.3 è una sostituzione drop-in per la versione 1.2.2, non si sa mai sapere senza test. I test unitari non sono sufficienti; se si tratta di un motore DB / file, è necessario assicurarsi che funzioni correttamente con i file creati con versioni precedenti, e viceversa. Se ha qualcosa a che fare con la GUI, devi ispezionare visivamente tutto. E così via.

Come gestisci questo? Alcuni approcci possibili:

  • Se non è rotto, non aggiustarlo . Resta con la versione corrente della libreria finché tu non noti nulla di sbagliato quando viene utilizzata nella tua applicazione, indipendentemente dalla frequenza con cui il produttore di librerie pubblica gli aggiornamenti. Piccole modifiche incrementali sono solo sprechi.
  • Aggiorna frequentemente per mantenere il cambiamento ridotto. Poiché in ogni caso dovrai aggiornare qualche giorno, è meglio aggiornarlo spesso in modo da rilevare eventuali problemi all'inizio quando sono facili da correggere, invece di saltare diverse versioni e lasciare che potenziali problemi si accumulino.
  • Qualcosa nel mezzo. C'è un punto debole?
posta Joonas Pulakka 25.11.2010 - 18:15
fonte

12 risposte

22

Sono scioccato - e davvero sconvolto - dal numero di risposte che dicono "non aggiornare a meno che non sia necessario". L'ho fatto, e mentre è più facile a breve termine, brucia a lungo andare. Gli aggiornamenti più frequenti e più piccoli sono molto, molto più facili da gestire rispetto a quelli occasionali di grandi dimensioni, e avrai il vantaggio di nuove funzionalità, correzioni di bug e così via.

Non compro questa idea che le modifiche alle librerie siano in qualche modo più difficili da testare delle modifiche al codice. È lo stesso: stai apportando una modifica alla base di codice e devi convalidarlo prima di eseguire il commit, e in modo più approfondito prima del rilascio. Ma devi già avere dei procedimenti per farlo, visto che stai facendo cambiamenti al codice!

Se lavori in iterazioni, da due a quattro settimane, suggerirei di aggiornare le librerie una volta per ogni iterazione, da fare il prima possibile dopo l'inizio, quando le cose sono un po 'più rilassate di una semplice prima di una scadenza di iterazione e il progetto ha più capacità di assorbire il cambiamento. Ottenere qualcuno (o una coppia se si abbina la programmazione) per sedersi, controllare quali librerie sono state aggiornate e provare a riunirle singolarmente ed eseguire una ricostruzione e un test. Budget mezza giornata al giorno per ogni iterazione, forse. Se le cose funzionano, controlla le modifiche (presumo che tu mantieni le librerie nel controllo del codice sorgente, come facciamo noi: non sono sicuro di come propagare la modifica in modo controllato se non lo fai). Questo sarà ovviamente molto più semplice se hai dei test automatici che se il test è interamente manuale.

Ora, la domanda è cosa fai se un aggiornamento rompe le cose - passi del tempo a risolverlo o a lasciarlo fuori? Suggerirei di appoggiarmi a quest'ultimo; se può essere riparato in un'ora, fatelo, ma se un aggiornamento richiederà un lavoro significativo da integrare, allora lo si eleva come una propria attività di sviluppo, da stimare, stabilire una priorità e pianificare come qualsiasi altro. Le probabilità sono che a meno che non porti a qualche correzione o miglioramento molto cruciale, la priorità sarà bassa e non ci arriverai mai. Ma non si sa mai, nel momento in cui il prossimo aggiornamento aggiornativo del giorno tondo, il problema potrebbe essersi risolto da solo; anche se non lo è, almeno ora sai che c'è un roadblock sul percorso di aggiornamento, e non ti colpirà di sorpresa.

Se non stai facendo iterazioni di quella lunghezza, vorrei impostare una sorta di programma standalone per gli aggiornamenti, non più di un mese. C'è qualche altro ritmo di progetto a cui potresti legarlo, come una recensione mensile dello stato o una riunione del consiglio di architettura? Payday? La notte della pizza? Luna piena? In ogni caso, devi trovare qualcosa di molto più breve rispetto a un ciclo di rilascio tradizionale, perché provare ad aggiornare tutto in una volta ogni 6-18 mesi sarà doloroso e demoralizzante.

Inutile dire che se si fanno rami di stabilizzazione prima delle versioni, non si applicherebbe questa politica a loro. Lì, aggiorneresti solo le librerie per ottenere correzioni importanti.

    
risposta data 26.11.2010 - 20:45
fonte
10

Io valuto.

  • In primo luogo, cerco bug che abbiamo raccolto rispetto a quella libreria e vediamo se sono stati risolti.
  • In secondo luogo, cerco altre correzioni di bug nella lib di cui potremmo beneficiare (forse qualcosa che è possibile in un angolo).
  • In terzo luogo cerco miglioramenti nella lib / API e poi analizzo l'impatto della modifica del nostro codice per utilizzarlo e il compromesso. Troppo spesso in passato ho aggiornato le librerie senza utilizzare effettivamente le loro nuove funzionalità, davvero stupide!

Quindi applico tutto ciò contro il rimanere con la lib esistente.

Sempre test - si spera che i test di unità / integrazione garantiscano che non si verifichino regressioni importanti.

    
risposta data 25.11.2010 - 18:26
fonte
7

Il problema principale con le librerie di terze parti è che è necessario testare nuovamente l'applicazione quando si aggiornano, prima che possa essere messa in produzione. Quindi, a meno che tu non abbia un bug segnalato, che richiede l'aggiornamento di una libreria, non li tocchi finché non hai il tempo di fare un ciclo completo di garanzia della qualità.

Questo di solito viene fatto quando si rilascia una nuova versione.

Tuttavia, suggerirei di disporre di una suite di test per la generazione continua che consenta di aggiornare le librerie nel ramo di sviluppo e di farlo automaticamente. Ciò ti garantirà di scoprire presto quando si interrompe, in modo da poter inviare segnalazioni di errori al progetto.

    
risposta data 25.11.2010 - 18:29
fonte
3

In modo parziale, come descritto in filiali di fornitori svn . La procedura descritta è molto utile quando continui a utilizzare le librerie di terze parti open source per molto tempo e hai apportato delle modifiche per adattarle alle tue esigenze.

    
risposta data 25.11.2010 - 18:18
fonte
2

Vorrei pensare di aggiornare tutte le librerie di un progetto subito prima o subito dopo un rilascio. Ciò tuttavia potrebbe sfuggire di mano se ci si affida a più di 10 o 15 librerie, nel qual caso una sorta di meccanismo di controllo degli aggiornamenti sarebbe di grande aiuto. Il vantaggio di questo è che hai un tempo dedicato a testare le tue librerie e puoi risolvere qualsiasi problema in un unico passaggio. Inoltre, non è necessario tenere costantemente traccia degli aggiornamenti di ogni singola libreria, è sufficiente controllare un determinato giorno per eventuali aggiornamenti.

Vorrei anche andare contro qualsiasi tipo di funzionalità di aggiornamento automatico anche in un ramo di sviluppo. Sarebbe frustrante se nel mezzo di me si lavori su qualcosa che il progetto abbia rotto perché una libreria si è autoaggiornata, o all'improvviso ho ricevuto avvisi di ammortamento per l'utilizzo di un'API che è stata appena sostituita da qualcos'altro.

    
risposta data 25.11.2010 - 18:36
fonte
2

Devi chiedere, cosa vuoi veramente dall'aggiornamento? La maggior parte delle correzioni di sicurezza sono in realtà semplici patch, sotto forma di correzione:

  • Off da un errore in cui il codice arbitrario può essere copiato in uno spazio non utilizzato in un buffer
  • Puntatori penzolanti o qualcos'altro che innesca un comportamento non definito ma (piuttosto) deterministico
  • Bug che permettono un qualche tipo di DoS
  • Bug che accidentalmente rendono facile lo spionaggio dei dati privati
  • Errori matematici
  • I manutentori toccano cose che non dovrebbero (bug SSL Debian, chiunque?)

Se osservi la maggior parte dei CVE negli ultimi cinque anni, le patch che li risolvono sono in genere piuttosto banali, se usi le librerie aperte, che spero tu sia.

Quindi hai correzioni di bug effettive, che probabilmente vuoi, ma forse l'hai già risolto da solo. Se non è rotto, non aggiustarlo.

Infine, hai nuove funzionalità ... e forse funzionalità deprecate. È necessario esaminare attentamente le note di rilascio e le diff. Puoi usarli, anche se rompono un'API da cui dipendono molte altre cose? Se sì, è il momento di un intervento chirurgico ... se no, scegli quello che vuoi e vai avanti.

Alcuni potrebbero non essere d'accordo con me, ma mi rifiuto di usare una libreria senza codice sorgente.

    
risposta data 25.11.2010 - 18:51
fonte
2

Varia a seconda delle cose come nelle librerie, per cosa sono utilizzate, quanto sono pervasive nel codice, il costo (in termini di tempo e denaro) di eseguire l'aggiornamento e così via.

Idealmente avresti sempre l'ultimo tutto il tempo, ma se la nuova versione non è retrocompatibile, allora? Potrebbe essere necessario accantonare quell'aggiornamento per una versione futura finché non si riesce a gestire con attenzione la modifica. Potrebbero esserci dei lievi cambiamenti nel comportamento (come "adesso devi impostare la proprietà X prima di chiamare il metodo Y, o ottieni una perdita di memoria lenta") che è difficile da verificare nei test.

D'altro canto, la nuova versione potrebbe avere alcune serie correzioni di sicurezza, quindi devi tenerne conto.

Versione breve: prendila caso per caso.

    
risposta data 25.11.2010 - 22:54
fonte
1

Questo dipenderà dal tuo rilascio shedules.

Ma il mio consiglio sarebbe di installare un set di librerie su tutte le macchine degli sviluppatori. Consideralo un gold standard se vuoi chiamarlo qualcosa, quindi inizia lo sviluppo per quel rilascio.

Solo una volta che la versione è stata distribuita e sei nella fase di post-release, rivaluta le tue librerie, le loro versioni e funzionalità. Se offrono alcuni miglioramenti significativi o nuove funzionalità, allora installali prima dell'inizio del prossimo ciclo di sviluppo.

Installa solo nuove versioni se c'è un grosso problema o bug che devono essere risolti prima di distribuire il software.

Significa che ti mancheranno alcune versioni ma dovresti risparmiare alcuni mal di testa e problemi di versioning che ti permetteranno di concentrarti sullo sviluppo della tua applicazione.

    
risposta data 25.11.2010 - 21:31
fonte
1

Subversion Externals

Ciò che è eccezionale in questa funzione è che puoi specificare la revisione che desideri.

Tieni presente che gli aggiornamenti saranno più lenti se disponi di molti elementi esterni.

    
risposta data 25.11.2010 - 22:02
fonte
1

Attualmente sto configurando qualcosa del genere:

  • 1 repository mercurial per ogni estensione della mia applicazione
  • un repository mercuriale che raccoglie versioni specifiche di diverse librerie di terze parti
  • un repository SVN per risorse grafiche / opere (ma potrebbe cambiare a qualcos'altro)
  • un repo mercurial per la mia applicazione, che utilizza la funzione di sottointervallo mercurial per utilizzare la versione specifica del terzo repository pary e alcune delle estensioni di base

Ora, quando ho bisogno di lavorare su un'estensione che non è "di base" (implicitamente inclusa come un sottorepo nel repository dell'applicazione), faccio semplicemente clonare il repository nella cartella delle estensioni e lasciare che CMake generi i progetti e le soluzioni per intera applicazione.

In questo modo, posso:

  • cambia le terze parti in un clone, controlla che funzioni con l'app, inseriscile nel repository 3rd pary, quindi aggiorna la versione del subrepo del repository dell'applicazione nella nuova versione del repository di terze parti
  • lavora su estensioni in modo indipendente, tutti insieme o scegli alcuni specifici
  • non devi preoccuparti di dover collegare i progetti insieme, questo è fatto da Cmake solo facendo in modo che i sottopresti dei progetti vengano scansionati con l'intero repo dell'applicazione.

Non ho ancora molta esperienza con questa organizzazione, ma penso che sia molto utile.

    
risposta data 25.11.2010 - 22:34
fonte
1

Se il tuo software è critico per la sicurezza, devi aggiornarlo il prima possibile, senza scuse. Non vuoi un piccolo bug in una libreria grafica per rendere vulnerabile l'intero programma.

Altrimenti, quando la lib è matura, è "Se non è rotto, non aggiustarlo". per me. Prima o poi, potrei aver bisogno di una funzionalità di una versione successiva e non ho altra scelta che aggiornare, ma fino ad allora, lo sforzo è difficile da giustificare. D'altra parte, quando lavoro con una lib o framework relativamente nuova, come Grails o ExtJS, rimango aggiornato con l'ultima versione perché questi prodotti non sembrano ancora completamente maturi, quindi è probabile che l'aggiornamento mi salvi dall'incorrere in uno di quei bug risolti nella versione successiva.

    
risposta data 25.11.2010 - 22:25
fonte
1

Uso NuGet per mantenere aggiornate le mie librerie di terze parti.

Quando un amico, un collega o un blog mi avvisano che una delle mie DLL di terze parti non è aggiornata, NuGet semplifica l'aggiornamento.

    
risposta data 21.03.2012 - 23:21
fonte

Leggi altre domande sui tag