Personal tools
Come rilasciare un pacchetto senza più pensieri: zest.releaser

Semplice guida per il rilascio di pacchetti in python

Sep 20, 2012

Come rilasciare un pacchetto senza più pensieri: zest.releaser

Stanchi di perdere la testa ad ogni rilascio di un nuovo pacchetto? Ecco il prodotto che fa per voi!

Per uno sviluppatore software, un aspetto fondamentale della propria vita è il rilascio e pacchettizzazione dei propri prodotti, in modo da renderli disponibili a tutti in un formato facilmente utilizzabile.

Per python, in particolare, si creano i cosiddetti "egg". Se poi lo sviluppatore ha anche un animo open-source e vuole rendere il suo prodotto accessibile al mondo intero, allora lo vorrà pubblicare anche su pypi, il repository ufficiale di tutti i pacchetti python.

Il processo di rilascio di un nuovo prodotto (o una nuova versione dello stesso) di solito consiste in diverse fasi:

  • commit di tutte le modifiche sul repository utilizzato (perché tutto il codice va versionato, vero?)
  • creazione di un tag per la nuova versione, in modo da mantenere uno storico delle varie versioni rilasciate nel tempo
  • creazione dell'egg
  • eventuale pubblicazione su pypi.

Per eseguire tutte queste operazioni bisogna dunque inserire una serie di comandi in sequenza, che variano a seconda del sistema di versionamento utilizzato (ad esempio "svn ci" se si usa svn, oppure "git push" se invece si usa git) e da dove si vuole pubblicare il proprio prodotto.

assembly lineSpesso, durante lo sviluppo di un progetto, capita di mettere mano a diversi prodotti (è capitato anche una decina) e doverli rilasciare in produzione in un'unica volta.
Andrebbero ripetute le varie operazioni di rilascio (commit, tag, release e pubblicazione) per ogni singolo prodotto toccato, trasformando il lavoro dello sviluppatore in un semplice automa che svolge operazioni in sequenza (come in una catena di montaggio), con il rischio di distrarsi e magari dimenticarsi qualche passaggio (ad esempio la creazione del tag).

Per rendere la vita più semplice agli sviluppatori, sono stati creati i cosiddetti releaser, che si occupano di automatizzare tutto il processo di pubblicazione, liberando l'utente da una procedura lenta e dispendiosa (soprattutto in termini di tempo), chiedendo solo alcune informazioni necessarie al completamento dell'operazione.

Uno dei migliori che ho provato e adottato ultimamente è zest.releaser.

E' un prodotto che si può installare tranquillamente nel proprio python di sistema:

pip install zest.releaser
easy_install zest.releaser

oppure lo si può inserire all'interno di un buildout, come spiegato nella documentazione ufficiale:

[buildout]
parts = scripts

[scripts]
recipe = zc.recipe.egg
eggs = zest.releaser

Una volta installato, saranno disponibili 4 nuovi script:

  • prerelease
  • release
  • postrelease
  • fullrelease

I nomi parlano già da soli, ma una piccola spiegazione la si può dare:

prerelease si occupa di preparare il prodotto per la release. Aggiorna quindi la versione del prodotto e l'history con la data corrente ed esegue il commit di queste modifiche.

release effettua il rilascio effettivo. Crea un nuovo tag con la versione aggiornata, scarica i sorgenti del tag appena creato, compila l'egg e, se lo si vuole pubblicare, permette di pubblicarlo nei vari repository impostati nel file pypirc (per esempio su pypi e su plone.org).

postrelease si occupa di preparare il prodotto per la prossima release, quindi aggiorna il numero di versione appendendo la dicitura "dev", e crea una nuova riga nel file di history per la nuova versione.

fullrelease invece esegue tutti gli altri 3 comandi in ordine.

Per ogni operazione, basta solamente posizionarsi nella root del prodotto, lanciare lo script desiderato e rispondere alle varie domande che vengono poste ad ogni operazione.
In questo modo si riesce a rilasciare un prodotto in poco tempo e senza dover impazzire a ricordare i vari comandi da usare.

Sono parecchi mesi che ho iniziato ad usare questo releaser, e mi sono trovato benissimo. Una volta che si è iniziato a fare i rilasci con questo metodo, basta utilizzare sempre fullrelease e ci si dimentica di tutto il resto, in quanto il pacchetto sarà sempre già predisposto a un futuro rilascio.

L'unico accorgimento da adottare al primo utilizzo (ma che dovrebbe essere la regola di ogni egg) è che il file setup.py e il file di history siano scritti in modo corretto.

A questo proposito, il buon Luca Fabbri ha scritto 2 interessanti post nel suo blog:

Release products for Plone: some bad and good attitude

Documentation for Plone products: some bad and good attitude

Filed under: ,
comments powered by Disqus