Dove memorizzare la configurazione dell'applicazione

1

Fino ad ora per ciascuna delle nostre applicazioni, archiviamo la configurazione dell'applicazione nello stesso repository del codice che utilizza la configurazione. Abbiamo file yml specifici per l'ambiente (dev, test, .., prod) che contengono testo semplice e valori di configurazione crittografati. Questi vengono distribuiti come "Impostazioni applicazione" in Azure. A seconda del tipo di applicazione (Java Tomcat, .NET Webapp, ecc.) I valori di configurazione vengono recuperati in fase di runtime da variabili di ambiente o file di configurazione direttamente.

Ora, vorremmo disaccoppiare il rilascio del codice dal rilascio della configurazione. Una modifica della configurazione non dovrebbe richiedere la ricostruzione e il ridistribuzione dell'applicazione (processo, approvazione, ecc.). Questo sarebbe per le patch, ad esempio, dove la versione dell'applicazione x.y recupererà l'ultima configurazione per x.y.* .

Il modo naturale per farlo è spostare i valori di configurazione in un servizio dedicato da cui le applicazioni li preleveranno, un'API REST, supportata da un database per esempio. La domanda è da dove viene compilato quel repository esterno, dove la configurazione vive da quel momento in poi. Due opzioni che vedo sono mantenere la configurazione nel repository dell'applicazione che configura o con un repository "Configuration" con la configurazione di tutte le applicazioni.

Sono un grande sostenitore del mantenimento del codice e della configurazione in un unico repository. Non riesco proprio a quantificare i lati positivi. Eccone alcuni che riesco a pensare.

  • Mantenere la configurazione isolata da altre applicazioni ". Le modifiche alla configurazione di altre applicazioni non si influenzano a vicenda. (Modifica di una configurazione apparentemente non condivisa)
  • Verifica del codice e della configurazione contemporaneamente nella stessa richiesta di unione.

Mi sento molto fermamente su questo, ma non so perché.

Non vedo alcun svantaggio di mantenere la configurazione insieme al codice e nessuna possibilità di spostare tutte le configurazioni nello stesso repository.

Perché è meglio memorizzare la configurazione insieme al codice? Perché è meglio memorizzare tutte le configurazioni nello stesso repository?

    
posta Tobias 21.06.2018 - 23:07
fonte

3 risposte

3

The configuration values are fetched at runtime from environment variables or configuration files directly.

Sembra che tu abbia già la possibilità di distribuzioni disaccoppiate perché dici che passi in configurazione in fase di esecuzione. Sembra che il tuo processo sia l'ostacolo alla distribuzione disaccoppiata della configurazione. La configurazione è accoppiata al software solo se fa parte degli artefatti in fase di compilazione e non può essere modificata in fase di runtime. Penso che tu stia confondendo i repository con le implementazioni. Non tutto ciò che è nello stesso repository deve essere distribuito insieme, e le cose che si trovano in repository separati possono essere distribuite insieme.

This would be for patches for instance where the application version x.y will fetch the latest configuration for x.y.*.

Che cosa intendi quando dici che la versione dell'applicazione x.y recupera la configurazione per x.y.* ? L'applicazione non dovrebbe essere scaricare config. La configurazione deve essere inoltrata da qualunque cosa avvii l'applicazione (tramite variabili d'ambiente o argomenti della riga di comando).

Penso che sia abbastanza importante mantenere la configurazione dello "sviluppatore" con il codice. Il codice dell'applicazione deve avere una configurazione appropriata per uno sviluppatore per clonare il repository, creare ed eseguire il software sul proprio sistema locale. Penso che le configurazioni dev, test e prod dovrebbero not essere nello stesso repository per un paio di motivi:

  1. Sicurezza - Anche se hai crittografato informazioni sensibili nella configurazione, non è ancora una buona idea tenerlo in VCS con il codice. Per esempio. non vorrai tenerlo in un repository open-source. Tale pratica incoraggia anche la chiave da condividere tra gli sviluppatori in modo che chiunque nel team possa aggiornare la configurazione quando cambia.
  2. Flessibilità: la base di codici dovrebbe essere progettata per essere eseguita con qualsiasi configurazione, non dovrebbe cercare di prevedere come verrà configurata una specifica implementazione di produzione. Ci possono essere infinite variazioni della configurazione, perché il repository del codice dovrebbe contenere quelle specifiche? Se vuoi creare più ambienti, avrai una proliferazione di file di configurazione.
  3. Separazione della responsabilità - In molte aziende il personale che scrive il software non è la stessa persona che ha configurato l'infrastruttura su cui verrà eseguito. Penso che sia più facile per il team che gestisce l'infrastruttura e l'implementazione del software per gestire la configurazione del software. Credo invece che gli ingegneri del software dovrebbero creare e mantenere la descrizione della configurazione e il team delle operazioni dovrebbe gestire quali host / database / password ecc. Vengano compilati.

The natural way to do this is to move the configuration values into a dedicated service that the applications will fetch them from, a REST API, backed by a database for instance

Non vedo questo come un miglioramento della tua configurazione attuale. In effetti è molto più complesso. Ora devi configurare il tuo sistema originale per parlare con il servizio di configurazione. Anche eseguire l'applicazione localmente ora richiederebbe l'esecuzione di un servizio aggiuntivo. Nello spirito di dipendenza dall'iniezione, il software non dovrebbe configurarsi da solo - la configurazione dovrebbe essere passata. Se dovessi sviluppare un servizio come lo stai descrivendo sarebbe meglio recuperare la configurazione dal servizio allora avvia l'applicazione con la configurazione scaricata anziché l'applicazione che recupera la propria configurazione.

I am a big proponent of keeping the code and configuration together in one repository. I just can't really quantify the upsides. Here are a few I can think of.

  • Keeping configuration isolated from other applications'. Other application's configuration changes won't affect each other. (Changing a seemingly unshared configuration)

Non c'è nulla che ti impedisca di mantenere le configurazioni delle applicazioni separate l'una dall'altra e certamente la distribuzione di una configurazione non dovrebbe richiedere il ridistribuzione di tutte le configurazioni.

  • Review of code and configuration at the same time in the same merge request.

Penso che sia strano. Significa che prima di rivedere il codice, è necessario decidere la configurazione di produzione? Se il mio cambiamento richiede un nuovo database, devo andare al team dell'infrastruttura, creare tutti i database per tutti gli ambienti, compilare i nomi degli host, i nomi utente e le password? Di nuovo se la descrizione della configurazione si trova nel repository di origine, che può essere rivista senza occuparsi della configurazione di produzione.

    
risposta data 22.06.2018 - 05:21
fonte
0

Una modifica a un file di configurazione non dovrebbe richiedere un grande processo. Non dovrebbe essere neanche troppo facile, perché un brutto cambiamento potrebbe bloccare gli utenti o causare altri malfunzionamenti.

Memorizzare le configurazioni in un servizio Web sposta semplicemente il problema e quindi raddoppia le operazioni di manutenzione.

Hai un processo in cui lavorare, quindi la sfida sta lavorando con The Powers That Be per sviluppare un processo ottimizzato per i cambiamenti di configurazione.

Escludendo tale limite, identifica le impostazioni di configurazione che cambiano spesso e aggiungilo al tuo database. Avrai bisogno di un app push per distribuire il nuovo codice, ma da quel momento dovresti avere delle schermate di manutenzione nella tua applicazione per gestire tali modifiche.

In questo caso, un servizio web è come colpire una puntina con una mazza. Solo le normali tabelle e moduli del database dovrebbero fare il trucco.

    
risposta data 22.06.2018 - 02:36
fonte
0

Ive ha lavorato su una varietà di sistemi ERP, CRM e di fatturazione. Se capisco cosa intendi per configurazione in modo corretto ... Nella mia esperienza, tutto ciò che descrive l'istanza sufficiente per avviare il software è contenuto nei file. Oltre questa configurazione dell'applicazione è comunemente contenuto nel database.

L'obiettivo principale è che è possibile eseguire il backup e il ripristino di un db da un ambiente all'altro e può essere avviato senza il rischio di puntare ai percorsi delle cartelle sbagliati, ecc. e creare un pasticcio.

Il vantaggio della configurazione dell'applicazione basata su tabelle è non solo è possibile passare la manutenzione agli utenti aziendali, ma può essere interrogato e confrontato facilmente.

    
risposta data 22.06.2018 - 10:55
fonte

Leggi altre domande sui tag