Flyway & Azure DevOps : Conhecendo o Flyway
Tags: azure, devops, database, sql
Published: 2020-06-30 14:30:36

Falar sobre *DevOps* e sua cultura é chover no molhado. Hoje, os times já estão adotando, mesmo que lentamente, a cultura *DevOps* no seu dia a dia. 

Mas e o seu banco de dados? Ele está integrado na sua esteira de entrega continua? O *Continuous Delivery* envolve o seu banco de dados? Pois, se ainda não está, nesta série quero mostrar para vocês,  passo a passo, como podemos adicionar o nosso banco de dados relacional no seu pipeline com a ajuda de 2 poderosas ferramentas: **Azure DevOps** e **Flyway**. Vamos lá!?

# Tópicos
* [Requisitos](#chapter-1)
* [C.I. / C.D. para seu Banco de Dados](#chapter-2)
* [Flyway](#chapter-3)
* [Breve Histórico e Versões do Flyway](#chapter-4)
* [Como funciona o Flyway](#chapter-5)
* [Comandos Flyway](#chapter-6)
* [Instalando Flyway Community](#chapter-7)

## Requisitos <a name="chapter-1"></a>

- Conta no Azure DevOps (podemos utilizar a versão gratuita);
- Conta no Azure (usaremos para criar o nosso banco Azure SQL Database);

## C.I. / C.D. para seu Banco de Dados <a name="chapter-2"></a>

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/lm4k75r1t5an5gz79zrx.png)

*Continuous Delivery*, ou simplesmente, Entrega Contínua engloba publicar, de forma automática e usando ferramentas, o nosso código fonte até o destino final. E isso, deve também englobar o nosso banco de dados. 

Mas infelizmente, boa parte de projetos não adicionam o banco de dados na sua esteira de *deploy*. E isso pode gerar transtornos no C.I./C.D. da sua aplicação. No momento em que você não adicionar o script do banco no seu release, e mantem interação humana para atualização do banco, e possibilidade de falha torna-se grande, e grave!

Mas não é surpreendente, pois existem menos ferramentas para oferecer suporte ao DevOps para o banco de dados do que para *deploy* da sua aplicação.

Mas não significa que essas ferramentas não existam. E nesse artigo, quero falar sobre o Flyway. Com ele, podemos *commitar* o código do banco de dados para um sistema de controle de versão como GIT, adicionar a Integração Contínua, e claro, realizar a entrega contínua do seus scripts para banco de dados, passando pelos seus ambientes *Staging* ate chegar em Produção.
 

# Flyway <a name="chapter-3"></a>

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/cvnty1rfd6986l7gcpot.png)

**Flyway DB** é  uma ferramenta para controle da versão do nosso banco de dados relacional, e apesar de ser bem simples, ela é uma solução robusta e suporta os principais banco de dados baseados em SQL do mercado como Oracle, MySQL, MariaDB, SQL Server, PostgreSQL, DB2, SQLite e muitos outros.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/v3j5awxl4unjsandea4d.png)

*Na nossa demo, iremos usar o Azure SQL Database. Mas o procedimento para a maioria dos outros bancos suportados é o mesmo.*

# Breve Histórico e Versões do Flyway <a name="chapter-4"></a>

O Flyway é uma ferramenta de migração de banco de dados de código aberto e foi adquirido pela empresa [Redgate](https://www.red-gate.com/) em julho de 2019. 
E a partir disso,  temos a versão community , PRO e a versão enterprise.

Neste [link](https://flywaydb.org/download/) podemos ver as diferenças entre as versões.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ed6iyk97setg1kfgrz6k.png)

A versão community suporta todas as versões atuais dos bancos de dados relacionais. Mas temos um "porém". Por exemplo, o banco SQL Server 2014 é apenas suportado na versão Enterprise. Fique atento sobre essas restrições na versão *Community*. 

## Como funciona o Flyway <a name="chapter-5"></a>

> **SIMPLES,  FOCO NA SOLUÇÃO e PODEROSO** 

Essa é a promessa do Flyway e ela é cumprida com maestria.

Sua utilização é muito simples. 

Podemos rodar scrips via [Java API](https://flywaydb.org/getstarted/firststeps/api), [Maven](https://flywaydb.org/getstarted/firststeps/maven) e [Gradle](https://flywaydb.org/getstarted/firststeps/gradle). 

Além disso, podemos rodar a partir de comandos. E sera assim que iremos executá-lo.

Um único comando e seu script SQL é migrado em segundos.

O primeiro passo é  criar um script SQL. E pode usar essa nomenclatura:

> V1__MeuPrimeiroScript.sql

> V2__MeuSegundoScript.sql

Onde *V1__* e *V2__* indica a versão crescente de execução do script. Com isso, você controla o que está migrando através do nome dos seus scripts SQL. 

## Comandos Flyway <a name="chapter-6"></a>

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/he8af1s7dw5amy01ar0a.png)

`flyway info`

Usamos esse comando para verificar o status do seus scripts e principalmente, obter informações do que será migrado antes de efetuar a migração.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/yqkrpqbn3shdxrmz7q77.png)

`flyway migrate`

Esse é o comando que executa os scripts SQL, por ordem crescendo da versão indicada no nome do arquivo.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/fs27k7oei9kotrqid8i3.png)

`flyway clean`

Esse comando limpa o nosso banco de dados. Todos os objetos como tabelas, views, procedures e triggers serão *droppadas*.

**Esse comando nunca deve ser executado em produção. Utilize apenas quando você precisar limpar bases de desenvolvimento ou testes.**

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/r7i38ttf8b113hwmbzwy.png)

`flyway validate`

Esse comando valida se as migrações a serem aplicadas no nosso banco de dados estão de acordo com o que aplicamos no nosso banco local.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/90kfex4brxcl2esrk9l0.png)


`flyway undo`

Podemos adicionar *tags* nas nossas migrações. E através delas, podemos reverter scripts incorporados posteriormente.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/6bthhuo4nhh4n8dspdo5.png)

`flyway repair`

Esse comando corrige problemas que podemos ter na nossa tabela de histórico do schema (*flyway_schema_history*).

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/x3kpzkbkqbke8wlhy0r6.png)

`flyway baseline`

Usamos esse comando em banco de dados existentes, atualizando com uma versão especifica.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/2hgk2v26k1rjcwn0u5x8.png)

## Instalando Flyway Community <a name="chapter-7"></a>

Podemos instalar o Flyway no Windows, Linux e MacOs sem problemas. Irei mostrar passo a passo como instalar no Windows 10, mas nesse link, você pode ver como é simples a instalação também no [Linux](https://flywaydb.org/documentation/commandline/#download-and-installation) e [MacOs](https://flywaydb.org/documentation/commandline/#download-and-installation).

E primeiro, precisamos acessar esse [link](https://flywaydb.org/documentation/commandline/#download-and-installation)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/gs2xk7p60h90t37bzqoq.png)

E vamos baixar! Atualmente esta na versão 6.5.0 e esta com o tamanho de 87.7MB.

Depois de finalizado o download, vamos descomprimir o arquivo no diretório de sua escolhe. Por exemplo, na raiz do `C:/`.

Podemos inclusive ter 2 ou mais versões do Flyway na mesma máquina, conforme imagem abaixo.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/c2q0ut73bu2qkmft6vxh.png)

Dentro do Flyway, temos essas pastas e  arquivos:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/6vhiwb6di6up6gep09n9.png)

Para o *flyway.cmd*, iremos enviar os nossos comandos desejados.
Na pasta *conf*, temos o arquivo *flyway.conf*.

Abrindo ele, vemos diversas de configurações.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/jfr3zldkjwf1slm3ae4m.png)

Os principais parâmetros para configuração:

- *flyway.url*: devemos indicar o JDBC que queremos conectar. Temos uma lista de exemplos no arquivo, como SQL Server, MySQL, Oraclee MariaDB.

- *flyway.user*  e *flyway.passwork*: usuário e senha do nosso banco de dados.

- *flyway.table*: nome da tabela que será criada para controle das versões (histórico) de scripts executados no banco. Se não for preenchido, assumirá o valor padrão que é *flyway_schema_history*.

Por enquanto, não iremos alterar nada. 

Vamos abrir o *command* do Windows, navegar até a pasta onde instalamos o *flyway* e executar o comando `flyway info`.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/gn5p0x923mvqkln57exh.png)

E ele nos avisa que não foi possível conectar ao banco porque não configuramos a URL do nosso JDBC, usuário e senha. E isso faremos no próximo post dessa serie.

:)