Consigli sul nuovo flusso di lavoro git / deployment

1

Lavoro con un piccolo team che fino a poco tempo fa non utilizzava il controllo del codice sorgente. Sto lavorando al layout del nostro flusso di lavoro di sviluppo / distribuzione con git. Gradirei e consigli o intuizioni che potresti avere.

Ti risparmio i dettagli ma fondamentalmente utilizziamo il modello di branching del flusso git e la distribuzione con un telecomando puntava a un repository nudo sul server di produzione con un hook post-ricevente. La mia domanda è con un progetto più ampio che abbiamo sviluppato. Questa è un'applicazione che avrà molte istanze che dovranno essere in grado di aggiornare dal ramo master del repository delle applicazioni ma anche avere il proprio set di file univoci (file specifici del progetto front-end).

Sono un po 'perso e penso che potrebbe essere perché ho lo schema di implementazione un po' fuori. Ho sentito molte persone dire "git non è per lo spiegamento" e un numero uguale dice il contrario. Il sistema funziona alla grande per noi che attualmente stiamo spingendo verso il remoto che lo distribuisce in base al gancio di post-ricezione di quel server.

Un'idea di implementazione che abbiamo è quella di avere una lista di rami dal master dell'App che avrà i propri rami "projectA-master" e "projectA-develop" che seguiranno il nostro attuale workflow git. Questo ci porta ad avere MOLTI rami sul repository App originale e questo sembra sbagliato. Per non parlare che non scala bene. Abbiamo solo quattro server previsti per la distribuzione, ma questo metodo è terribile quando diventa 20 o più. È un rompicapo.

master---A---B---C
   \ \
    \ develop--A--B--C
     \
      \projectA-master--C--D--E
       projectA-develop--C--D--E

Yuck.

Un'altra idea era quella di avere il repository di App per lo sviluppo e gli aggiornamenti e un altro repository (magari App-frontend) che sarebbe specifico per ogni progetto e avere un modello di ramificazione simile sopra solo non nel repository App originale preservando il suo codice e le sue filiali solo allo sviluppo specifico delle app di base. Quindi averli entrambi distribuiti nel server remoto.

master(App)---A---B---C---E---F----G
    \                            /  \___
     develop---A---B---C---E----F    ___ Live Instance
                                    /
master(App-frontend)---A---B---C---E
    \                             /
     develop---A---B---C----E----F

Anche questo sembra sbagliato.

Ho usato .gitignore per ignorare tutte le directory che sono specifiche del progetto, ma il problema che ho riscontrato era che i miei file FE non venivano controllati dalla fonte sul server remoto, rimanevano non tracciati.

Non so come spingere gli aggiornamenti dal repository principale dell'app e non sovrascrivere i file personalizzati sul livello specifico del progetto (repo del server remoto).

Quindi come gestisci una situazione come questa? Hai un prodotto che avrà molte istanze, ma ogni istanza ha file front-end specifici del cliente. E come viene gestito su larga scala da centinaia a migliaia di istanze e hai ancora bisogno di estendere aggiornamenti / correzioni?

Sono stato in tutto questo e in altri forum e sono diventato molto lontano dal non utilizzare veramente git. Se hai tempo, apprezzerei alcuni suggerimenti di quelli di voi più esperti che possono dirmi cosa sto sbagliando e cosa sto facendo bene.

Grazie mille.

    
posta AndrewAchilles 05.03.2015 - 21:03
fonte

4 risposte

2

Benvenuto nel mondo della gestione e implementazione del cambiamento.

Git - con gitflow è uno dei migliori strumenti di controllo del codice sorgente disponibili al momento per la gestione del lato sviluppo software della creazione di un prodotto. Ma la parte fondamentale di questa frase è strumenti di controllo del codice sorgente .

Ci sono molti altri aspetti della soluzione che stai cercando.

Crea automazione - Jenkins, Team City, CruiseControl.NET sono esempi in questa categoria. Questi prodotti prendono il codice dal tuo controllo sorgente e lo compilano in programmi, eseguono test unitari, eseguono analisi del codice e pubblicano artefatti da questo processo di compilazione.

Residente di manufatti - Artifactory, Archivia, Nexus sono esempi di questo tipo di prodotto. Funzionano come archivi di versioni per gli artefatti di costruzione. Puoi richiedere l'ultima versione di questa build, oppure specificare la versione 1.35 e ottenere gli output ufficiali compilati

Distribuzione - Chef, Puppet, Salt, CF-Engine sono esempi che gestiscono la distribuzione. Questi strumenti gestiscono la configurazione e l'installazione del software (e anche molti aspetti del sistema operativo)

C'è un sacco di lavoro nella creazione di questo tipo di ambiente, ma quando si distribuisce il software su un numero elevato di server, questa è l'importazione da fare e farlo con cura e precisione.

    
risposta data 07.03.2015 - 19:16
fonte
2

Se capisco correttamente le tue esigenze, vuoi tre cose:

  • I tuoi file FE (front end penso) / config da tracciare nel controllo sorgente (quindi, git).
  • Vuoi diversi file di configurazione per diverse installazioni.
  • Non vuoi che i file di configurazione siano condivisi.

Una possibile soluzione che mi viene in mente è di avere diversi repository git.
Ce ne sarà uno per il codice sorgente principale, i rami, ecc. Come hai già descritto.
L'altro repository (che dovrebbe essere in una diversa directory al di fuori del progetto principale, sebbene presumibilmente accessibile da esso) sarebbe un repository che è solo per i file di configurazione. È un repository git, quindi ha tutti i vantaggi del controllo del codice sorgente ma non è legato all'altro repository.

In realtà la gestione di questo richiede ancora alcune scelte. Potresti avere un repository "template" predefinito (di sola lettura) che viene inizialmente clonato e funge da modello e quindi disporre di rami per ogni installazione al suo interno potrebbe essere un'opzione.

btw Una cosa che potresti vedere suggerita da altri è git submodules. Ti consiglierei di evitarli. Sembrano certamente una buona risposta "in teoria", ma in pratica, in tutti i luoghi di lavoro in cui li ho visti, non hanno funzionato affatto. Il flusso di lavoro è troppo diverso e manuale rispetto al git & principale flusso di lavoro delle filiali che è l'impostazione predefinita in molti posti.

    
risposta data 07.03.2015 - 23:03
fonte
1

Penso che molti dei tuoi problemi si risolveranno da soli una volta che avrai distinto lo sviluppo dalla distribuzione .

git flow è un ottimo flusso di lavoro per lo sviluppo; ma i casi in cui vorrei spingere il codice per pungolare direttamente dal controllo del codice sorgente sono estremamente limitati. Probabilmente solo per progetti personali o per una startup in fase alpha senza clienti.

Una volta ottenuto un prodotto redditizio, è importante assicurarsi che il codebase esegua alcuni controlli di integrità prima che colpisca una casella di produzione. Come hanno già detto altre risposte, Jenkins, Teamcity o un altro server CI è un minimo indispensabile. Uno strumento di ispezione continua come SonarQube o Coverity sarebbe ancora meglio.

Anche il flusso di lavoro git push -to-prod si interrompe quando la nuova versione richiede aggiornamenti di dipendenza. Ecco dove uno strumento di gestione della configurazione è davvero utile.

Per tornare alla tua risposta, probabilmente manterrei il codice base, quello che non cambia tra i fornitori, in un unico repository. Ogni fornitore ottiene il proprio repository specifico del fornitore. Usa la build CI per sovrapporre entrambi i repository in un progetto comune e quindi archiviare i risultati come artefatti di build propri.

Supponiamo che tu stia sviluppando un plug-in Salesforce. Memorizza il codice generale in salesforce-plugin-core . Memorizza le estensioni del fornitore in vendor-a-extensions , vendor-b-extensions e così via.

Crea un processo CI per salesforce-vendor-core . Utilizzare il meccanismo di attivazione del processo downstream dello strumento CI per avviare i processi vendor-a-extension e vendor-b-extension ogni volta che il lavoro principale ha esito positivo. Ogni lavoro del fornitore dovrebbe produrre un pacchetto finale specifico del fornitore: qualcosa come vendor-a-plugin.jar e vendor-b-plugin.jar .

Se decidi di diventare un fornitore SaaS (e sembra che tu possa essere), questo flusso di lavoro ti consente di trasferire rapidamente i pacchetti specifici del fornitore ad ambienti specifici del fornitore.

    
risposta data 08.03.2015 - 04:28
fonte
0

Quei file unici, sono specifici per l'installazione? Solitamente questo viene risolto inserendo le proprietà nei file di configurazione locali (o nel registro per Windows), assicurandosi che questi non vengano sovrascritti dopo ogni aggiornamento dell'applicazione.

Se è necessaria la gestione centrale di questi file, è necessario un qualche tipo di archivio dati per ospitare un file di configurazione per istanza. È possibile utilizzare git per questo, un ramo per installazione o solo un ramo con una cartella per installazione, ma potrebbe anche essere un semplice server FTP o un database. Questo dovrebbe essere tenuto separato dal principale artefatto di implementazione, dal momento che non dovrebbero essere taggati o ramificati con l'applicazione principale.

    
risposta data 05.03.2015 - 23:34
fonte

Leggi altre domande sui tag