2009-08-31 11 views
9

Sono attualmente impegnato in un breve progetto di ricerca. La società in cui lavoro ha un processo di rilascio molto pesante che sta peggiorando col passare del tempo. Stiamo riscontrando un numero sempre maggiore di problemi con ogni versione, che sta iniziando a influire seriamente sui nostri programmi di consegna e sulla qualità di ogni versione. Forniamo un grande prodotto SAAS distribuito su Internet in una web farm di grandi dimensioni. Il nostro processo di implementazione è attualmente gestito da un team dedicato, con un coinvolgimento minimo degli sviluppatori. Siamo principalmente un negozio .NET, tuttavia abbiamo anche un paio di componenti Java.In che modo la tua azienda distribuisce il suo software?

Sto studiando come migliorare il nostro QA e il processo di implementazione per ridurre gli sprechi e portare più processi sotto il controllo dei nostri team di sviluppo. Sono interessato a sapere come la tua azienda distribuisce i tuoi prodotti (preferibilmente SAAS, ma non limitati a tali prodotti) alla produzione, così come il viaggio attraverso i test durante il suo percorso. Sono curioso di sapere cosa ha funzionato e cosa no, e sono sicuro che molti di voi hanno storie da raccontare.

EDIT (RFC aggiuntive):

Come ho continuato la mia ricerca, mi sono imbattuto nel concetto di "Deployment continuo", a quanto pare sperimentato dal Team 3D comunità online IMVU. Sembra un concetto intrigante, forse un po 'complesso. Sono curioso di sapere se qualcuno qui su SO ha qualche esperienza con la distribuzione continua? In particolare con un progetto ampio e complesso che ha molte parti. Non è necessario necessariamente implementare continuamente la produzione ... per le nostre esigenze a breve termine, consideriamo solo l'implementazione continua in ambienti interni di dev/qa/perftest. Se qualcuno ha implementato la distribuzione continua, sono anche curioso di sapere come hai gestito lo schema del database e le modifiche/rollback dei dati.

Grazie!

risposta

7

Distribuiamo una soluzione SaaS di servizi finanziari nell'ambiente cloud Amazon AWS. La nostra soluzione è al 100% Java, quindi molti degli strumenti non sono applicabili ma i concetti dovrebbero.

Prima di tutto, riduciamo il numero di sorprese quando arriva il momento di fare un rilascio eseguendo un processo di integrazione continua. Ogni volta che il codice sorgente viene controllato da uno sviluppatore, l'intera soluzione viene creata automaticamente e tutti i test unitari vengono eseguiti automaticamente. Le notifiche di errore vengono inviate via e-mail allo sviluppatore in questione e al lead del team.

AWS è costruito attorno al concetto di macchine virtuali. Ne approfittiamo creando un'immagine di una macchina virtuale (Amazon li chiama AMI) che contengono la versione specifica del sistema operativo e delle applicazioni (Java, DB, ecc.) Che desideriamo. Il processo di generazione crea tutte le risorse utente distribuibili e quindi le copia in un'istanza in esecuzione basata su quell'AMI. È lo stesso identico processo per tutti gli ambienti (TEST, DEMO, PROD), ad eccezione di un singolo progetto di configurazione che incapsula le differenze di versione (ad esempio stringhe di connessione).

QA verifica il risultato nell'ambiente TEST. Una volta approvata la versione, ripetiamo il processo di generazione con targeting PROD (utilizzando le stesse revisioni di controllo della versione.) Ricorda che l'unica differenza tra ogni ambiente è un progetto di configurazione).

A quel punto creiamo una macchina virtuale (istanza) in esecuzione sull'AMI di base con la base di codici PROD e la chiamiamo STAGING. STAGING passa attraverso una serie di test di accettazione, sia automatici che manuali. Ecco la parte davvero bella ... ora, bruciamo questo ambiente (base AMI più nuova versione della nostra applicazione) in un nuovo AMI (immagine della macchina virtuale). Quindi creiamo nuove istanze in esecuzione dei nostri server delle app basate su questa nuova immagine, aggiorniamo il bilanciamento del carico in modo che punti a queste nuove istanze e uccida solo le vecchie istanze. Questa è la bellezza dell'uso di macchine virtuali (almeno, questa è una delle bellezze).

Ogni volta che è necessario regolare la capacità (ore/giorni di picco), vengono create nuove istanze del server delle applicazioni dalla stessa AMI di produzione e registrate con il servizio di bilanciamento del carico. Al termine del picco, li rimuoviamo dalla rotazione del bilanciamento del carico, quindi eliminiamo le istanze aggiuntive dopo alcuni minuti (per consentire il completamento delle sessioni esistenti).

+0

Grazie per la risposta dettagliata. Sembra la chiave che ti ha aiutato ad usare le macchine virtuali. Uno dei prodotti che stiamo valutando è VMware Lab Manager. Da quello che ho raccolto su AMI, serve lo stesso scopo di base ... macchine virtuali basate su modelli. Immagino che la differenza principale sia che sarà ospitata da noi sul nostro hardware. È bello sapere di uno scenario in cui la virtualizzazione è stata utilizzata con successo (e nel cloud, per l'avvio!) – jrista

+0

Ho anche chiesto a jamiedp questa domanda, ma quanto è grande la tua applicazione? Lo classificherai come piccolo, medio, grande o enorme? Questo è in termini di dimensioni del codice di base, quantità di configurazione e numero di utenti in media. Grazie! – jrista

+0

@jrista: Immagino che dipenda da come si definiscono queste dimensioni, ma grandi suoni sulla destra. L'applicazione è abbastanza complessa, fa ampio uso delle tecnologie aziendali e supporta un volume di transazioni piuttosto elevato. –

0

Non stai dicendo che cosa sta causando i problemi con le tue uscite? Stavamo avendo problemi perché i file errati finivano nella nostra build. La nostra risposta a questo è stato costruire uno strumento che ci desse controllo e visibilità su tutti i file nella nostra build. Here è un webcast dello strumento che abbiamo creato.

+0

Non siamo esattamente sicuri di cosa causi problemi in modo specifico. Sappiamo che una parte di esso ha a che fare con il funzionamento dei nostri script di compilazione e il fatto che i nostri script di compilazione sono strettamente associati alla struttura delle cartelle e alla struttura delle diramazioni specifiche del nostro controllo sorgente. Un altro problema che pensiamo di avere è il processo TOO MUCH, che richiede un ** lotto ** di persone da coinvolgere in ogni release. Sappiamo di dover snellire il processo ... ma non abbiamo una "linea di base per il buon processo di implementazione" da confrontare. – jrista

+1

Il webcast al link che hai fornito sembra essere rotto. Inizia a suonare per alcuni secondi, quindi si ferma. – jrista

0

Disclaimer: Posso vendere quello che ho scritto, ma per ora è gratuito (e non è stato rilasciato ufficialmente).

Utilizziamo un sistema che ho scritto.

Funziona integrando con il controllo sorgente e il server CI. Mi consente di inviare il codice a SVN, attendere una build sul build server, quindi, tramite l'interfaccia apps, configurarlo per una build specifica, confermarlo indietro nel controllo del codice sorgente e quindi, sui server, aggiornerà. La cosa bella è che puoi aggiornare asynch, così tutti i server avranno la nuova build intorno allo stesso tempo.

È un po 'più complicato di così, e richiede un certo modo di essere impostato, ma è davvero molto bello (secondo la mia opinione molto parziale) quando è in azione. Mandami una mail se vuoi una versione 'alpha' gratuita con cui giocare. Qualsiasi beta di esso sarà gratuito pure.

- Edit:

processo generale:

  1. impegnarsi a tronco
  2. Attendere la costruzione dal server CI, build è 'nudo' (non configurato per qualsiasi server)
  3. Deploy compilare, utilizzando lo strumento ("dashy"), per testare il server
  4. Test
  5. Siate soddisfatti dei test
  6. Deploy build (stessa corporatura) a vivere server

Le fasi "Distribuzione" si compone di impegnarsi in SVN, e quindi il programma, installato anche sul vostro server web, ottiene la build da SVN.

Effettivamente, aggiungo un nuovo oggetto di livello "base" nella struttura SVN standard. Normalmente hanno:

/trunk 
/braches 
/tags 

Con dashy, aggiungo /releases

/trunk 
/braches 
/tags 
/releases 
+0

Quindi, si tratta di un sistema di compilazione preventiva, che intercetta il checkin e le build prima che il codice venga eseguito (come TeamCity?) Non sono sicuro di aver capito appieno quello che fa ... – jrista

+0

Aggiornato con qualche informazione in più. –

+0

Grazie. Sembra interessante. Sono curioso di sapere se hai mai sentito parlare di TeamCity? Questo è un altro prodotto CI che sto valutando. La cosa interessante di TC è che intercetta preventivamente i controlli di controllo del codice sorgente, crea e verifica, e si limita a controllare il controllo del codice sorgente solo se la compilazione e la verifica hanno esito positivo. Altrimenti l'autore del reato viene avvisato in un circuito chiuso e non ti imbatti nel problema del codice errato che colpisce un ramo. Non sono sicuro dei tipi di scenari di distribuzione supportati, ma la distribuzione può comunque essere gestita dallo script di compilazione. http://www.jetbrains.com/teamcity/ – jrista

1

Abbiamo una soluzione SaaS e fondamentalmente utilizzare lo stesso processo (server di integrazione continua, script di distribuzione per il test-staging-produzione) come Eric sopra, ma lo distribuiamo alla nostra infrastruttura utilizzando script personalizzati basati su PSTools (http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx) per eseguire tutte le operazioni di copia sui nodi della farm.

Per ogni distribuzione valutiamo se è possibile consentire a nodi diversi di avere versioni diverse dell'app (es.nessun rischio di integrità dei dati) o dobbiamo disattivare l'app offline per alcuni secondi per sincronizzare tutti i nodi (in genere occorrono circa 20 secondi affinché l'app ritorni online, dal momento che copia le app da un nodo principale) ; ma l'intera chiave è avere una configurazione del processo di distribuzione "one key".

+0

Per curiosità, quanto è grande la tua applicazione? Lo classificherai come piccolo, medio, grande o enorme? Grazie. :) – jrista

+0

La domanda nel mio ultimo commento riguarda la dimensione del codice di base, la quantità di configurazione e il numero di utenti in media. Grazie. – jrista

+0

L'intera suite è costituita da righe di codice di .4M ed è divisa in diversi componenti (front end, servizi Web, dal, ecc.) Che potremmo implementare indipendentemente anche se di solito non lo facciamo. Per quanto riguarda la configurazione, tutte le modifiche di configurazione sono gestite/modificate dai nostri script di implementazione ... e sono fondamentalmente modifiche alle stringhe di connessione, riferimenti di servizio, che vengono preparati sul nodo principale e modificati su ciascun nodo Come per # di utenti, abbiamo circa 10.000 utenti di reg, e durante il giorno abbiamo circa 300 sessioni attive in qualsiasi momento, proviamo sempre a schierare al minor tempo di pick dove abbiamo 10 ~ 15 sessioni – Jaime

Problemi correlati