Come faccio a far funzionare Sonarcloud su richieste pull da fork con Travis, Maven e github

Mentre esaminavo la mia recente domanda Sonarcloud fallita con Travis, Maven e Github mi sono reso conto che stavo facendo la domanda sbagliata. Stavo cercando di affrontare un sintomo piuttosto che il problema di fondo.

Un progetto su cui lavoro ( eclipse / scanning ) usa Github come repository e Travis con Sonarcloud per l’integrazione continua e l’analisi del codice.

Mentre l’analisi di Sonarcloud funziona correttamente sulle richieste di pull interne (richiama richieste da rami direttamente a eclipse / scanning), non funziona quando Travis esegue richieste di pull esterne (quelle da repository biforcati).

Il problema di fondo è che il modo in cui stiamo eseguendo sonarcloud al momento si basa su variabili d’ambiente che non sono popolate per richieste di pull esterne per ragioni di sicurezza:

Encrypted environment variables have been removed for security reasons. See https://docs.travis-ci.com/user/pull-requests/#Pull-Requests-and-Security-Restrictions 

Abbiamo il nostro repository impostato per non preoccuparci del funzionamento di Sonarcloud, ma ciò significa che spesso ci uniamo in cambiamenti che infrangono le regole di sonarcloud perché non ci rendiamo conto che sono stati interrotti. Vediamo solo che quelle regole sono state interrotte la prossima volta che vengono cambiate da qualcuno che invia direttamente al repository. Questo sposta l’onere di riparare Sonarcloud a scoprire i problemi dai collaboratori ai committer.

    Così,

    • C’è un modo per abilitare l’analisi Sonarcloud delle richieste pull dai repository biforcati senza introdurre problemi di sicurezza?

    Nota che questa domanda sembra essere un passo avanti rispetto a In Travis Public Repository come aggiungere una variabile Secure che funziona anche su richieste Pull che non hanno ancora una risposta.

    Come hai perfettamente intuito, a meno che tu non codifichi i token GitHub e SonarCloud (che ovviamente non vuoi, per non svelarli pubblicamente), non c’è attualmente modo di analizzare le richieste di pull esterne. Questo è documentato sulla pagina ufficiale di SonarCloud Travis .

    Al momento stiamo lavorando triggersmente su un modo per supportare adeguatamente questo caso d’uso – e spero che arriveremo a qualcosa prima della fine dell’anno.

    Questa probabilmente non è la soluzione facile che stai cercando, ma non penso che ci sia un modo molto più semplice per accedere ai segreti quando si creano richieste di pull a meno che Travis non aggiunga il supporto in qualche modo. Dopo tutto, le variabili segrete non sono disponibili per una buona ragione in quanto le richieste pull possono contenere codice arbitrario che viene eseguito durante la compilazione. Un utente malintenzionato potrebbe utilizzarlo per creare una richiesta di pull che modifichi il processo di compilazione per leggere le variabili di ambiente decrittografate e inviarle a lui.

    Il problema sottostante è che il codice su cui viene eseguita la generazione e il codice generato provengono dalla stessa origine (a volte non attendibile). Per poter utilizzare i segreti nel processo di compilazione, è necessario separare il codice generato e il codice generato e il codice di generazione deve provenire da una fonte attendibile. Nessun codice proveniente dalla fonte non attendibile deve essere eseguito a meno che non sia in modalità sandbox in modo che non possa accedere a nessuno dei segreti.

    Per quanto ne so, Travis non fornisce un metodo standard per raggiungere questo objective.

    Seguendo l’idea di separare il codice di build e il codice in fase di compilazione, dovrebbe essere comunque ansible eseguire un’analisi di Sonarqube contro richieste di pull esterne.

    Il primo passo sarebbe creare un nuovo “codice di build” del repository su Github che contenga solo gli script di build attendibili. Questi script sono responsabili del controllo della richiesta di pull e dell’esecuzione dell’analisi di Sonarqube. Poiché questi non fanno parte della richiesta di pull esterna, possono accedere a variabili segrete. Fai attenzione, però, a non eseguire i test unitari nella richiesta pull in quanto non attendibili.

    Il secondo passo consiste nell’innescare una build del repository “build code” ogni volta che viene effettuata una richiesta pull rispetto al repository del codice sorgente effettivo. Travis fornisce un’API per l’triggerszione delle build . Tuttavia, questo richiede anche un segreto. Quindi non possiamo semplicemente triggersre una build del repository “build code” quando si costruisce la richiesta pull. Quello che possiamo fare, però, è installare un webhook sul repository del codice sorgente su Github, che chiama un piccolo servizio web quando viene fatta una richiesta pull. Questo servizio chiama quindi l’API di Travis per triggersre una build del repository di codice build attendibile.

    Spero che abbia senso. Per favore fatemi sapere se qualcosa non è chiaro.

    Non l’ho ancora fatto da solo. Quindi non posso fornire alcun codice. Ma penso che non dovrebbe essere troppo difficile creare un piccolo servizio web che trasforma un webhook dalla richiesta di Github in una richiesta di compilazione per Travis.