====== Versionamento Semântico ======
Para padronizar as versões de nossos softwares, adotamos o padrão [[https://semver.org|Semantic Versioning 2.0.0]].
Este artigo descreve o padrão de versionamento semântico.
===== Objetivos =====
* Identificar nossos softwares através da versão.
* Trazer clareza e previsibilidade sobre a mudança de versão.
* Saber o que muda de uma versão para a outra. (Se é um bug, um feature)
* Saber se a API de uma versão é compatível com a anterior.
* Permitir automatizar o versionamento durante o CI. Veja: [[pres:gerti:devops:informacoes:nomenclatura_commits|Nomenclatura dos Commits]]
===== Como funciona? =====
Esse padrão adiciona versões no formato: ''%%1.2.3%%'', ''%%1.3.0%%'', ''%%2.0.0%%''.
Ele permite saber:
- Se uma versão é retro-compatível com outra.
- O que muda de uma versão para outra. (Se é correção de bug ou se é feature)
==== Formato da versão ====
As versões de nossos softwares terão o seguinte formato:
..
Por exemplo: ''%%1.3.4%%'', ''%%1.11.0%%'', ''%%3.0.1%%''.
==== Patch ====
O ''%%Patch%%'' significa **correções de bugs**. Sempre que houver uma correção de bug, o ''%%Patch%%'' aumenta em 1.
Exemplos:
* ''%%1.3.0%%'' -> ''%%1.3.1%%''
* ''%%2.15.23%%'' -> ''%%2.15.24%%''
==== Minor ====
O ''%%Minor%%'', número do meio, significa **implementação de feature**. Sempre que houver uma implementação de feature, o ''%%Minor%%'' aumenta em 1, e o ''%%Patch%%'' **reseta** para 0.
Exemplos:
* ''%%1.0.4%%'' -> ''%%1.1.0%%''
* ''%%3.4.1%%'' -> ''%%3.5.0%%''
* ''%%1.9.0%%'' -> ''%%1.10.0%%''
==== Major ====
O ''%%Major%%'', 1⁰ número, indica que houve uma **BREAKING CHANGE** (mudança que quebra a compatibilidade com as versões anteriores). Sempre que houver uma **Breaking Change** o ''%%Major%%'' aumenta em 1, e o ''%%Minor%%'' e o ''%%Patch%%'' **resetam** para 0.
Exemplos:
* ''%%1.3.4%%'' -> ''%%2.0.0%%''
* ''%%4.13.72%%'' -> ''%%5.0.0%%''
=== Breaking Change ===
Breaking changes são mudanças que quebram a retrocompatibilidade com as versões anteriores.
Isso significa que, se houver outros programas que consumam da API desse programa, atualizar para a nova versão pode quebrar o programa que chama a API.
Isso pode acontecer por exemplo pois o nome do endpoint que era ''%%/get_nome/%%'' virou ''%%/nome/%%''. Quebrando a retrocompatibilidade.
===== Retrocompatibilidade =====
Sobre a retrocompatibilidade, versões que possuem a **mesma Major** são **compatíveis**, e versões que possuem **Major diferentes** **não** são **compatíveis**.
==== Na prática ====
- É tranquilo atualizar da versão ''%%7.3.0%%'', para a ''%%7.4.0%%''.
- Já atualizar da ''%%7.4.0%%'' para a ''%%8.0.0%%'' pode quebrar algum código, e requer uma análise. Vale a pena então olhar o Changelog para entender quais foram as mudanças entre cada versão.
===== Automação no CI/CD =====
Não será necessário aplicar as tags manualmente. A Pipeline de CI/CD possui um [[https://gitsource.tce.go.gov.br/GER-TI/tce.kubernetes/tce.templates/-/tree/main/templates/versioning|Job de Versionamento]] que aplica o versionamento **automaticamente**, com base no nome do commit, veja: [[pres:gerti:devops:informacoes:nomenclatura_commits|Nomenclaturas Commits]]