Semplice spiegazione dell'integrazione continua

30

Come definiresti l'integrazione continua e quali componenti specifici contiene un server CI?

Voglio spiegare a qualcuno nel reparto marketing cos'è l'integrazione continua. Comprendono il controllo del Sorgente - cioè usano Subversion. Ma mi piacerebbe spiegare loro correttamente cosa CI è. L' articolo di Wikipedia non lo definisce mai correttamente, L'articolo di Martin Fowler fornisce solo quanto segue, che è fondamentalmente una tautologia seguita da una vaga spiegazione di" integrazione ":

Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible.

Aggiornamento : ho inviato loro questa immagine, non ho trovato una più semplice.

Aggiornamento2:ritornodaltestodimarketing(perilmomentoincuic'erano3domande):

Iactuallylikeall3answers–fordifferentreasons.Ifeellikelogginginjusttothankthemall!

Ovviamentenonpuò,quindigraziepersuoconto:)

Aggiornamento3:misonoresocontoguardandol'articolodiWikipediachecontieneiprincipi che, quando prendi solo i titoli, è un bel elenco:

  1. Gestisci un repository di codice
  2. Automatizza la build
  3. Rendi la prova automatica della build
  4. Tutti si impegnano alla base ogni giorno
  5. Ogni commit (alla linea di base) dovrebbe essere costruito
  6. Mantieni veloce la compilazione
  7. Prova in un clone dell'ambiente di produzione
  8. Rendi più facile ottenere gli ultimi risultati finali
  9. Tutti possono vedere i risultati dell'ultima build
  10. Automatizza la distribuzione
posta icc97 17.05.2013 - 11:56
fonte

3 risposte

25

Quando qualcuno cambia i file che costituiscono il prodotto software e poi prova a controllarli (in altre parole, tenta di integrare le modifiche nel codice del prodotto principale), assicurati che il software può ancora essere realizzato con successo.

Di solito c'è un sistema esterno, chiamato server CI , che periodicamente o ad ogni cambio, acquisisce i file sorgente dal controllo di versione e tenta di creare il prodotto (compila / prova / pacchetto). Se il server CI può eseguire correttamente una build, le modifiche sono state integrate correttamente.

Anche il server CI deve essere in grado di trasmettere se la compilazione ha avuto esito negativo o negativo, quindi sistemi come Jenkins (uno dei più utilizzati server CI oggi) avranno modi per inviare e-mail / testi, nonché un web simile a un dashboard interfaccia con una serie di informazioni sulle build attuali e passate, su chi ha effettuato il check-in, quando le cose si sono interrotte, ecc ... (Sulla tua immagine sopra, questo sarebbe il meccanismo di feedback )

L'IC è importante, perché garantisce che su base continua, hai un prodotto funzionante. Questo è importante per tutti gli sviluppatori che stanno lavorando sul software e per tutte le persone che vogliono avere accesso alle versioni giornaliere del prodotto, come il QA.

    
risposta data 17.05.2013 - 14:27
fonte
30

Suppongo che per il reparto marketing non sia importante come funziona CI , ma cosa CI significa per nuove versioni del tuo software .

CI significherà idealmente che puoi produrre una nuova versione potenzialmente rilasciabile del tuo software ogni giorno, pronta per essere presentata o venduta al tuo cliente, con alcune nuove funzionalità, funzionalità o correzioni di bug aggiunte. Ciò non significa che devi consegnare la nuova versione ogni giorno, ma puoi farlo se vuoi.

Ad esempio, se si prevede di rilasciare ufficialmente un nuovo set di funzionalità per la versione "2015" er del software e si dispone già di parti di quel set di funzionalità già codificate e integrate, i ragazzi del marketing possono prendere l'attuale versione del tuo software e mostrarlo - più o meno in sicurezza - alla prossima conferenza ora nel 2013. Senza CI, hanno dovuto chiedere al tuo team un blocco del codice non pianificato, ogni membro del team doveva integrare la funzione semi-elaborata su cui stava lavorando nel prodotto, potrebbero non avere abbastanza test automatici pronti e indovinare cosa succederà alla conferenza - la "versione alpha" della versione 2015er avrà un rischio molto più elevato di crash, specialmente quando verranno dimostrate le nuove funzionalità.

    
risposta data 17.05.2013 - 13:53
fonte
16

Non puoi sapere cosa CI sia, a meno che tu non sappia cosa eravamo soliti fare. Immagina un sistema con 3 parti. C'è un'interfaccia utente che raccoglie i dati e li inserisce nel database. C'è un sistema di reporting che crea report dal database. E c'è una sorta di server che controlla il database e invia avvisi via email se determinati criteri sono soddisfatti.

Molto tempo fa questo sarebbe scritto come segue:

  1. Concorda lo schema per il database e i requisiti: ci vorrebbero settimane perché doveva essere perfetto, perché presto vedrai perché
  2. Assegna 3 sviluppatori o 3 team indipendenti di sviluppatori, ai 3 pezzi
  3. Ogni sviluppatore dovrebbe lavorare sul proprio pezzo e testare il proprio pezzo utilizzando la propria copia del database, per settimane o mesi.

Durante questo periodo gli sviluppatori non eseguivano il codice degli altri, né tentavano di utilizzare una versione del database creata dal codice di qualcun altro. Lo scrittore di report dovrebbe semplicemente aggiungere un po 'di dati di esempio. Lo scrittore di allerta avrebbe aggiunto record che simulavano eventi di report. E lo scrittore della GUI guarderebbe il database per vedere che cosa aveva aggiunto la GUI. Col passare del tempo, gli sviluppatori avrebbero capito che le specifiche erano sbagliate in qualche modo, come non specificare un indice o avere una lunghezza di campo troppo breve e "aggiustarlo" nella loro versione. Potrebbero dire agli altri, che potrebbero agire su di esso, ma di solito queste cose andrebbero in un elenco per dopo.

Quando tutte e tre le parti sono state completamente codificate e testate dai loro sviluppatori, e talvolta persino testate dagli utenti (mostrando loro un report, una schermata o un avviso e-mail), allora verrebbe la fase di "integrazione". Questo è stato spesso preventivato in diversi mesi ma sarebbe comunque passato. La modifica della lunghezza del campo da parte di dev 1 verrebbe rilevata qui e richiederebbe gli sviluppatori 2 e 3 per apportare enormi modifiche al codice e probabilmente anche modifiche all'interfaccia utente. Quell'indice extra avrebbe causato il suo stesso caos. E così via. Se a uno degli sviluppatori è stato detto da un utente di aggiungere un campo e lo ha fatto, ora sarebbe il momento in cui gli altri due dovevano aggiungerlo anche.

Questa fase è stata brutalmente dolorosa e praticamente impossibile da prevedere. Quindi la gente ha cominciato a dire "dobbiamo integrarci più spesso". "Dobbiamo lavorare insieme fin dall'inizio." "Quando uno di noi solleva una richiesta di modifica [è così che abbiamo parlato allora] gli altri devono saperlo." Alcuni team hanno iniziato a fare i test di integrazione prima continuando a lavorare separatamente. E alcune squadre iniziarono a usare il codice l'un l'altro e produssero tutto il tempo, fin dall'inizio. E questo è diventato Continuous Integration.

Potresti pensare che sto esagerando con la prima storia. Ho fatto un po 'di lavoro per un'azienda quando il mio contatto mi ha rimproverato per aver controllato un codice che ha sofferto dei seguenti difetti:

  • una schermata su cui non stava lavorando aveva un pulsante che non ha ancora fatto nulla
  • nessun utente ha firmato il progetto sullo schermo (colori e caratteri precisi, l'esistenza dello schermo, le sue capacità e i pulsanti che aveva nella specifica delle 300 pagine).

Era sua opinione che tu non mettessi le cose nel controllo del codice sorgente finché non fosse FATTO. Di solito faceva uno o due check-in un ANNO. Abbiamo avuto un po 'di differenza di filosofia: -)

Inoltre, se trovi difficile credere che i team siano disconnessi attorno a una risorsa condivisa come un database, non crederai davvero (ma è vero) che sia stato adottato lo stesso approccio al codice. Stai per scrivere una funzione che posso chiamare? È grandioso, vai avanti e fallo, nel frattempo voglio solo indicizzare quello che mi serve. Mesi dopo avrò "integrato" il mio codice in modo che chiami la tua API e scopriremo che esplode se passo null, esplodo se restituisce null (e lo fa molto) restituisce cose troppo grandi per me, non può gestire gli anni bisestili e mille altre cose. Lavorare in modo indipendente e poi avere una fase di integrazione era normale. Ora suona come una follia.

    
risposta data 17.05.2013 - 14:07
fonte

Leggi altre domande sui tag