Abbiamo dovuto risolvere lo stesso problema. Siamo giunti alla soluzione che funziona molto bene.
Tutto il codice nel master deve avvenire tramite una richiesta pull. Per completare una richiesta di pull, deve essere compilata e approvata da un revisore richiesto. È importante che il sistema sia configurato per creare un commit temporaneo di unione dal ramo e dal master (simile al commit se il PR dovesse essere completato)
Una volta completata la compilazione, viene creata una versione con le risorse dalla build. Questa versione è distribuita ai server di sviluppo. Ogni distribuzione riceve un numero di porta in cui possiamo raggiungere questa versione specifica dell'app Web.
Diciamo che abbiamo i seguenti ambienti. DEV, RUNTESTS, UAT, PROD. Dopo la distribuzione su dev RUNTESTS, viene eseguito env per questa particolare versione. Se tutto va bene, il revisore richiesto dà al PR un approvare e può essere completato.
Questo assicura che sia molto difficile inserire codice spezzato nel master. Un altro vantaggio è che otteniamo un numero di porta per una versione specifica che può essere utilizzata per scopi dimostrativi (PO, parti interessate, analisti ...)
Ogni mattina una build da master è pianificata e distribuita su DEV e RUNTESTS e possiamo quindi scegliere di metterla in UAT e PROD se vogliamo. Poiché abbiamo la versione temporanea PRIMA che il codice colpisca il master, non è necessario attivare una build su ogni commit.