Bitbucket Pipeline CI/CD usando Git FTP



Introdução


A proposta desse artigo é apresentar de forma resumida uma solução para um ciclo de build/deploy para ambientes locais usando Bitbucket.

Pré Requisitos

Pra prosseguir nesse artigo, considero que você tenha:
  • Conhecimento básico de Linux
  • Conhecimento básico de Bitbucket
  • Conhecer Docker - mesmo que superficialmente

Configurando o Servidor

Cada servidor tem um método de conexão, então pesquise como é feita a conexão com o Bitbucket para seu provedor. A maioria deles têm suporte para conexão com o Bitbucket - eu usei para teste o Kinghost. Consulte o suporte.

Configurando o Bitbucket


Clique em Repository settings.



E em seguida em Pipelines=>Settings.

E habilite os pipelines.



Configurando o pipeline

Configurando o repositório

Primeiro defina as variáveis do repositório em Repository settings=>Pipelines=>Repository variables.



FTP_SERVER, FTP_USER e FTP_PASSWORD

Configurando o pipeline

bitbucket-pipelines.yml

pipelines:

   custom:

       init-production:

           - step:

               script:

                 - apt update

                 - apt install -y git-ftp

                 - git config git.ftp.syncroot ./

                 - git config git-ftp.url $FTP_SERVER/loja

                 - git config git-ftp.user $FTP_USER

                 - git config git-ftp.password $FTP_PASSWORD

                 - git ftp init

       init-staging:

           - step:

               script:

                 - apt update

                 - apt install -y git-ftp

                 - git config git.ftp.syncroot ./

                 - git config git-ftp.url $FTP_SERVER/staging

                 - git config git-ftp.user $FTP_USER

                 - git config git-ftp.password $FTP_PASSWORD

                 - git ftp init

   branches:

       master:

           - step:

               name: Deploy production

               deployment: production

               script:

                 - apt update

                 - apt install -y git-ftp

                 - git config git.ftp.syncroot ./

                 - git config git-ftp.url $FTP_SERVER/loja

                 - git config git-ftp.user $FTP_USER

                 - git config git-ftp.password $FTP_PASSWORD

                 - git ftp push

       staging:

           - step:

               name: Deploy staging

               deployment: Staging

               script:

                 - apt update

                 - apt install -y git-ftp

                 - git config git.ftp.syncroot ./

                 - git config git-ftp.url $FTP_SERVER/staging

                 - git config git-ftp.user $FTP_USER

                 - git config git-ftp.password $FTP_PASSWORD

                 - git ftp push


Entendendo o arquivo


Para que o Bitbucket Pipelines funcione, é necessário criar o arquivo bitbucket-pipelines.yml na raiz do seu repositório. A identação é importante. Enquanto em uma linguagem de programação comum isso é apenas um recurso visual para auxiliar o desenvolvedor, o arquivo estará incorreto se todos os recuos não estiverem alinhados.

O arquivo representa uma máquina Docker que é instanciada no momento em que o pipeline é executado, e destruída após a execução. A máquina básica do Bitbucket Pipelines é um Linux Debian, então ela nos apresenta algumas facilidades.

bitbucket-pipelines.yml

pipelines:

A declaração do arquivo. É aqui onde apontamos qual imagem vai rodar o build/deploy da aplicação. O nome da imagem estará depois dos dois pontos, e como não há nome, esta é uma imagem Docker Linux Debian padrão. Neste bloco, há dois scripts.

custom:

Dentro desse bloco há dois subblocos

init-production:

e

init-staging:

Esses dois scripts não estão vinculados a nenhum branch, e são executados somente se o usuário desejar usando um menu no Bitbucket.

O Git FTP realiza uma transação FTP usando o Git, então ele usa a conexão FTP com as regras do Git. Explicarei os scripts.

A inicialização do script

      init-production:

           - step:

               script:

                 - apt update

                 - apt install -y git-ftp

                 - git config git.ftp.syncroot ./

                 - git config git-ftp.url $FTP_SERVER/loja

                 - git config git-ftp.user $FTP_USER

                 - git config git-ftp.password $FTP_PASSWORD

                 - git ftp init

Esta é uma das seções do script - que vai aparecer no menu.



O script que será executado está depois de ‘script:’. A partir daqui, é uma sequência de comandos Linux que serão executados.

O apt


O apt é um comando que vem por padrão no Linux Debian. Ele permite uma gestão eficiente na instalação e remoção de aplicações com suas dependências no Linux, bastando apenas uma conexão com a internet. O comando faz bem mais coisas que isso, mas aqui usamos somente a funcionalidade de instalação. Apt-get é um aliase, então faz a mesma coisa.
  • apt update
    Atualiza as aplicações com os repositórios centrais.
  • apt install -y git-ftp
    Instala a aplicação Git FTP.

Configurar as variáveis do Git

O Git tem vários comandos, dentre eles o config. Ele permite configurar variáveis que serão usadas pelo Git.
  • git config git.ftp.syncroot ./
    A pasta que será sincronizada com o servidor da aplicação. São estes arquivos que irão subir.
  • git config git-ftp.url $FTP_SERVER/loja
    O servidor. Note que coloquei uma subpasta loja, dentro da qual os arquivos irão ser publicados.
  • git config git-ftp.user $FTP_USER
    O usuário FTP - que o suporte fornecerá para você.
  • git config git-ftp.password $FTP_PASSWORD
    A sua senha de acesso.

A execução contínua do script

  branches:

Já a seção branches, são os scripts que serão executados quando acontecer um commit/merge em um branch. Há também dois blocos.

master:

e

staging:

Que serão executados quando acontecer um commit em master ou staging respectivamente.

      master:

           - step:

               name: Deploy production

               deployment: production

               script:

                 - apt update

                 - apt install -y git-ftp

                 - git config git.ftp.syncroot ./

                 - git config git-ftp.url $FTP_SERVER/loja

                 - git config git-ftp.user $FTP_USER

                 - git config git-ftp.password $FTP_PASSWORD

                 - git ftp push


Esse é o script que será executado quando o master sofrer alguma alteração. Também estará disponível para ser forçado a execução no menu.

Cuidado extremo com as linhas.

              name: Deploy production

               deployment: production

Estas linhas são necessárias para identificar a build. Nos dois branches estão diferentes, e elas precisam existir, ou o pipeline não funcionará.

O Git FTP

Os scripts foram construídos dessa maneira por causa de uma particularidade do Git. Lembra que eu disse que o Git FTP vai funcionar usando o FTP com as regras do Git? Pois bem, ele vai literalmente transformar a pasta do servidor em um repositório Git, então ele precisará ser inicializado para que o Git possa ir realizando o deploy à medida que os branches são alterados e publicados.

Vejamos as referências do servidor de produção:

  custom:

       init-production:

           - step:

               script:

                 - apt update

                 - apt install -y git-ftp

                 - git config git.ftp.syncroot ./

                 - git config git-ftp.url $FTP_SERVER/loja

                 - git config git-ftp.user $FTP_USER

                 - git config git-ftp.password $FTP_PASSWORD

                 - git ftp init

E

  branches:

       master:

           - step:

               name: Deploy production

               deployment: production

               script:

                 - apt update

                 - apt install -y git-ftp

                 - git config git.ftp.syncroot ./

                 - git config git-ftp.url $FTP_SERVER/loja

                 - git config git-ftp.user $FTP_USER

                 - git config git-ftp.password $FTP_PASSWORD

                 - git ftp push


Init-production deve ser executado uma única vez, para fazer o primeiro upload dos arquivos. Já o master, será executado sempre que o branch for alterado. Isso é necessário porque é assim que um repositório Git funciona. O comando transforma sua pasta do servidor de aplicação em um repositório Git - apesar disso, os arquivos estarão lá e podem ser acessados pelo servidor web normalmente.
  • git ftp init
    Inicia a pasta no servidor. Só vai ser executado uma única vez, para a primeira publicação
  • git ftp push
    O comando que irá realizar a transação FTP sucessivas vezes, a cada alteração.

Bônus - realizando uma build Maven no repositório

Somente adicione as linhas.

                - apt -y install default-jdk

                 - apt -y install maven

                 - mvn install



E realize demais comandos que julgar necessários.

Realizando a build

Clique em commits e clique no commit que quer executar.

Clique em Run Pipeline.

Selecione o pipeline e clique em Run.

Os quatro scripts que configuramos em nosso pipeline estarão disponíveis no menu.

Conclusão

Realizar uma build/deploy com Bitbucket Pipelines é relativamente fácil. Quem usa Ubuntu sai na frente, pois está familiarizado com o modo de trabalho do Linux Debian.

Referências


https://stephanwagner.me/deploy-websites-with-bitbucket-pipelines-and-git-ftp

https://community.atlassian.com/t5/Bitbucket-Pipelines-questions/SFTP-deploy-pipe-creates-build-folder-on-remote-and-fails-after/qaq-p/1053378

https://stackoverflow.com/questions/47313050/bitbucket-to-ftp-with-pipeline-and-git-ftp

Comentários

Postagens mais visitadas deste blog

Desenvolvo sua página de negócio

Introdução ao PHP orientado a objeto