A payment service change can pass thousands of unit tests and still break production because the billing API interprets an idempotency key differently than the service expects. The failure may sit unnoticed until a nightly integration job reaches the interface, long after the commit has moved through the fast part of the pipeline.
Quello è il problema operativo con Integrazione di CI/CD. I test unitari dimostrano che la logica isolata funziona correttamente. I test di integrazione forniscono prove che i componenti, i servizi, le schemi, le code e le dipendenze esterne siano ancora in accordo. In un flusso di consegna moderno, queste prove dovrebbero influenzare le decisioni di triage e non diventare un muro di controlli lenti che gli sviluppatori imparano a ignorare.
Integrazione di CI/CD è diventata un modello di consegna software mainstream. Un Rapporto di testing DevOps 2024 da mabl dice quasi 90% delle organizzazioni globali stanno priorizzando le trasformazioni DevOps, mentre solo 50% dei tester sono coinvolti nella definizione e nella manutenzione dei processi di CI/CD e solo 10% le organizzazioni non hanno implementato CI/CD. La conseguenza pratica è chiara: la verifica di integrazione deve operare a scala di consegna.
Tavola dei contenuti
- Contesto: Sito web di marketing Capgo. Ruolo: Etichetta breve o elemento di navigazione. Visualizzato in: pagina blog/[slug].astro. Chiave di messaggio `table_of_contents` (Tavola dei contenuti).
- Tra le prove di integrazione, dove si collocano le prove di integrazione
- Gestire ambienti e dati per prove fedeli
- Esempi di pipeline per GitHub Actions, GitLab CI e Jenkins
- Tattiche di affidabilità per prove di integrazione fluttuanti
- Gates di Politiche e Regole di Promozione di Deploy
- Checklist di adozione e osservabilità per una lunga fiducia
Perché l'integrazione dei test è il punto di controllo del CI/CD
Il testing di integrazione è dove il rischio di rilascio diventa concreto. Un test unitario può confermare che un gestore di pagamento formatta correttamente una chiave di idempotenza, ma solo un test di integrazione può dimostrare che il gestore, il client HTTP, il fatturato API, il layer di persistenza e il comportamento di riprova concordano quando operano insieme.
Quello rende lo stadio di integrazione il punto di controllo naturale tra integrazione continua e delivery continua. Un commit non dovrebbe essere considerato deployabile solo perché il suo insieme di test unitari è verde. Dovrebbe guadagnare la promozione producendo prove affidabili che le interfacce che cambia funzionano ancora in un'arrangiamento simile a produzione.

La distinzione è importante perché l'integrazione frequente senza verifica automatica non sposta solo i difetti più velocemente. Una revisione sistematica delle approcci di miglioramento CI/CD ha identificato priorità ricorrenti che includono la riduzione del tempo di costruzione e di test, l'incremento della visibilità dei risultati, il supporto al testing continuo, la detezione di difetti e l'incremento della affidabilità della distribuzione. Un'altra revisione nello stesso registro di ricerca definisce l'integrazione continua intorno a un'integrazione frequente code verificata da un build automatico che include test, quindi i difetti possono essere rilevati velocemente.
Costruisci il punto di controllo deliberatamente
Inizia classificando i test di integrazione in base alla decisione che supportano:
- Test di blocco proteggono contratti critici e vengono eseguiti in modo sincrono prima della fusione o della promozione.
- Test di quarantena rimangono visibili e continuano a produrre prove, ma non bloccano la consegna mentre il team investiga l'instabilità.
- Test asincroni esercitano flussi di lavoro più ampi, composizioni di staging complete o infrastrutture costose dopo che il commit ha superato la porta veloce.
Questo è più utile di discutere se ogni test dovrebbe essere “in CI.” La domanda giusta è se un test è affidabile e sufficientemente prezioso da influenzare una particolare decisione di promozione.
Regola pratica: Blocka sulla prova stabile di integrazione, non sull'esistenza di un suite di integrazione.
La restante implementazione segue da quella regola. Utilizzare dipendenze simili a quelle di produzione dove un'interfaccia può fallire, parallelizzare controlli independenti, misurare false fallimenti e definire condizioni esplicite per la quarantena e la promozione. Dove gli esami di integrazione possono essere utili.
La posizione degli esami di integrazione tra gli esami di unità e quelli end-to-end
La piramide degli esami è un modello di costo, non una legge rigida. Gli esami di unità sono veloci perché isolano una funzione, una classe o un modulo. Quella velocità li rende ideali per un feedback immediato, ma i mock possono nascondere esattamente i fallimenti che si verificano ai punti di giunzione del sistema, come le differenze di serializzazione, le restrizioni del database, la configurazione di autenticazione o il comportamento della coda.
Gli esami end-to-end occupano il contrario. Esercitano il percorso dell'utente attraverso l'intero stack, il che li rende utili per flussi di lavoro ad alto rischio. Eseguono anche i browser, la rete, i servizi e i confini dell'infrastruttura, quindi la diagnosi e la stabilità diventano più difficili. Se ogni merge aspetta l'intero stato end-to-end, i sviluppatori ricevono un segnale lento che spesso dice loro meno di un esame di integrazione focalizzato a livello API.
Gli esami di integrazione occupano il terreno di mezzo. Utilizzano dipendenze reali o quasi reali per verificare il comportamento servizio-servizio senza richiedere un'orchestrazione UI completa. Il livello può coprire chiamate HTTP e gRPC, pubblicazione di coda, migrazioni del database, interazione della cache e compatibilità dello schema.
Tre modelli di integrazione utili
In-process component tests con Testcontainers Lanciare l'applicazione componente accanto alle dipendenze come PostgreSQL, Redis o Kafka. Questo modello vale la spesa di configurazione quando il rischio di difetto coinvolge la persistenza, la serializzazione, le transazioni o la semantica del broker. Dà alla prova una dipendenza reale mentre mantiene il confine della prova stretto.
Cross-service contract tests con Pact o un registro di schema Si concentrano sull'accordo tra un consumatore e un provider. Sono una scelta forte quando gli squadre rilasciano servizi independentemente e hanno bisogno di feedback veloce sullo spostamento del contratto. Le prove di contratto non dovrebbero sostituire le prove di integrazione comportamentale, ma possono prevenire un'interfaccia incompatibile da raggiungere in un ambiente condiviso.
API-livello di prove contro una pila di staging composta Chiamare diversi servizi distribuiti attraverso le loro vie di rete reali. Utilizzare questo modello per i flussi di lavoro dove la routing, l'autenticazione, la scoperta del servizio, la configurazione di distribuzione o la politica di infrastruttura hanno importanza. Tenere il set focalizzato sui percorsi critici per l'azienda, perché una pila di staging completa costa di più per la configurazione e è più difficile da isolare quando fallisce.
| Modello | Runtime | Fedelta dell'ambiente | Miglior per |
|---|---|---|---|
| In-process component tests con Testcontainers | Veloci a moderati | Selezione di dipendenze reali | Comportamento di database, cache, broker e componente di applicazione |
| Test di contratto consumatore-fornitore con Pact o registri di schema | Veloci | Alta fedeltà di interfaccia | API e compatibilità degli eventi tra servizi rilasciati indipendentemente |
| API testa contro una pila di staging composta | Lenti a moderati | Alta fedeltà di sistema | Perimetri di rete, autenticazione, routing e workflow critici multi-servizio |
Tenere deliberatamente stretto il set di merge sincrono. Un obiettivo pratico è mantenere il percorso di integrazione meno di 10 minuti per ogni commit di mergepoi spostare gli scenari espansi all'esecuzione asincrona. I team che desiderano una base più ampia per questa suddivisione possono esaminarecosa include il testing automatizzato
ma il principio guida rimane semplice: pagare per la realtà dove cambia una decisione di rilascio.
Gestire ambienti e dati per test fedeli Un test che esegue contro l'ambiente sbagliato può produrre una falsa fiducia. Un test che esegue contro un ambiente condiviso instabile può produrre false fallimenti. Rilevabile L'integrazione di testing CI/CD

Un diagramma che illustra tre passaggi per gestire ambienti e dati per garantire test di integrazione software fedeli.
Inizia con le dipendenze che puoi eseguire fedelmente. Testcontainers può fornire istanze PostgreSQL, Redis e Kafka dismesse per ogni lavoro. Il beneficio chiave non è Docker stesso. È il controllo sulle versioni, la configurazione, l'avvio e l'arresto.
Una sequenza di lavoro riproducibile. Utilizza una sequenza fissata piuttosto che lasciare che il test code improvvisi la sua configurazione:
- Avvia le dipendenze. Avvia il contenitore PostgreSQL, poi aspetta un controllo di salute reale anziché presumere che un processo in esecuzione sia pronto ad accettare il traffico.
- Applica le migrazioni. Esegui lo stesso percorso di migrazione utilizzato dall'applicazione. Non creare uno schema di test manutenuto a mano che può divergere dalla produzione.
- Carica i dati di fixture deterministici. Carica solo i record necessari per lo scenario, e dà a ogni lavoro dati isolati affinché i run in parallelo non possano mutare lo stato l'uno dell'altro.
- Esegui le affermazioni dei contratti. Verifica i formati delle richieste, il comportamento delle risposte, gli schemi degli eventi, le transizioni di stato e gli esiti della persistenza.
- Rendi tutto a posto. Distruggi i contenitori e i volumi temporanei anche quando un test fallisce, affinché i lavori successivi non ereditino uno stato corrotto.
Un avvio di PostgreSQL di 90 secondi può essere un costo ragionevole quando cattura difetti di migrazione e transazioni. Un cluster di staging completo è una decisione diversa. Consuma più infrastruttura, introduce più deriva di configurazione e aumenta il numero di luoghi in cui un errore può avere origine. Inizia con l'ambiente più stretto fedele, poi allargalo quando la copertura dei contratti o gli incidenti di produzione mostrano che il confine più piccolo manca un modello di errore significativo.
Usa la virtualizzazione con intento.
Alcuni sistemi di terze parti non possono essere configurati in modo sicuro in ogni pipeline. WireMock, Mountebank e Hoverfly possono simulare quelle dipendenze, ma la simulazione deve essere trattata come un contratto mantenuto, non come un comodo scampo. Un mock che restituisce solo risposte ideali non rivelerebbe l' scadenza dell'autenticazione, il limitazione di tasso, i payload distorti, il trattamento dei timeout o l'evoluzione dello schema.
Eseguire un ambiente di anteprima effimero è utile quando il rischio dipende da diversi servizi distribuiti che lavorano insieme. Docker Compose può fornire una composizione locale e di CI compatta, mentre i namespace di Kubernetes possono isolare gli ambienti di pull-richiesta quando il comportamento di distribuzione stesso richiede di essere testato. Quale approccio utilizzate, fissate le versioni delle dipendenze e registrate la configurazione utilizzata da ogni esecuzione.
Il segreto ha la stessa disciplina dei dati. Archiviare le credenziali al di fuori dei test fixture e ruotare l'accesso attraverso i meccanismi protetti della piattaforma. Il Capgo guide to managing secrets in CI/CD pipelines fornisce indicazioni rilevanti per mantenere i valori sensibili fuori dalla configurazione del repository.
Un breve walkthrough visivo può aiutare i team ad allinearsi sul ciclo di vita dell'ambiente:
Esempi di pipeline per GitHub Actions, GitLab CI e Jenkins
La macchina di esecuzione conta meno della forma del workflow. Costruisci una volta, fornisce dipendenze in modo predittivo, suddividi i gruppi di test independenti, pubblica risultati leggibili da macchina e rendi il confine bloccante evidente. La sintassi cambia tra le piattaforme, ma quelle regole di funzionamento rimangono coerenti.
GitHub Actions
A un matrice funziona bene quando i test di integrazione possono essere divisi per dominio o shard. I contenitori di servizio mantengono le dipendenze vicine al runner, mentre l'output JUnit fornisce ai richieste di pull e ai sistemi downstream un formato di risultato stabile.
name: integration
on:
pull_request:
jobs:
integration:
strategy:
fail-fast: false
matrix:
suite: [billing, orders, notifications]
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_PASSWORD: test
POSTGRES_DB: app_test
options: >-
--health-cmd "pg_isready -U postgres -d app_test"
--health-interval 5s
--health-timeout 5s
--health-retries 12
redis:
image: redis:7
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npm run test:integration, --suite=${{ matrix.suite }}
- if: always()
uses: actions/upload-artifact@v4
with:
name: junit-${{ matrix.suite }}
path: test-results/*.xml
Pinnare l'azione e le versioni delle dipendenze riduce la deriva dell'ambiente. GitHub Azioni espongono la parallelità principalmente attraverso matrici e job separati, quindi utilizza una matrice solo quando ogni shard ha dati isolati e durata prevedibile.
GitLab CI
GitLab CI può separare la preparazione, l'esecuzione dei test e la relazione. I pipeline figli sono utili quando un grande repository possiede più servizi con ambienti di integrazione diversi. Gli artefatti preservano i risultati JUnit anche quando il job di test fallisce.
stages:
- build
- integration
build-image:
stage: build
script:
- docker build --tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" .
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
integration:
stage: integration
parallel:
matrix:
- SUITE: [billing, orders, notifications]
image: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
services:
- name: postgres:16
alias: postgres
- name: redis:7
alias: redis
script:
- ./scripts/migrate-test-db.sh
- npm run test:integration, --suite="$SUITE" --reporter=junit
artifacts:
when: always
reports:
junit: test-results/*.xml
Utilizza i pipeline figli di GitLab quando la proprietà dei servizi o la topologia di distribuzione rende difficile mantenere un file monolitico unico. Mantieni il pipeline padre responsabile della decisione di promozione, altrimenti un singolo figlio può superare mentre il segnale di rilascio complessivo rimane ambiguo.
Jenkins
Jenkins è utile quando le squadre hanno bisogno di agenti auto-hosted o accesso di rete insolito. Un Jenkinsfile dichiarativo può assegnare agenti basati su Docker e eseguire suite in parallelo, ma la squadra è responsabile della manutenzione dei plugin, del controller, dell'agente e dell'immagine.
pipeline {
agent none
stages {
stage('Build') {
agent { docker 'node:22' }
steps {
sh 'npm ci'
sh 'npm run build'
stash name: 'build', includes: 'dist/**'
}
}
stage('Integration') {
parallel {
stage('Billing') {
agent { docker 'my-org/integration-runner:stable' }
steps {
unstash 'build'
sh './scripts/start-test-dependencies.sh'
sh 'npm run test:integration, --suite=billing'
}
}
stage('Orders') {
agent { docker 'my-org/integration-runner:stable' }
steps {
unstash 'build'
sh './scripts/start-test-dependencies.sh'
sh 'npm run test:integration, --suite=orders'
}
}
}
}
}
post {
always {
junit 'test-results/*.xml'
}
}
}
| Caratteristica | GitHub Azioni | GitLab CI | Jenkins |
|---|---|---|---|
| Esecuzione in parallelo | Gestione di lavoro Matrix e lavori separati | parallel e lavori di matrice |
Declarativo parallel fasi e agenti distribuiti |
| Controllo dell'ambiente | Esecutori ospitati o self-hosted | Esecutori ospitati o self-hosted | Controller e agenti self-managed |
| Visibilità dei risultati | Articoli e annotazioni di controllo | Rapporti JUnit e articoli | Pubblicatore JUnit e storia di costruzione |
| Riproducibilità della versione | Pulsanti, immagini e versioni di configurazione fissate | Immagini e configurazione del runner fissate | Immagini dell'agente e plugin controllati fissati |
| Miglior adattamento operativo | GitHub-centri di repository | Delivery centrata su GitLab | Team che richiedono una personalizzazione auto-hosted estensiva |
Per i team che già utilizzano GitHub L'automazione della costruzione e della rilascio con GitHub Actions può fornire un utile modello di distribuzione. La scelta di progettazione importante rimane la stessa per tutti e tre i runner: non rendere ogni test costoso un blocco di merge sincrono.
Tattiche di affidabilità per test di integrazione flaccidi
La ripetizione degli errori è utile per la diagnosi, ma le ripetizioni generalizzate sono una strategia di affidabilità scarsa. Possono trasformare un difetto reale in un build verde, nascondere l'instabilità ambientale e rendere i dashboard delle pass-rate più sani di quanto sia in realtà il pipeline.
La scala del problema è visibile nei dati di ingegneria pubblicati. Google ha riferito di circa 16% dei test con alcune fluttuazioni e circa 1,5% di tutte le esecuzioni dei test che restituiscono un risultato fluttuante, mentre un altro studio ha trovato 4,56% delle fallite di test di Google causate da test fluttuanti, come riassunto nella guida di integrazione e distribuzione continua e di testing di AWS. I dati di Google hanno anche mostrato circa 84% delle transizioni CI da pass-to-fail erano fluttuanti piuttosto che vere bug, e i progetti di Microsoft hanno riferito di circa 4,6% test fallaci In uno studio, secondo la revisione dei dati sui test fallaci di Panto.

Misura prima di cambiare politica
Segui la fallacia come:
fallimenti fallaci ÷ esecuzioni totali × 100
Utilizza un 7 a 30 giornie calcolalo per suite, test, immagine del runner, dipendenza e ambiente. Un test che fallisce solo su un runner è un problema di rimediamento diverso da un test che fallisce su ogni ambiente.
Utilizza queste categorie di triage:
- Fallimento del prodotto: blocca la porta rilevante e ripara il code o il contratto.
- Fallimento dell'ambiente: Ripara controlli di salute, limiti di risorsa, networking o impostazioni di dipendenza.
- Fallimento del test: Correggi l'ordine delle affermazioni, stato condiviso, timing, pulizia o progettazione di fixture.
- Instabilità non classificata: Quarantina temporaneamente, ma assegna un proprietario e una data di scadenza.
Elimina le cause usuali
L'uso di uno stato mutabile condiviso crea una dipendenza di ordine. Dai a ogni lavoro schemi isolati, identificatori unici o un confine di rollback di transazione. Gli sistemi asincroni hanno bisogno di polling condizionale con timeout limitati, non di sonni arbitrari. Inietta orologi nell'logica di scadenza e aspetta la salute del contenitore piuttosto che il startup del processo.
La riduzione in shard riduce il tempo di orologio, ma non risolve un test cattivo. Esegui shard independentemente, preserva i log per ogni shard e riprova solo il test o il shard fallito per la diagnosi. Non riprova l'intero pipeline solo perché un controllo di integrazione ha avuto un fallimento ambientale.
Un test può uscire dalla quarantina solo dopo aver soddisfatto una politica di stabilità definita, come esecuzioni verdi consecutive attraverso gli ambienti in cui verrà eseguito. La soglia esatta dovrebbe essere scelta dal team e registrata nella politica. La parte importante è che la promozione è guadagnata attraverso la stabilità osservata, non cancellando il marchio di quarantina.
Politiche di gating e regole di promozione di distribuzione
Una porta di qualità dovrebbe rispondere a una sola domanda: questo artefatto ha abbastanza prove affidabili per spostarsi all'ambiente successivo? Non dovrebbe diventare un mucchio di ogni test che l'organizzazione ha accumulato.
La lacuna di applicazione è un avviso. Un sondaggio del 2025 citato da Testkube's analisi di testing CI/CD riferisce che 72% delle organizzazioni hanno automatizzato la QA in CI/CD, mentre solo 26% impongono porte di qualità che bloccano la distribuzione quando i test falliscono. L'adozione senza applicazione lascia la decisione di rilascio alla memoria, all'urgenza o a un elenco manuale.
Utilizza porte di stadio specifiche
Al momento del commit, blocca sui test unitari veloci e sul subset di integrazione stabile che protegge le interfacce modificate o critiche. Allo stadio, aggiungi controlli più ampi composti e validazione della configurazione di distribuzione. Prima della produzione, richiedi l'articolo approvato, la validazione del ambiente protetto riuscita e un'approvazione esplicita dove il modello di rischio lo richiede.
| Stadio | Percentuale di passaggio richiesta | Quarantena consentita | Approvazione |
|---|---|---|---|
| Committo o richiesta di pull | Tutti i controlli bloccanti passano | Solo i test esterni al subset bloccante | Protezione di merge automatica |
| Promozione di staging | Tutti i controlli di integrazione critici passano | Consentito solo con proprietario documentato e revisione di rischio | Proprietario di team o servizio |
| Rilascio canario o limitato | I controlli di promozione e i segnali di salute in tempo reale passano | Nessun test di quarantena copre la via protetta | Proprietario di on-call o rilascio |
| Promozione di produzione | Tutte le porte richieste passano con prove di audit | Nessuna quarantena del percorso bloccante | Aprovazione esplicita dove richiesta dalla politica |
Non confondere il 'tasso di passaggio' con un obiettivo di percentuale crudo. Un insieme può mostrare un alto tasso di passaggio mentre ripete di fallire sul percorso di pagamento o di autenticazione esatto che conta. Definisci la copertura del percorso critico per comportamento, poi richiedi che quei controlli passino deterministicamente.
Mostra le vie di bypass
Configura la protezione della branca in modo che un controllo bloccante fallito impedisca la fusione. Configura le regole di protezione dell'ambiente in modo che la promozione richieda le approvazioni e gli artefatti previsti. Un override umano può essere necessario durante un incidente, ma dovrebbe richiedere una ragione esplicita, un approvatore denominato, un timestamp e un ticket di follow-up.
La quarantena non è un permesso di ignorare i fallimenti. È un modo controllato per mantenere la consegna in movimento mentre si preservano le prove. Se un test quarantinato copre un percorso di rilascio protetto, la politica dovrebbe o ripristinarlo allo stato bloccante o richiedere una decisione di rischio prima della promozione.
Elenco di adozione e osservabilità per la fiducia a lungo termine
Gli squadre falliscono di solito con gli test di integrazione in uno dei due modi. Iniziano con un insieme enorme che rallenta ogni fusione, o creano un insieme veloce con mock così ampi che non esercitano mai i fallimenti che la produzione esporre. Un piano di adozione in fasi evita entrambi i trappi.

Phase uno, rendi il segnale esistente affidabile
Inizia con il pipeline che hai già:
- Imposta la prima porta: Identifica i contratti di servizio critici e fai solo controlli stabili bloccanti.
- Definisci il comportamento di riprova: Permetti rieccitazioni mirate per la diagnosi, mai riprova silenziosa che converte la falla nel successo.
- Abilita la parallelizzazione: Suddividi i suite per dominio limitato, dipendenza o shard, con dati isolati per ogni lavoro.
- Pubblica i risultati dei test: Riporta i report JUnit, i log, lo stato del contenitore e la classificazione delle falla per ogni esecuzione.
A questo stadio, non inseguire la massima copertura. Elimina le fonti più costose di rumore, poi utilizza la fiducia recuperata dei sviluppatori per espandere la copertura reale delle dipendenze.
Phase due, aumenta la fedeltà dell'ambiente
Aggiungi Testcontainers per le dipendenze che sono economiche da riprodurre. Introduci test di contratto dove la proprietà del servizio è distribuita. Utilizza ambienti ephemeri quando la routing, la configurazione di distribuzione o il comportamento tra servizi non possono essere rappresentati con precisione in un job compatto.
La decisione di selezione dovrebbe essere basata su prove. Se un incidente di produzione ha rivelato una disallineamento di migrazione, aggiungi un percorso di database reale. Se un API si è spostato tra servizi dipendenti, aggiungi un contratto di fornitore-consumatore. Se una fallita dipende dalla configurazione di Kubernetes, esegui la relativa verifica contro un namespace ephemeri al posto di fingere che un mock dimostri la stessa cosa.
Fase tre, collega l'osservabilità alla triage
Cattura Percentili della durata del test, differenze di configurazione dell'ambiente, versioni di dipendenza bloccate, rapporti di retry-to-pass e registrazioni e tracce correlate dell'applicazione tramite OpenTelemetry. Un dashboard utile dovrebbe mostrare:
- Flake-rate burnup: Quali suite e test diventano meno deterministici.
- Mean time to green: Dove un flusso di pipeline trascorre tempo prima della ripresa.
- Cluster di modi di fallita: Se le fallite si raggruppano intorno a code, ambiente, dipendenza o progettazione di test.
- Riserva di inventario: Quali test sono in quarantena, chi li possiede e quando devono essere revisionati.
- Evidenze di promozione: Quali porte sono state superate prima di ogni cambiamento di ambiente.
Questo è il significato operativo di osservabilità dell'applicazione. La dashboard non è un archivio retrospettivo. Dovrebbe cambiare la decisione di oggi sul fatto che un test blocca, aspetta in modo asincrono o torna in quarantena.
Tenere una politica di squadra su una pagina con il subset di blocchi, le regole di quarantena, la proprietà dell'ambiente, i limiti di riprova, i requisiti degli artefatti e il processo di sovrascrittura. Esaminarlo quando i dati di fallimento cambiano, non solo quando un incidente importante costringe la conversazione.
Capgo fornisce integrazioni CI/CD per automatizzare l'upload di pacchetti di aggiornamento firmati in tempo reale dopo una costruzione web, con canali che possono supportare flussi di lavoro di branch di feature, staging e produzione. Se il tuo team di CapacitorJS o Electron ha bisogno di collegare le prove di integrazione-test a una consegna mobile controllata, visita Capgo per valutare il API e il flusso di distribuzione.