# Releases

## Definição

**Releases** são *branches* de preparação de um novo lançamento em produção e elas permitem pequenas correções de bugs e preparação de metadados para publicação (número da versão, datas de construção, entre outras definições).\
\
Por convenção elas têm o prefixo **release/**.\
Por exemplo:

* release/v1.0.0

&#x20;Importante ressaltar que as *releases* são criadas **sempre** à partir da **branch&#x20;*****develop***.

{% hint style="info" %}
O momento ideal para criar um  novo *branch* release é quando o desenvolvimento (quase) reflete o estado desejado do novo lançamento. Pelo menos todos os recursos que são direcionados para o lançamento a ser construído devem estar presentes no *branch* **develop**.
{% endhint %}

![](https://3697290398-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7iQOq9eJJ2zoW1Ls4P%2F-McolMvlze5x_rcyMtX7%2F-Mcoz_JfjM3cOQeznFTD%2FRelease%20-%20GitFlow.gif?alt=media\&token=634542f1-7eda-4cf4-83d3-47cca90963ef)

{% hint style="info" %}
*Descrição da imagem:* Criação de duas features a partir da develop *(F - Nova feature)* e no final do desenvolvimento das funcionalidades *(C - Commit)* é realizada a mesclagem com a develop *(M - Merge)*. Logo após é **criada uma release** *(R - Nova release),* onde pode haver alteração do número de versão e outras definições e por fim, **a mesclagem com o branch master** *(M - Merge)* e o código atualizado volta a ser integrado também, à **develop**.
{% endhint %}

## **Releases na prática** :sunglasses:&#x20;

### Pré-requisitos

* Ter o GIT instalado
* Qualquer repositório com o [fluxo do Git Flow inicializado e configurado](https://developers-friends.gitbook.io/blog/git/git-flow-1/configuracao-inicial).

### 1. Criação de releases

Para criar uma release é bem simples:

> `git flow releases start <número-versão-proposta>`

Com um comando neste padrão, **será criada um novo&#x20;*****branch*** **através da develop** com o prefixo *release/ ,* seguido do número de versão que você inserir.

Execute:

```
git flow release start v1.0.0
```

O retorno do comando é um novo *branch* entitulado **release/v1.0.0** e já é realizado *checkout* nesse novo *branch*.

*`[saída do console]`*                                                       \
`Switched to a new branch 'release/v1.0.0'`\
\
`Summary of actions:`\
`- A new branch 'release/v1.0.0' was created, bases on 'develop'`\
`- You are now on branch 'release/v1.0.0'`\
\
`Follow-up actions:`\
`- Bump the version number now!`\
`- Start commtting last-minute in preparing your release`\
`- When done, run:`\
\
&#x20;     `git flow release finish 'v1.0.0'`&#x20;

### 2. Finalização de **releases**

Após terminar a **preparação da aplicação para ser lançada em produção**, o *branch* estará pronto para ser **finalizado** e **mesclado** tanto na *master* quanto na *develop*.

Então você verificou que **está na release, não há nenhum commit a ser feito e nenhum arquivo pendente**...

```
git checkout release/v1.0.0
git status
```

> *`[saída do console]`*                                \
> `No ramo release/v1.0.0`                            \
> `nothing to commit, working tree clean`

#### Para **finalizar uma release**, basta:

> `git flow release finish <número-versão-proposta>`\
> \
> `O número da versão da release é opcional quando você já está presente(checkout) nela.`

Execute:

```
git flow release finish
```

Após esta instrução, **aparecerá a possibilidade de escrever uma mensagem** que descreverá a versão lançada (*nota de versão*).

*`[console]`*                                                       \
`#`\
`# Write a message for tag:`\
`#  v1.0.0`\
`# Lines starting with '#' will be ignored.`                     &#x20;

{% hint style="info" %}
A finalização de uma release marca a **criação de uma** **tag** correspondente ao número de versão entitulado no branch release.
{% endhint %}

Depois de escrever a mensagem, a release **será meclada(merge) a master E a develop**, em seguida deletada *tanto localmente como remotamente*.

> Switched to branch 'master'\
> Your branch is up to date with 'origin/master'.\
> To \<url-repositorito-remoto>\
> &#x20;\-  \[deleted]                          release/v1.0.0\
> Deleted branch release/v1.0.0 (was 713d5ac).

> Summary of actions:
>
> * Release branch 'release/v1.0.0' has been merged into 'master'
> * The release was tagged 'v1.0.0'
> * Release branch 'release/v1.0.0' has been locally deleted; it has been remotely deleted from 'origin'
> * You are now on branch 'master'

## Considerações finais

{% hint style="success" %}
*Para garantir que o repositório remoto estará atualizado baseando no status da sua estação de trabalho local, execute os comandos abaixo:*

**EMPURRE (push) as atualizações de todos os branches**

> ```typescript
> git push --all
> ```

**SUBA (push) a tag recentemente criada**

> ```typescript
> git push --tags
> ```

{% endhint %}

{% hint style="info" %}
Nesta **seção sobre Git Flow** você encontrará explicações e usos práticos sobre **features, hotfixes, tags e muito mais.**
{% endhint %}

Pronto, para trabalhar com releases de forma simples e rápida, é isto!!

**Obrigado por chegar até aqui!** :grin:

![O Autor](https://3697290398-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7iQOq9eJJ2zoW1Ls4P%2F-M7rzbybQyuuzqS3aWif%2F-M7mSFYhAx839DBqUSiW%2Fcartao-danilo.png?alt=media\&token=8454d694-e186-4db2-9072-d6404c23d5b4)
