Scopri tutti gli articoli e le iniziative nelle varie sezioni del portale

Più consultati


Tags

JFrog: il repository manager per la toolchain DevOps

27/02/2017


Introduzione

Lo sviluppo del software, se condotto su larga scala con più sistemi coinvolti a cui interfacciarsi, può essere un processo complesso, con il coinvolgimento di decine di gruppi di sviluppo, ognuno composto da decine di sviluppatori. In tali condizioni si fa praticamente sempre ricorso ad un sistema di gestione dei file sorgenti, noto come CVS, Code Versioning System, ovvero a sistemi come Git o Subversion, che permettono di versionare i file sorgenti e tenere traccia delle modifiche effettuate a questi nel tempo.

L’output della fase di build dei sorgenti fornisce dei file binari, o in generale degli artifact; questi costituiscono i blocchi fondamentali (librerie, frameworks, etc…) su cui software sempre più evoluti si appoggiano. Come i file sorgenti, anche gli artifact vengono versionati e resi accessibili. I sistemi che permettono il download, il versionamento, l’accesso agli artifact sono detti artifact repository. In questo articolo vedremo le possibilità messe a disposizione da uno di essi: JFrog.

Download e installazione


 JFrog può essere scaricato come semplice archivio ZIP o da un package manager per le principali distribuzioni linux o come immagine Docker. Una volta installato e avviato (il che per la versione ZIP si traduce semplicemente nell’estrazione del ZIP e nell’avvio lanciando un semplice script o impostandolo come servizio di sistema), la webapp di JFrog è disponibile di default sulla porta 8081 della macchina di installazione, dove è possibile effettuare un primo login con le credenziali predefinite di amministrazione (le quali possono essere trovate nella guida d’utente).

I repository

JFrog è uno degli artifact manager maggiormente completi. Nella versione gratuita è possibile creare repository delle seguenti tipologie: generico, Gradle, Ivy, Maven, SBT, a cui si aggiungono, nella versione a pagamento: Bower, CocoaPods, Conan, debian, Docker, Gems, Git LFS, npm, NuGet, Opkg, Composer, PyPI, rpm, Vagrant. Serve altro?


 

Figura 1. I repository gestiti da JFrog


A valle del primo login, è immediatamente presentata l’interfaccia per la creazione di un repository, da affiancare a quello generico già presente di default. Cliccando su maven, ad esempio, vengono creati 5 distinti repository di default: due fisicamente residenti sul server, 2 virtuali e 1 remoto

I due repository fisici servono ad accogliere i nostri artifact (uno per le release stabili, un altro per le release intermedie), l’unico server remoto è jcenter. Un repository virtuale, invece, è un repository che raggruppa più repository. Nella fattispecie, il primo repository creato è l’unione tra il nostro repository delle release intermedie e jcenter, mentre l’altro è l’unione tra il nostro repository delle release stabili e jcenter. Può sembrare un’organizzazione bizzarra, ma in realtà è incredibilmente utile; Indicando difatti nel nostro build automation tool (Gradle, Maven, Ivy che sia) solo l’endpoint di un repository virtuale, sarà possibile usare nei nostri programmi, anche librerie pubbliche disponibili su jcenter; ovvero JFrog fa da proxy verso uno dei più importanti artifact repository pubbliici al momento esistenti.

JFrog e la sicurezza


 La gestione della sicurezza, tanto semplice quanto completa, si basa sui concetti di utente, gruppo e permessi.

È possibile definire dei nuovi amministratori, stabilire una policy di scadenza periodica delle password, nonché delegare l’autenticazione a un server LDAP esterno. Supporta inoltre i principali schemi di single sign-on (SAML su tutti).

Per ogni repository l’amministratore può scegliere quali utenti hanno quali permessi tra read, ovvero sola lettura, deploy, ovvero aggiunta di una nuova versione di un artifact nel repository, delete/overwrite, ovvero sovrascrittura e cancellazione del contenuto di un repository, e manage, ovvero gestione completa del repository. Gli utenti possono essere anche catalogati in gruppi e i permessi descritti sopra possono essere assegnati a un gruppo invece che ad un singolo utente.


 

Figura 3. I gruppi a cui appartiene uno dei redattori dell’articolo con i relativi privilegi

Inoltre è possibile anche assegnare dei privilegi all’account anonimo, che, eventualmente, è possibile anche disattivare del tutto.

JFrog e Gradle: l’integrazione con un build automation tool.


In un prossimo articolo parleremo più dettagliatamente del build automation tool che utilizziamo internamente nel nostro gruppo di sviluppo, ovvero Gradle. Adesso però vediamo quanto facilmente sia integrabile JFrog con Gradle.

Avendo creato un repository di tipo maven, è sufficiente aggiungere le seguenti righe al file build.gradle affinché il repository sia utilizzabile da Gradle

repositories {
    maven {
        url 'http://hostname:8081/artifactory/maven-repo/'
        credentials {
            username 'username'
            password 'password'
        }
    }
}

L’url ci viene fornita da JFrog (e copiata negli appunti), in modo da minimizzare così gli errori. Il riferimento ad un particolare pacchetto avviene con la duplice sintassi di Gradle, ovvero:

dependencies {
      compile(group: 'it.tim', name: 'ce-libs', version: '1.1')
}

oppure, sinteticamente:

dependencies {
      compile('it.tim:ce-libs:1.1');
}

Ancora una volta JFrog ci viene incontro per evitare errori di battitura e, una volta scelto un pacchetto che si vuole aggiungere come dipendenza ad un progetto, ci permette di copiare negli appunti la sintassi per aggiungerla nel file di configurazione del nostro build automation tool: Maven, Gradle, Ivy, SBT che sia…


Figura 4. La direttiva Gradle per una delle librerie interne

Opzioni Avanzate

Tra le opzioni avanzate abbiamo la possibilità di esportare tanto tutti i repository con i loro pacchetti in un file ZIP che possiamo utilizzare per ricreare successivamente sullo stesso server o su un’altra istanza di JFrog la struttura dei nostri repository, quanto tutte le impostazioni del server, sì da replicarlo perfettamente uguale su un’altra macchina.

Inoltre si integra con Sumo Logic per operazioni di Log Analisys, permette di impostare lo svuotamento periodico della cache dei pacchetti inutilizzati, di cancellare del tutto le versioni precedenti, nonché, in generale, di tenere sott’occhio lo spazio disco utilizzato ed implementare policy volte a non eccedere con il consumo dello spazio di storage.


Gianluca Coviello

Full-stack Developer/Solutions Provider

TIM

Paolo Vitiello

Full-stack Developer/Solutions Provider

TIM