Esiste uno strumento CI che non garantisce regressioni nel livello di qualità delle filiali?


10

Tradizionalmente i sistemi di CI eseguono il monitoraggio dei livelli di qualità in un ramo di integrazione, eseguendo verifiche di controllo qualità sulla base di codice in cui sono già state eseguite le modifiche, controllando le regressioni e inviando notifiche per l'intervento umano.

Ma quando vengono rilevate queste regressioni, la filiale è già nei guai almeno da quando è iniziata la rispettiva verifica del QA e rimarrà in tale stato (o addirittura peggiorerà!) Fino a quando tutti i colpevoli non saranno identificati, le riparazioni per loro commesse e una nuova verifica del QA conferma che il livello di qualità del ramo è stato ripristinato. Il ramo può essere considerato bloccato per il normale sviluppo durante tutto questo tempo.

Esiste uno strumento CI in grado di prevenire realmente tali regressioni, che verificherebbe verifiche di QA pre-commit e consenti i commit solo quando la base di codice aggiornata con i rispettivi commit passerebbe anche quelle verifiche di QA pre-commit, garantendo così un minimo livello di qualità del ramo?

Aggiornamento: si presume che siano disponibili per l'invocazione le verifiche di QA automatizzate adeguate con copertura adeguata per poter rilevare le rispettive regressioni tramite gli strumenti CI.


Continuo a chiedermi quale sia il modo corretto di comprendere questa domanda (e la tua raccomandazione nella tua risposta). Se sostituissi "il monitoraggio" con "dopo i fatti" e "prevenissi" con "evitassi che accadessero", allora sarebbe più o meno la stessa domanda? Inoltre, forse puoi aggiungere uno scenario di esempio per spiegare la differenza?
Pierre.Vriens

@ Pierre.Vriens È meglio?
Dan Cornilescu,

Risposte:


6

Per quanto ne so, stai cercando uno strumento che rifiuterà i commit che interrompono la compilazione: uno strumento CI probabilmente non sarà in grado di prevenire le regressioni correggendo effettivamente il codice, ma può impedirti di aggiungere codice errato al repository.

Atlassian ha alcune interessanti applicazioni di ganci Git :

Gli hook di pre-ricezione sul lato server sono un complimento particolarmente potente per l'integrazione continua perché possono impedire agli sviluppatori di spingere il codice sul master, a meno che il codice non soddisfi determinate condizioni - come i guardiani ninja d'élite, proteggendolo da un codice errato.

Se stai usando Git, gli hook sono molto potenti (e ci sono hook simili per SVN , Mercurial e altri sistemi di controllo della versione) e potresti trovare utile usarli per eseguire controlli pre-commit.

La documentazione di Git ha una pagina sulla creazione di un hook per rifiutare push se non soddisfano determinati criteri che potrebbero essere facilmente adattati a questo caso d'uso.

Tuttavia, molte persone sostengono che il rifiuto dei commit sia una cattiva idea in un featureramo: perderai semplicemente tempo a combattere contro il tuo sistema CI quando la build si rompe per qualche motivo, invece di correggere effettivamente il bug.

Sul masterramo, potrebbe avere senso rifiutare le fusioni interrotte, perché potresti voler assicurarti che si sviluppi sempre. Per un featureramo, si sarà inevitabilmente rompere le cose, e dal momento che il codice non sta andando in produzione ora , ha più senso solo avvertirti che in realtà rifiutare la commit del tutto.


Bene, a cosa serve un'immagine sw che si costruisce, ma DOA è da test prospettico? Gli sviluppatori non possono testare le loro modifiche al codice anche se costruiscono, quindi sarebbero altrettanto bloccati. Quindi in generale estenderei il rifiuto del commit a tutto ciò che non supera un controllo di qualità minimo, scelto bilanciando 2 requisiti in conflitto: il più alto possibile per massimizzare il numero di sviluppatori protetti dal blocco e il più basso possibile in modo tale che i ritardi di verifica del QA non rallenta troppo il processo.
Dan Cornilescu,

Un esempio di ciò potrebbe essere il modello di richiesta pull in cui è possibile porre determinate restrizioni sulla possibilità di unire o meno una richiesta pull. Ad esempio, noi (la mia azienda) utilizziamo Atlassian Bitbucket Server e ci sono opzioni per richiedere almeno N numero di approvazioni e X numero di build di passaggio per il ramo specificato prima che sia possibile unire una richiesta pull. Questo non lo rifiuta del tutto. Ma impedisce l'unione accidentale quando i test falliscono o altri occhi non hanno ancora visto il codice.
Andy Shinn

@AndyShinn: Sì, lo trovo abbastanza utile: GitHub offre anche filiali protette e controlli su richieste pull , che sono spesso utili.
Aurora0001

1
Un argomento per consentire il codice non funzionante nei rami delle caratteristiche è che consente agli sviluppatori di inviare il codice su cui stanno lavorando al repository, anche se non è ancora del tutto pronto. Questo può essere utile per condividere il codice con altri per le prime revisioni del codice / architettura prima che le cose siano pronte, per aiutare a risolvere i problemi di debug o per qualcuno che sta andando in vacanza per svolgere un lavoro parzialmente fatto dove altri possono raggiungerlo. Per i rami delle caratteristiche, metterei solo cose come linter e come hook pre-commit.
Brad

2

Nessuno strumento potrebbe garantire nessuna regressione, ciò dipende molto più dai test che dallo strumento che li esegue. Tuttavia, puoi aiutare a prevenire le regressioni che verranno catturate dall'entrare nel ramo di integrazione. Puoi farlo con hook pre-commit, ma spesso è più facile con le richieste pull (che si spera tu stia già utilizzando per la revisione del codice peer).

Se una succursale è aggiornata con il suo upstream (dove il PR si sta fondendo) e i suoi test superano, allora passeranno comunque dopo l'unione; lo stato del ramo di destinazione dopo l'unione corrisponderà allo stato del ramo di origine prima dell'unione.

In genere non è particolarmente difficile (a seconda degli strumenti utilizzati) indicare se il ramo di origine in un PR è aggiornato con la destinazione e se ha una build CI passante. È possibile utilizzare questo come requisito (per criterio e / o imposto nel software) per unire la richiesta pull.


"Se un ramo è aggiornato con il suo upstream (dove si sta fondendo il PR) e i suoi test passano, allora passeranno comunque dopo l'unione" - Perché? Una fusione è una discontinuità, porta incognite. Come i conflitti: il codice potrebbe persino non essere compilato fino alla risoluzione. È necessario eseguire i test e confermare che superano qualsiasi unione di diramazione. Direi anche per un avanzamento veloce, se vuoi giocare in sicurezza. Vedi apartsw.com/insights/2016/11/16/…
Dan Cornilescu

Ehm, sì, tale garanzia è possibile, controlla la mia risposta. Bene, forse dovrei chiarire: per regressione intendo risultati peggiori che la linea di base risulta (e ignorando la possibilità di falsi positivi, questi devono essere affrontati in quanto possono distorcere la linea di base, deragliare il tutto e richiedere l'intervento umano). I falsi negativi intermittenti sono solo un fastidio, rallentano le cose, ma possono essere affrontati.
Dan Cornilescu,

Non puoi garantire nessuna regressione, puoi solo garantire nessuna regressione rilevata. Se una modifica provoca una regressione non rilevata da un test, si tratta di una regressione di cui uno strumento CI non può fornire alcuna garanzia. E mentre l'unione di due serie di modifiche porta sconosciuti, puoi scegliere di farlo nel ramo della funzionalità (unendo l'upstream in) prima di unire l'altra direzione. Se l'origine è aggiornata con l'obiettivo, si tratta di una semplice unione (avanzamento rapido) e, successivamente, lo stato di destinazione sarà identico allo stato di origine prima dell'unione, quindi se i test sono passati prima, passeranno dopo.
Adrian

Capelli che si dividono. Lo strumento CI può essere configurato con un test per rilevare e quindi proteggere da qualsiasi regressione a cui tieni. Non discuterò troppo delle fusioni - il mio obiettivo è evitarle il più possibile, sono solo dei problemi complessivi :)
Dan Cornilescu

Il mio punto è che non è lo strumento CI che offre quella protezione, sei tu, scrivendo i test. Lo strumento CI non può fornire garanzie oltre ai test forniti.
Adrian

1

Veri strumenti di integrazione continua (al contrario di semplici test continui) come Reitveld e Zuul possono essere d'aiuto, anche se sono buoni tanto quanto i test che scrivi e le recensioni di codice che fai.


Ma Reitveld sembra essere uno strumento di revisione del codice collaborativo, non uno strumento CI, mi sto perdendo qualcosa? Questo è quello che ho visto: github.com/rietveld-codereview/rietveld
Dan Cornilescu

Zuul sembra essere davvero, imparentato, lo studierò più da vicino.
Dan Cornilescu,

Non esegue test ma gestisce alcuni aspetti della gestione delle filiali, fungendo da sistema di gatekeeper, che è la soluzione migliore per impedire l'ingresso di codice errato bloccando l'unione.
coderanger

Capisco cosa intendi. Bene, può aiutare con la qualità complessiva del codice, ma di per sé non offre alcuna garanzia. Due modifiche perfettamente valide che superano tutte le verifiche di controllo qualità in modo indipendente possono comunque causare rotture quando si incontrano nella filiale.
Dan Cornilescu,

1

Usa GitLAB, puoi impostare le impostazioni del progetto per consentire l'unione solo quando la pipeline ha successo, quindi puoi avere un'integrazione veramente continua, combinare quella con l'aggiunta del QA all'elenco delle approvazioni di unione e con gli ambienti dinamici, puoi avere la garanzia della qualità prima di unirti al maestro.


Funziona ma solo se non si consente a una seconda unione di avviare i controlli di qualità prima che la fusione precedente sia stata completata, altrimenti la seconda unione non vedrà la prima, lasciando spazio alle regressioni. In altre parole, le fusioni (compresi i loro controlli di qualità) devono essere completamente serializzate, il che non si adatta a team di grandi dimensioni.
Dan Cornilescu,

0

ApartCI è un sistema CI progettato esattamente per prevenire le regressioni, garantendo così un livello di qualità del ramo piatto o in aumento. Ancora in beta.

Orchestra le verifiche centralizzate di pre-commit in modo tale da garantire che una modifica venga impegnata solo dopo che è stata verificata, insieme a tutte le altre modifiche commesse prima di esso, per soddisfare o superare l'ultimo livello di qualità della filiale.

Questa è la differenza chiave rispetto alle tradizionali verifiche pre-commit guidate dallo sviluppatore, spesso eseguite in parallelo, che lascia spazio a regressioni causate da interferenze che non sono mai state testate insieme.

Lo strumento è inoltre progettato per adattarsi facilmente , in grado di sostenere percentuali molto elevate di modifiche dei candidati in arrivo e supportare centinaia di migliaia di sviluppatori che lavorano nello stesso ramo di integrazione.

Disclaimer: sono l'autore dello strumento e il fondatore dell'azienda che lo offre. Ci scusiamo per l'annuncio.


È positivo che tu abbia aggiunto la dichiarazione di non responsabilità, ma personalmente prendo in considerazione l'idea di porre una domanda e di rispondere autonomamente promuovendo la tua azienda o i tuoi prodotti come una forma di spam.
THelper

Ho fatto una domanda su meta se questo è permesso o no: meta.devops.stackexchange.com/q/59
THelper

Anche SnapCI ha fatto questo. STRAPPARE.
paul_h

@paul_h, a meno che non mi manchi qualcosa, SnapCI e la sua sostituzione raccomandata GoCD sono entrambi basati su verifiche post-commit (attivate dal polling di SCM), quindi sono ancora solo di monitoraggio. Tranne forse per i controlli PR, ma a meno che questi controlli non siano completamente serializzati, possono solo ridurre i tassi di occorrenza di regressione, ma non eliminarli completamente.
Dan Cornilescu,

Dan, non polling no, ganci. E a un ramo PR di breve durata che non è ancora stato fuso in trunk / master - trunkbaseddevelopment.com/game-changers/…
paul_h
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.