--- title: Tenere un Changelog description: Non lasciare che i tuoi amici facciano copia incolla dei git logs nei changelog. language: it-IT version: 1.1.0 --- .header .title %h1= current_page.data.title %h2= current_page.data.description = link_to data.links.changelog do Versione %strong= current_page.metadata[:page][:version] %pre.changelog{ lang: "en" }= File.read("CHANGELOG.md") .answers %h3#what %a.anchor{ href: "#what", aria_hidden: "true" } Cos'è un changelog? %p Un changelog è un file che contiene una lista curata e ordinata cronologicamente delle modifiche degne di nota per ogni versione di un progetto. %h3#why %a.anchor{ href: "#why", aria_hidden: "true" } Perché tenere un changelog? %p Per rendere facile agli utilizzatori e contribuenti vedere con precisione quali modifiche importanti sono state fatte tra ogni release (o versione) del progetto. %h3#who %a.anchor{ href: "#who", aria_hidden: "true" } Chi ha bisogno di un changelog? %p Le persone ne hanno bisogno. Che si tratti di consumatori o di sviluppatori, gli utenti finali sono persone interessate a ciò che avviene in esso. Se il software è cambiato, allora le persone vogliono sapere come e perché. .good-practices %h3#how %a.anchor{ href: "#how", aria_hidden: "true" } Come posso fare un buon changelog? %h4#principles %a.anchor{ href: "#principles", aria_hidden: "true" } Linee guida %ul %li I changelog sono per le persone, non per le macchine. %li Dovrebbe esserci una voce per ogni singola versione. %li Le modifiche dello stesso tipo dovrebbero essere raggruppate. %li Versioni e sezioni dovrebbero essere collegabili. %li L'ultima versione viene per prima. %li Viene mostrata la data di release di ogni versione. %li Si dichiara se il progetto segue il #{link_to "Versionamento Semantico", data.links.semver}. %a.anchor{ href: "#types", aria_hidden: "true" } %h4#types Tipologie di cambiamenti %ul %li %code Added per le nuove funzionalità. %li %code Changed per le modifiche a funzionalità esistenti. %li %code Deprecated per le funzionalità che saranno rimosse nelle future release. %li %code Removed per funzionalità rimosse in questa release. %li %code Fixed per tutti i bug fix. %li %code Security per invitare gli utilizzatori ad aggiornare in caso di vulnerabilità. .effort %h3#effort %a.anchor{ href: "#effort", aria_hidden: "true" } Come posso ridurre gli sforzi necessari a mantenere un changelog? %p Tieni una sezione Unreleased in cima al changelog in modo da tenere traccia dei cambiamenti imminenti. %p Questo serve per due scopi: %ul %li Le persone possono vedere quali modifiche si possono aspettare nelle future release. %li Ad una nuova release, si deve solo spostare i cambiamenti della sezione Unreleased in una nuova sezione con il corrispettivo numero di versione. .bad-practices %h3#bad-practices %a.anchor{ href: "#bad-practices", aria_hidden: "true" } I changelog possono essere cattivi? %p Sì. Ecco alcuni modi in cui possono essere meno utili. %h4#log-diffs %a.anchor{ href: "#log-diffs", aria_hidden: "true" } Commit log diffs %p Usare i commit log diffs al posto dei changelog è una brutta idea: contengono solo cose superflue. Cose come i merge commits, i commits con titoli oscuri, le modifiche della documentazione, etc. %p Lo scopo di un commit è quello di documentare un passo nell'evoluzione del codice sorgente. Alcuni progetti ripuliscono i commit, altri non lo fanno. %p Lo scopo di una voce changelog è quello di documentare le differenze rilevanti, spesso attraverso commit multipli, per comunicarli in modo chiaro agli utenti finali. %h4#ignoring-deprecations %a.anchor{ href: "#ignoring-deprecations", aria_hidden: "true" } Ignorare le deprecazioni %p Quando le persone aggiornano da una versione ad un'altra, dovrebbe essere dolorosamente chiaro che qualcosa si romperà. Dovrebbe essere possibile eseguire l'aggiornamento a una versione che elenca le deprecazioni, rimuovere ciò che è deprecato, quindi aggiornare alla versione in cui le deprecazioni diventano rimozioni. %p Se non fai nient'altro elenca le deprecazioni, le rimozioni e qualsiasi altro cambiamento nel tuo changelog. %h4#confusing-dates %a.anchor{ href: "#confusing-dates", aria_hidden: "true" } Confusione delle date %p I formati di date variano da Paese a Paese e spesso trovare un formato human-friendly che sia intuitivo per tutti è cosa ardua. Il vantaggio delle date formattate come 2017-07-17 è che seguono l'ordine dal maggiore al minore: anno, mese e giorno. Inoltre questo formato non ha sovrapposizioni ambigue con altri formati di date, a differenza di alcuni formati regionali che scambiano la posizione del mese e del giorno. Queste motivazioni e il fatto che questo formato di data è uno #{link_to "standard ISO", data.links.isodate} spiegano perché questo è il formato di date raccomandato per i changelog. %h4#inconsistent-changes %a.anchor{ href: "#inconsistent-changes", aria_hidden: "true" } Modifiche incoerenti %p Un changelog che menziona solo alcune delle modifiche può essere pericoloso tanto quanto non avere un changelog. Nonostante molte delle modifiche possano essere irrilevanti - per esempio, nella maggior parte dei casi rimuovere un singolo spazio non necessita di essere documentato - ogni modifica importante deve essere menzionata nel changelog. Applicando in maniera incoerente le modifiche, gli utenti possono erroneamente pensare che il changelog sia l'unica fonte di verità attendibile. E in realtà dovrebbe esserlo. Da un grande potere derivano grandi responsabilità - avere un buon changelog significa avere un changelog costantemente aggiornato. %aside C'è di più. Aiutatemi a collezionare altre situazioni cattive = link_to "aprendo un issue", data.links.issue o una pull request. .frequently-asked-questions %h3#frequently-asked-questions %a.anchor{ href: "#frequently-asked-questions", aria_hidden: "true" } Domande frequenti %h4#standard %a.anchor{ href: "#standard", aria_hidden: "true" } Esiste un formato standard per i changelog? %p Non esattamente. Esistono le linee guida GNU sullo stile dei changelog, oppure i due lunghi paragrafi nel documento di GNU NEWS denominato "guideline". Entrambe sono inadeguate o insufficienti. %p Questo progetto vuole essere = link_to "una migliore convenzione per i file changelog.", data.links.changelog Per questo motivo osserviamo le migliori pratiche della comunità open source e le portiamo avanti. %p Critiche, discussioni e suggerimenti per migliorare = link_to "sono ben accetti.", data.links.issue %h4#filename %a.anchor{ href: "#filename", aria_hidden: "true" } Come si dovrebbe chiamare il file di changelog? %p Chiamalo CHANGELOG.md. Alcuni progetti usano anche HISTORY, NEWS o RELEASES. %p Risulta facile pensare che il nome del tuo file changelog non sia poi così importante, allora perché non rendere facile la vita ai tuoi utenti, usando sempre lo stesso nome? %h4#github-releases %a.anchor{ href: "#github-releases", aria_hidden: "true" } Cosa dire delle GitHub Releases? %p È una bella iniziativa. #{link_to "Releases", data.links.github_releases} può essere usato per rendere semplice i git tags (per esempio il nome del tag v1.0.0) all'interno di note di rilascio ben dettagliate mediante l'aggiunta manuale delle note di rilascio oppure è possibile estrarre i messaggi annotati dei git tag e trasformarli in note. %p GitHub Releases crea un changelog non-portable che può essere solo visualizzato dagli utenti nel contesto di GitHub. È possibile farlo apparire molto simile al formato di Keep a Changelog, tuttavia tende ad essere un po' più complicato. %p La versione corrente di GitHub Releases risulta inoltre probabilmente poco rilevante per gli utenti finali, a differenza dei tipici file maiuscoli (README, CONTRIBUTING, etc.). Un altro problema minore è che l'interfaccia non offre attualmente link per la creazione di log tra ciascuna release. %h4#automatic %a.anchor{ href: "#automatic", aria_hidden: "true" } I changelog possono essere analizzati automaticamente? %p È difficile, perché le persone usano formati e nomi di file profondamente diversi. %p #{link_to "Vandamme", data.links.vandamme} è una Ruby gem creata dal team Gemnasium ed è in grado di fare il parsing dei changelog di molti (ma non tutti) i progetti open source. %h4#yanked %a.anchor{ href: "#yanked", aria_hidden: "true" } Cosa sono le release "yanked"? %p Le release "yanked" sono versioni che sono state rimosse a causa di bug seri o problemi di sicurezza. Spesso queste versioni non appaiono nei changelog. Invece dovrebbero esserci, nel seguente modo: %p ## [0.0.5] - 2014-12-13 [YANKED] %p L'etichetta [YANKED] è in maiuscolo per un motivo. È importante che le persone la notino. Poiché è racchiusa tra parentesi quadre è anche più semplice da riconoscere nel parsing automatico. %h4#rewrite %a.anchor{ href: "#rewrite", aria_hidden: "true" } Si dovrebbe mai modificare un changelog? %p Certo. Ci sono sempre buoni motivi per migliorare un changelog. Io apro regolarmente delle pull request per aggiungere release mancanti ai progetti open source che non mantengono correttamente i changelog. %p È anche possibile che si scopra di aver dimenticato di annotare una modifica non retro-compatibile nelle note per una versione. Ovviamente è importante aggiornare il changelog in questo caso. %h4#contribute %a.anchor{ href: "#contribute", aria_hidden: "true" } Come posso contribuire? %p Questo documento non è la verità assoluta; è solo la mia attenta opinione, arricchita dalle informazioni ed esempi che ho raccolto. %p Questo perché voglio che la nostra comunità raggiunga un consenso. Credo che la discussione sia importante almeno quanto il risultato finale. %p Quindi per favore #{link_to "partecipate", data.links.repo}. .press %h3 Dialogo %p Sono andato a #{link_to "The Changelog podcast", data.links.thechangelog} per parlare del perché i gestori e i contributori dovrebbero preoccuparsi dei changelog e anche delle motivazioni dietro questo progetto.