Você está na página 1de 58

Uma proposta para centralizar praticas DevOps com uso

do gitlab
por
Jonnatas Matias Ribeiro Cabral
Trabalho de Graduacao

UNIVERSIDADE FEDERAL DE PERNAMBUCO


CIN - CENTRO DE INFORMATICA
GRADUACAO EM SISTEMAS DE INFORMACAO
www.cin.ufpe.br

RECIFE, ABRIL DE 2017


UNIVERSIDADE FEDERAL DE PERNAMBUCO
CIN - CENTRO DE INFORMATICA
GRADUACAO EM SISTEMAS DE INFORMACAO

Jonnatas Matias Ribeiro Cabral

UMA PROPOSTA PARA CENTRALIZAR PRATICAS DEVOPS COM


USO DO GITLAB

Projeto de Graduacao apresentado no Cen-


tro de Informatica da Universidade Federal
de Pernambuco, como requisito parcial
para a obtencao do grau de Bacharel em
Sistemas de Informacao.

Orientador: Vincius Cardoso Garcia

RECIFE, ABRIL DE 2017


A menos que modifiquemos a nossa
maneira de pensar, nao seremos
capazes de resolver os problemas
causados pela forma como nos
acostumamos a ver o mundo.

Albert Einstein
Agradecimentos

Agradeco a minha famlia pelo amor, dedicacao e paciencia.

Agradeco aos meus amigos pelo incentivo e apoio durante toda a graduacao.

Agradeco a minha namorada Jessica que me apoiou nos dias que passei estudando pela
noite. Ao meu Lder tecnico Arthur, que me deu um tempo para pesquisar e colocar em
pratica alguns estudos que compoem esse trabalho.

Agradeco ao meu orientador Vincius Garcia pela sua disponibilidade e por todo o apoio
fornecido. Ao co-orientador Fish, que ajudou na ideia do projeto, alem de dar aquela
forca.

Agradeco a todos os professores do CIn por todo o conhecimento e dedicacao fornecidos


durante o curso.

E a voce leitor, que doara um pouco do seu tempo para ler a pesquisa.
Resumo

Embora os processos ageis de entrega de sistemas tragam varios pontos positivos para
as organizacoes, na pratica, varios problemas sao encontrados em sua execucao. E
necessario bastante esforco para que o caminho de um release ate a disponibilizacao aos
usuarios seja todo automatizado. Nao ha um ferramenta robusta que possa ser usada
ao longo do processo, permitindo assim, que cada organizacao ou projeto construa sua
propria infraestrutura da sua maneira, utilizando o que conhece ou tem mais facilidade de
colocar em pratica. Essa realidade acarreta em problemas relacionados a manutencao,
integracao e aprendizado do uso de diferentes ferramentas.

Neste trabalho de graduacao, propoe-se uma alternativa para as diferentes ambientes de


entrega de sistemas existentes, sugerindo a utilizacao de uma unica ferramenta proposta
que e o gitlab, configurada na arquitetura de servicos da AWS. Facilitando o gerencia-
mento de releases disponibilizados em diferentes ambientes (estagio, homologacao e
producao) a partir de uma unica visao proporcionada pela ferramenta.

Palavras-chave: DevOps, infra-estrutura, release, Deploy, AWS .

i
Abstract

Although DevOps brings several positives to organizations, in practice, several problems


are encountered in its execution. It takes a lot of effort to get the road from a release to
the availability to users all automated. There are a number of tools available to all parties
to this process, allowing each organization or project to build its own infrastructure in its
own way, using what it knows or is easier to put in practice. This reality leads to problems
related to maintenance, integration and learning of the use of different tools.

In this undergraduate work, an alternative is proposed for the different existing infras-
tructures, suggesting the use of a single proposed tool that is emphgitlab, configured in
emphAWS services architecture. Facilitating the management of releases made avai-
lable in different environments (stage, homologation and production) from a single view
provided by the tool.

Keywords: DevOps, release,infrastructure, gitlab.

iii
Sumario

1 Introducao 1

1.1 Contexto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2.1 Objetivos Gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2.2 Objetivos Especficos . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.3 Organizacao do Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Conceitos 5

2.1 DevOps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2 Deploy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.3 Integracao contnua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.4 Entrega contnua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.5 Deployment Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.6 Microservices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.7 Conteineres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.7.1 Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.8 Django . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

v
2.9 GitLab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.10 Consideracoes Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3 Ambiente de Entrega Contnua 11

3.1 A Adocao do Processo de Entrega Contnua . . . . . . . . . . . . . . . . . 11

3.2 Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.3 The commit stage (Etapa de validacao das mudancas no codigo) . . . . . . 12

3.3.1 Controle de Versao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.3.2 Build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.4 Testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.5 Ambientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.6 Trabalho em equipe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.7 Desafios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.8 Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.8.1 Jenkins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.8.2 Travis-CI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.8.3 CodeShip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.8.4 GitLab-ce (Community edition) . . . . . . . . . . . . . . . . . . . . . 19

3.8.5 Analise das Ferramentas . . . . . . . . . . . . . . . . . . . . . . . . 20

3.9 Consideracoes Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

4 Construcao do ambiente com a ferramenta gitlab-ce 22

4.1 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

4.2 Configurando as ferramentas . . . . . . . . . . . . . . . . . . . . . . . . . . 23

vi
4.2.1 Configurando Gitlab server . . . . . . . . . . . . . . . . . . . . . . . 24

4.2.2 Configurando Gitlab Runner . . . . . . . . . . . . . . . . . . . . . . . 26

4.2.3 Descrevendo o Pipeline em um Unico Arquivo . . . . . . . . . . . . 29

4.3 Executando Fluxo da Ferramenta . . . . . . . . . . . . . . . . . . . . . . . . 31

4.4 Consideracoes Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

5 Conclusao 38

vii
Lista de Tabelas

4.1 Custos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

4.2 Custos do ambiente com gitlab . . . . . . . . . . . . . . . . . . . . . . . . . 37

viii
Lista de Figuras

2.1 Arquitetura do docker, evidenciando o compartilhamento de recursos. . . . 9

2.2 Abrangencia da arquitetura do gitlab, evidenciando o englobamento dos


pipelines de CI e CD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.1 Corpo do pipeline descrito no paragrafo acima. . . . . . . . . . . . . . . . . 12

3.2 Precificacao de servicos do Travis-ci.[6] . . . . . . . . . . . . . . . . . . . . 18

3.3 Precificacao de servicos do CodeShip.[1] . . . . . . . . . . . . . . . . . . . 18

3.4 Visualizacao das da cobertura de atapas do processo de CD proporciona-


das pelas ferramentas descritas.[6], [1], [4] . . . . . . . . . . . . . . . . . . 21

4.1 Ambiente proposto para o uso do gitlab. . . . . . . . . . . . . . . . . . . . . 23

4.2 Exemplo de VMs que tem o Docker pre-instalado. . . . . . . . . . . . . . . 24

4.3 Configuracoes das portas ao acesso externo. . . . . . . . . . . . . . . . . . 25

4.4 Obtencao de token para o GitLab Runner. . . . . . . . . . . . . . . . . . . . 28

4.5 Primeira parte do gitlab-ci.yml. . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.6 Exibicao dos ambientes implementados no gitlab-ci.yml. . . . . . . . . . . . 30

4.7 Exibicao dos ambientes implementados no gitlab-ci.yml. . . . . . . . . . . . 32

4.8 Tela para analise de alteracoes de codigo . . . . . . . . . . . . . . . . . . . 34

4.9 Exibicao inicial da execucao do pipeline . . . . . . . . . . . . . . . . . . . . 35

ix
4.10 Imagem de acompanhamento de execucao . . . . . . . . . . . . . . . . . . 35

4.11 Exibicao inicial da execucao do pipeline . . . . . . . . . . . . . . . . . . . . 36

4.12 Precos das VMs do servico EC2 da AWS. . . . . . . . . . . . . . . . . . . . 37

x
Captulo 1

Introducao

Neste captulo sera apresentada a motivacao para a realizacao deste trabalho, os obje-
tivos esperados e como este trabalho esta estruturado, a fim de facilitar o entendimento
do leitor.

1.1 Contexto

A computacao em nuvem (Cloud computing) e um modelo que permite acesso on-


demand a uma rede de recursos computacionais configuraveis (por exemplo, redes, cpu,
servidores, armazenamento, aplicativos e servicos) que pode ser rapidamente provisio-
nado e liberado com o mnimo de esforco de gerenciamento ou interacao do provedor
de servicos [20]. Segundo o estudo [8] a computacao em nuvem permite que os donos
desses recursos de hardware possam oferecer esses ativos em forma de servico e de
maneira transparente a qualquer lugar do mundo que possua internet. Assim facilitando
o acesso a servidores e diversos servicos disponveis na web.

Recentemente, computacao em nuvem tem sido considerada uma tecnologia do tipo


must-to-have ao inves de should-to-have [14]. Computacao em nuvem tem viabilizado
flexibilidade da proposta pay-per-use contida nos modelos Software as a Service (SaaS),
Platform as a Service (PaaS) e Infrastructure as a Service (IaaS). Alem disso a alta
disponibilidade (um dos fundamentos basico da proposta) [20] e as diversas platafor-
mas presentes atualmente (PaaS) permite que organizacoes desenvolvam software com
1. Introducao 2

maior velocidade e estabilidade (alta disponibilidade), que (i) aumenta a competitividade


de organizacoes e (ii) proporciona qualidade do ponto de vista do cliente ou consumidor.

Embora pontos importantes tenham sido apresentados, estudos recentes revelam que
implantacoes em cloud computing tem obtido um resultado inesperado [14]. Em outras
palavras, o software nao tem obtido a estabilidade esperada e a entrega do produto
(software), na realidade, tem sido atrasada.

Esse fato esta diretamente relacionado a divisao e barreira organizacional entre os times
de desenvolvimento e operacoes [14]. Essa realidade pode ser relacionada a custos di-
retos a organizacao, ao qual pode-se citar a falta de compartilhamento de conhecimento
entre os times. Por exemplo, o desenvolvedor nao constroi aplicacoes que facilitem sua
analise em tempo de execucao (em producao), disponibilizando logs idiossincraticos (que
apenas pessoas com o background de dev possa entender). Deste modo, possivelmente
o time de operacoes, deve levar mais tempo (mais custo) analisando a causa de pro-
blema.

Visando quebrar tais barreiras, DevOps surge com intuito de aproximar os times de de-
senvolvimento e operacao mantendo a visao agil, DevOps e um conjunto de praticas
destinada a reduzir o tempo entre o efetuar uma alteracao em um sistema ate que a
alteracao seja colocada em Producao, assegurando ao mesmo tempo qualidade . Tendo
em vista que de uma pequena alteracao no codigo ate chegar em producao, deve pas-
sar por diversas etapas do processo de desenvolvimento, o conjunto dessas etapas e
conhecido como pipeline.

Um pipeline de entrega de sistema e constitudo de varias etapas, que sao desenvol-


ver o codigo, armazena-lo em uma ferramenta de configuracao de codigo, revisar, testar,
validar e colocar o codigo em producao. Como descrito no artigo DevOps and Its Prac-
tices IBM [10] existem diversas ferramentas para cada parte especificas desse pipeline
e a integracao desse codigo e hand-tailored algo feito a mao pelos desenvolvedores.
Nao ha uma ferramenta que abrace todas as etapas desse processo de entrega de siste-
mas. Com isso gera um grande esforco para distribuicao de conhecimento, manutencao,
gerenciamento e visualizacao das ferramentas e praticas em uso.
1. Introducao 3

1.2 Objetivos

1.2.1 Objetivos Gerais

O objetivo dessa pesquisa e propor um ambiente efetivo para o uso dos processos De-
vOps, propondo o uso de uma ferramenta que engloba uma maior parte dos processos
de entrega contnua. Demonstrando os processos que nos dao base a construcao de um
ambiente de entrega contnua. Abordando ferramentas dispostas no mercado, e seus re-
cursos. Por fim demonstrar como criar um ambiente de uso para a ferramenta escolhida,
fazendo uso de uma aplicacao web exemplo que percorra o fluxo proposto.

1.2.2 Objetivos Especficos

Fazer um estudo acerca dos conceitos DevOps, e explorar dos processos de en-
trega contnua;

Fazer um estudo sobre ferramentas de entrega contnua dispostas no mercado ;

Implementar e analisar um ambiente de entrega contnua que use uma ferramenta


que auxilie uma maior parte do processo. Observar os benefcios ao aderir tal
ferramenta. E por fim demonstrar como utilizar o fluxo de entrega contnua de uma
aplicacao web de exemplo, usando a ferramenta proposta.

1.3 Organizacao do Trabalho

O presente trabalho esta organizado em 5 captulos, dos quais o primeiro e a introducao


e os proximos 4 captulos estao descritos abaixo:

No Captulo 2 e apresentado um conjunto de definicoes relevantes para o entendi-


mento do trabalho;

O captulo 3 e responavel pelo entendimento de como funciona os de continuous


Integration e Continuous Deployment nas empresas e quais sao os maiores proble-
mas enfrentados devido a essa decisao;
1. Introducao 4

O captulo 4 apresenta uma proposta para implantacao de uma ferramenta alterna-


tiva para o auxlio no processo de CI e CD.

O captulo 5 apresenta as conclusoes retiradas de toda a pesquisa.


Captulo 2

Conceitos

Este captulo e responsavel por apresentar conceitos chave para o melhor entendimento
deste trabalho, trazendo a definicao dos conceitos e uma visao geral sobre os seguin-
tes temas: DevOps , Continuous Deployment e Deployment Pipeline, microservices,
Django,Docker e o gitlab.

2.1 DevOps

O DevOps trata de processos de desenvolvimento e entrega de sistemas com um foco


no agil. Ele integra eficientemente as areas de desenvolvimento e operacoes, facilitando
assim uma conexao fluda dessas areas tradicionalmente separadas [12].

E uma mudanca organizacional em que, em vez de grupos distribudos desempenhando


funcoes separadamente, equipes multifuncionais trabalham em entregas de recursos
operacionais contnuos. Essa abordagem ajuda a fornecer valor de forma mais rapida
e contnua, reduzindo problemas devido a falta de comunicacao entre os membros da
equipe acelerando a resolucao de problemas.
2. Conceitos 6

2.2 Deploy

O termo deploy, no contexto de desenvolvimento de software, significa a acao de dispo-


nibilizar seu software na nuvem ou em qualquer ambiente que possa ser utilizado pelos
seus usuarios. O deploy e realizado em uma serie de etapas sequenciais, assim como
uma receita de bolo, com o proposito de atualizar um sistema, ou disponibilizar um sis-
tema completamente novo [17]. As etapas de um deploy vao depender da arquitetura do
sistema e da infra-estrutura utilizada.

2.3 Integracao contnua

A integracao contnua foi escrita pela primeira vez no livro de Kent Beck, Extreme
Programming Explained (publicado pela primeira vez em 1999). A ideia por tras da
integracao contnua era que, se a integracao da sua base de codigo e bom, por que
nao faze-lo o tempo todo? No contexto de integracao, todo o temposignifica cada vez
que alguem efetua qualquer alteracao ao sistema de controle de versao [17].

As boas praticas de CI exigem que todos os desenvolvedores enviem seu trabalho


para um repositorio de codigo comum em uma base diaria. Alem do que, apos cada
integracao, o sistema deve ser reconstrudo e testado, para garantir que o sistema ainda
esteja funcional apos cada alteracao [13]. Assim os desenvolvedores podem continuar
seu trabalho em cima das alteracoes feitas e aprovadas.

As organizacoes que aderem a pratica de integracao contnua de forma eficaz sao capa-
zes de desenvolver um software muito mais rapido, e com menos bugs, do que os times
que nao utilizam. Os bugs sao detectados muito mais cedo no ciclo de entrega, quanto
mais rapido essa deteccao menos custoso e para soluciona-lo, representando uma sig-
nificativa economia de custos e tempo. Por isso, essa pratica e considerada essencial, e
para os paradigmas enfrentados pelas organizacoes hoje em dia talvez seja uma pratica
tao importante quanto usar o controle de versao no desenvolvimento.
2. Conceitos 7

2.4 Entrega contnua

A entrega contnua (CD) e uma disciplina de desenvolvimento de software em que estuda


como o software pode ser disponibilizado para a producao a qualquer momento [15]. O
Continuous Deployment e uma extensao do CD em que cada alteracao e construda,
testada e implantada automaticamente na producao. Assim, em contraste com CD, nao
ha etapas ou decisoes manuais entre um commit de desenvolvedor e uma implantacao
de producao. A motivacao para automatizar a implantacao na producao e Obter feedback
mais rapido do uso da producao para corrigir defeitos ficam caros com o mais tardar da
deteccao.

A diferenca entre CI e CD e mais destacada na Fig. 2.2, onde se mostra que, embora o
CI seja constitudo por apenas uma unica gase, o CD consiste em varios estagios que
verificam se o software esta em condicoes de ser disponibilizado para uso [15].

2.5 Deployment Pipeline

Em um nvel abstrato, o Deployment Pipeline e uma execucao automatizada do todo


o seu processo para ,entregar o software nas maos de seus usuarios, a partir de uma
ferramenta de controle de versao. [17].

Toda mudanca em seu software passa por um processo complexo no corpo do De-
ployment Pipeline ate ser aprovada. Esse processo envolve a construcao do software
(build), seguido de progressos destas compilacoe atraves de multiplos estagios de testes
e implantacao. Este, por sua vez, requer colaboracao entre muitos indivduos, e talvez
equipes. O pipeline de implantacao modela este processo em uma ferramenta de ge-
renciamento de releases e integracao contnua e o que permite controlar o progresso de
cada mudanca a medida que se move do controle de versao para varios conjuntos de
testes e implementacoes para liberar aos usuarios.
2. Conceitos 8

2.6 Microservices

A arquitetura monoltica e um padrao comumente usado para o desenvolvimento de


aplicacoes de grandes empresas.Esse padrao funciona razoavelmente bem para peque-
nas aplicacoes, pois o desenvolvimento, testes e implantacao de pequenas aplicacoes
monolticas e relativamente simples[21]. No entanto, para aplicacoes mais complexas,
acabam dificultando a utilizacao de uma entrega contnua, devido a uma grande quan-
tidade de componentes que estao dentro da aplicacao. Para aplicacoes desse porte e
interessante dividi-la em um conjunto de servicos.

A arquitetura de microservices tem muitas vantagens, por exemplo, servicos individuais


sao mais faceis de entender e podem ser desenvolvidos e implantados de forma indepen-
dente. Adotar novas tecnologias e frameworks torna-se mais facil, pois a adocao pode
ser aplicada em um servico de cada vez Ao escolher o uso de uma arquitetura de micro-
services A aplicacao e decomposta em diversos servicos de front end, que implementam
diferentes partes da interface do usuario e multiplos servicos de back end [19].

2.7 Conteineres

Usando conteineres para receber seu projeto, tudo o que e necessario para fazer um
pedaco de sistema executado e empacotado em conteineres isolados. Ao contrario das
maquinas virtuais, os conteineres nao agrupam um sistema operacional completo, ape-
nas sao necessarias bibliotecas e configuracoes necessarias para que o trabalho do soft-
ware seja necessario. Isso faz com que sistemas eficientes, leves e autonomos garantam
que o software sempre seja o mesmo, independentemente de onde ele e implantado [2].

A ideia por tras do uso de conteineres e permitir unificar o deploy de diferentes tipos
de projetos, ao fazer o uso dessa tecnologia. Permitindo assim que esses conteineres
funcionem em diferentes tipos de sistemas operacionais.
2. Conceitos 9

2.7.1 Docker

O Docker surgiu como uma das grandes forcas para o DevOps, e uma ferramenta que
permite a criacao de microservices e facilita a configuracao de diversos ambientes de
desenvolvimento [7]. Assim como na sua descricao:

O Docker e a principal plataforma de conteineres de software no mercado. Os desenvol-


vedores usam o Docker para eliminar os problemas da famosa frase funciona na minha
maquinaao colaborar no codigo com colegas de trabalho. Os operadores usam o Docker
para executar e gerenciar aplicativos lado a lado em recipientes isolados para obter uma
melhor densidade de computacao. As empresas usam o Docker para criar pipelines de
entrega de software agil para enviar novos recursos de forma mais rapida, segura e com
confianca para aplicativos Linux e Windows Server [2].

Figura 2.1: Arquitetura do docker, evidenciando o compartilhamento de recursos.

2.8 Django

O Django e um framework web que sera usado na execucao do ambiente proposto na


pesquisa. O Django e um framework Python Web de alto nvel que incentiva o desen-
volvimento rapido e o design limpo e pragmatico[3]. A idea do framework e facilitar
o desenvolvimento de aplicacoes web, servindo diversas funcionalidades basicas que
esse tipo de projeto exige, tais como autenticacao de usuario e formularios, alem de criar
uma interface com alguns bancos de dados, com isso o desenvolvedor nao precisa se
preocupar em entender consultas em SQL, basta ter conhecimento da ferramenta e da
linguagem python.
2. Conceitos 10

2.9 GitLab

GitLab e uma ferramenta que unifica issues, revisao de codigo, CI e CD em uma UI unica
[4]. A ferramenta possui continuous integration Integrada e continuous deployment para
testar, construir e implantar seu codigo. Voce pode monitorar facilmente o progresso
de seus testes e criar pipelines. Permitindo a disponibilizacao do seu projeto com a
confianca de que seu codigo foi testado em varios ambientes.

Figura 2.2: Abrangencia da arquitetura do gitlab, evidenciando o englobamento dos


pipelines de CI e CD.

2.10 Consideracoes Finais

Este captulo apresentou os conceitos basicos que serao utilizados no trabalho. Inici-
almente, foram apresentadas nocoes de DevOps, Continuous Integration, Continuous
Integration, Deployment Pipeline, Docker, Microservices e o gitlab. Embora o que foi
apresentado ate aqui seja de grande importancia, ainda e necessario dar um foco maior
nos conceitos de CI e CD. O proximo captulo conta com os conceitos da arquitetura do
Gitlab, e apresenta tecnicas de implementacao, citando algumas ferramentas do mer-
cado, a fim de sintetizar os conhecimentos existentes na area.
Captulo 3

Ambiente de Entrega Contnua

Neste captulo falaremos sobre os processos que compoem o ciclo de entrega contnua.
O objetivo desta etapa e demonstrar a necessidade de cada passo dentro de todo o
processo. Explorando benefcios, desafios enfrentados para criar ambiente de entrega
contnua e por fim demonstrar algumas ferramentas que auxiliam a execucao dos pro-
cessos.

3.1 A Adocao do Processo de Entrega Contnua

Para a adocao dos processos de entrega contnua e necessario a definicao de um con-


junto de acoes, as quais, a organizacao de desenvolvimento de software deve executar
para incorporar esses processos no seu ambiente de desenvolvimento [16]. O conjunto
real de acoes depende do ponto de partida da organizacao e de algumas caractersticas
da aplicacao, assim a adocao pode ser diferente de caso a caso.

E necessario entender o seu ambiente de desenvolvimento e buscar fontes que cubram


suas necessidades, algumas fontes fornecem acoes especficas que precisam ser feitas
durante a adocao A adocao mais provavel requer interacao e acoes especficas de caso,
por isso as implementacoes de CD diferem entre os profissionais e organizacoes[15].

Para a construcao de um ambiente de entrega contnua, e necessario um alto nvel


de automacao de atividades, para que assim exista capacidade de executar entregas
3. Ambiente de Entrega Contnua 12

efetivas em curtos espacos de tempo. Para isso, algumas praticas e ferramentas sao
necessarias. Vamos abordar os processos, e ferramentas citadas anteriormente, nas
secoes a seguintes.

3.2 Pipeline

Definir um pipeline e uma etapa inicial e importante para a construcao de um processo


de entrega contnua. Um pipeline e basicamente a definicao de um conjuntos de tarefas
que devem ser executadas quando houver alguma alteracao a ser integrada no codigo
da aplicacao.

Os pipelines dentro de ambientes de entrega contnua, foca em definir esses passos


que agem de uma maneira incremental, ou seja, cada passo tem um status, e os pas-
sos seguintes sempre sao executados se o status da atividade atual for executado com
sucesso. Na figura 3.1, temos um exemplo de pipeline.

Figura 3.1: Corpo do pipeline descrito no paragrafo acima.

3.3 The commit stage (Etapa de validacao das


mudancas no codigo)

Esta secao abordara os processos que envolvem a etapa de commit stage, essa etapa
compoe atividades como : Compilacao de codigo, execucao de uma sute de testes,
analise da qualidade do codigo e a preparacao dos releases e dependencias que serao
enviados para ambientes de uso [15], o cumprimento de todas essas etapas tem como
3. Ambiente de Entrega Contnua 13

objetivo a criacao de um release candidato a ser testado em ambientes proximos ao do


usuario, e em consequencia o de producao.

Essa etapa e importante para o entendimento da grande necessidade de automatizar


alguns processo no desenvolvimento de sistemas, alem de mencionar a importancia da
adocao das devidas praticas de desenvolvimento.

3.3.1 Controle de Versao

Esta etapa e de bastante importancia para todo o processo de entrega contnua, nao so
pela escolha da sua ferramenta mas pela importancia dos processos contido nesta etapa.
Alguns dos processos desta etapa sao praticas de clonagem do codigo, ramificacoes e
integracao de alteracoes no codigo [9].

Todos esses processos focam a qualidade de entrega de codigo e praticas que definem
os requisitos necessarios para que uma alteracao seja integrada ao linha principal de
desenvolvimento. Exemplo desses requisitos podem ser padroes de codigo, sucesso
dos testes automaticos, alem das condicoes de integracao de codigo.

Hoje em dia, existem algumas ferramentas muito utilizadas que sao o git e o SVN, de-
vido a essas ferramentas diversos servicos surgiram para facilitar o gerenciamento dos
processos citados, isso faz com que todo o time esteja acompanhando tudo que esta
acontecendo dentro do codigo, relacionado a alteracoes e integracoes, existem varios
servicos com essas funcionalidades tais como github, bitbucket. Alguns novos servicos
ja se preocupam em abranger tanto a etapa de integracao quanto a etapa de deploy,
exemplos como: Buddy e gitlab.

3.3.2 Build

Build, no contexto do desenvolvimento de software, se da a uma versao compilada de


um sistema ou parte dele que contem um conjunto de recursos que poderao integrar um
produto final.

A construcao de automacao e um ponto fundamental para os processos de entrega


3. Ambiente de Entrega Contnua 14

contnua[17]. Isso quer dizer que se no fluxo de entrega de um projeto ainda existe
aquelas atividades manuais como: execucao de testes feitas em ambiente de desenvolvi-
mento ou configuracao de ambientes de testes feitas por um desenvolvedor, e necessario
que uma mudanca de pensamento da equipe para que exista uma dedicacao de tempo
maior a automacao dessas e outras atividades manuais.

Neste ambiente de automacao, nao necessariamente e preciso alocar todo o tempo de


um desenvolvedor para concluir essas atividades, mas sim, e preciso um pouco de tempo
para que essa necessidade seja suprida, mas para isso existem diversas ferramentas as
quais dao suporte e facilitam a conclusao dessa automacao.

As ferramentas de build, possuem alguns objetivos em comum alguns deles sao: com-
pilar o codigo da sua aplicacao, gerenciar as dependencias necessarias, tais como bibli-
otecas de codigo, alem de executar testes e implantar a devida aplicacao em diferentes
ambientes [12].

Geralmente as ferramentas estao divididas entre as que tem como objetivo a construcao
da aplicacao, exemplo do Make, Maven, Gradle entre outras, e as que tem o objetivo de
implantar a aplicacao, tais como Puppet, chef e ansible. Todas essas ferramentas estao
disponveis na internet.

3.4 Testes

Os testes de aceitacao tem como principal requisito atender os requisitos dos usuarios,
e alguns testes precisam ser executados em ambientes proximos ao de producao [17],
porem a execucao dessa etapa nao e feita so por uma ferramenta, e necessario que
exista configuracao da aplicacao em um ambiente de teste, ja que a execucao desses
testes geralmente simulam a interacao do usuario com a aplicacao.

Existem algumas atividades fundamentais nesta etapa, elas sao: Configurar ambiente de
testes, isso inclui alocar maquina virtual, checar compatibilidade de sistemas operacio-
nais e instalar dependencias, depois de executar esses passos, e garantir que a maquina
possui os requisitos necessarios para a aplicacao, o proximo passo seria construir sua
aplicacao no ambiente. lembrando que todos esses passos devem ser automatizados
com auxlio de uma ferramenta de build, como descrito na secao 3.3.2.
3. Ambiente de Entrega Contnua 15

3.5 Ambientes

O ambientes sao a ponta final do percusso de entrega contnua, neles devem ser garan-
tido a execucao de todos os requisitos tecnicos e os requisitos do usuario, para o funcio-
namento da aplicacao. Comumente sao usados os ambientes de estagio e homologacao
como ambientes de teste, o requisito para a entrega a producao e o sucesso nessas
etapas. Sempre tendo em mente que o deploy para esses ambiente deve levar apenas o
clique de um botao [11] tendo em vista assim alcancar um ambiente de entrega contnua.

3.6 Trabalho em equipe

O trabalho em equipe e o ponto fundamental de todo o processo, e por isso que o DevOps
e tratados por muitos como uma cultura [12]. O pensamento DevOps deve estar contido
em cada atividade executada no processo de desenvolvimento, e por isso que o DevOps
precisa de pessoas multi-diciplinares, pessoas essas que entendem todo o processo,
e estao dispostas a realidade de que seu trabalho so tem valor quando e entregue ao
usuario final.

3.7 Desafios

Apos abordar sobre os metodos e praticas para implantar um processo de entrega


contnua (CD). Iremos falar sobre dificuldades, pois colocar o processo em pratica pode
ser um desafio, tanto relacionados as pessoas envolvidas quanto nas ferramentas e
praticas utilizadas.

Os desafios tecnicos serao o foco dessa pesquisa, essa secao abrira caminhos para
questoes que possam ser solucionadas em um ambiente de entrega contnua, relaciona-
das a parte tecnica do processo.

Uma solucao robusta, abrangente e ainda altamente personalizavel para CD ainda nao
existe [11]. Entao, fica aberto o desenvolvimento da sua propria solucao. Quando es-
tamos construindo o caminho para ter um ambiente de CD, usamos muitas ferramentas
3. Ambiente de Entrega Contnua 16

e tecnologias diferentes como parte dessa construcao. Evitar as falhas de servicos ter-
ceiros e um desafio. Lidar com aplicativos que nao sao acessveis ao CD (por exemplo,
aplicativos grandes monolticos) tambem sao desafiadores. Existe uma grande quanti-
dade de desafios a serem citados dentro de um ambiente de CD, porem nessa pesquisa
vamos focar nos desafios voltados a parte tecnica do processo, tais como implantacao,
escalabilidade, suporte a novas tecnologias e implantacao;

3.8 Ferramentas

Vamos falar sobre algumas ferramentas bastantes usadas pelas organizacoes que traba-
lham com CD no processo de desenvolvimento, no intuito de esclarecer o funcionamento
de algumas ferramentas que ja fazem parte do mercado a algum tempo, e as novas fer-
ramentas que tem uma abordagem mais recentes e comumente usam containers para
prover certas do dependencias no nosso pipeline de CD.

Existem alguns servicos ofertados no mercado. Algumas ferramentas como o Travis-


ci disponibilizam uma versao gratuita para desenvolvimento de projetos open source.
Outras ferramentas como codeship, apenas disponibilizam versoes pagas. E tambem
temos o gitlab e o jenkins que fornecem versoes self-hosted onde voce configura a
ferramenta proposta na sua propria infraestrutura. nesta secao vamos falar um pouco
sobre estas ferramentas, e analisar o que elas oferecem dentro do processo de entrega
contnua.

3.8.1 Jenkins

Vamos abordar alguns pontos de uma das ferramentas mais usadas do mercado, o Jen-
kins. A ideia desse trecho e mostrar seus recursos e o que ela oferece dentro do processo
de entrega contnua.

O jenkins e uma ferramenta desenvolvida em Java, que auxilia os processos de


integracao e entrega contnua [5], ele e uma ferramenta que tem suporte para siste-
mas operacionais tais como: Windows, Mac OS X e Unix. Outro ponto importante e que
a ferramenta e self-hostedela precisa ser instalada e configurada na sua infraestrutura.
3. Ambiente de Entrega Contnua 17

O Jenkins e uma ferramenta que esta a bastante tempo sendo utilizada por diversas
equipes que focam processos de entrega contnua. Demonstrando assim que mesmo
com surgimento de novas ferramentas, o Jenkins continua sendo bastante efetivo no
cenario. Um dos problemas da ferramenta e que ela veio bem antes do surgimento das
ferramentas de conteineres, com isso a ferramenta nao possui recursos suficientes para
projetos que utilizam conteineres em sua execucao.

3.8.2 Travis-CI

Nesta secao mostraremos alguns recursos oferecidos pelo servico do Travis-CI. O Travis-
CI e um servico que se encaixa na etapa final da entrega contnua, ele constroi seu
projeto e efetua o deploy .

Alguns recursos do Travis-CI sao 3.2:

Visualizacao de testes enquanto executam;

Integracoes com servicos de comunicacao: Slack, HipChat, e-mails;

Disponibilizacao uma maquina virtual limpa para cada compilacao;

Execucao testes em paralelo;

Suporte a Linux e Mac (e iOS);

Suporte ao Docker.

Custo basico para uso da ferramenta, esta disponvel no seu site [6] como visualizado na
figura.

3.8.3 CodeShip

O CodeShip e mais um servico que aborda algumas etapas do processo de entrega


contnua, assim como o Travis-CI ele se encaixa no fim do processo, que e construir e
executar testes, e fazer o deploy do projeto em ambientes de estagio, e producao.
3. Ambiente de Entrega Contnua 18

Figura 3.2: Precificacao de servicos do Travis-ci.[6]

Servidor CI que escala sua necessidade.

Deploys automaticos assim que os testes sao executados com sucesso

Execucao de testes em paralelo

Suporte ao Docker em alguns planos

Os custos para utilizacao desta ferramenta depende das necessidades, e grandeza do


projeto. Na figura 3.3 contem o preco disponibilizado pelo site do CodeShip.

Figura 3.3: Precificacao de servicos do CodeShip.[1]


3. Ambiente de Entrega Contnua 19

3.8.4 GitLab-ce (Community edition)

Neste secao abordaremos um pouco sobre a ferramenta gitlab-ce que se encontra dis-
ponvel para a comunidade. Mostrar vantagens e desvantagens. E falar um pouco da
arquitetura da ferramenta, e seus recursos. Todas as informacoes deste captulo foram
tiradas do site do gitlab, e de sua documentacao [4].

O gitlab e uma ferramenta dividida em micro servicos, permitindo assim que ela seja
usada para coisas mais simples como: usar uma ferramenta de versionamento de codigo,
ou ate ser utilizada em projetos com uma complexidade maior, fazendo sua utilizacao
para o Continuous Integration e Deployment Pipelines. A ferramenta tem integracoes
para CI e CD para testar, construir e disponibilizar sistemas.

A lista a seguir demonstra alguns servicos disponveis no Gitlab-CE.

Ferramentas integradas Integrado: GitLab CI e parte de GitLab.

Interface: GitLab CI oferece boas interfaces para o desenvolvedor que sao, familia-
res a ferramentas do mesmo tipo, facil de usar. [4]

Escalabilidade: Os testes rodam distribudos em maquinas separadas do gitlab


server, e o desenvolvedor pode adicionar quantas forem necessarias.

Resultados e feedbacks rapidos: Cada build de um projeto pode ser dividido em


multiplos jobs que serao processados paralelamente pelas maquinas de teste.

Continuous Delivery (CD):Multiplos estagios, deploys manual, diversos ambientes


e variaveis.

A proxima lista demonstra algumas caractersticas da ferramenta.Algumas destas carac-


tersticas importantes sao:

Multi-plataforma: voce pode executar compilacoes no Unix, Windows, OSX e em


qualquer outra plataforma que suporte o Go.

Versatil: os scripts de compilacao sao orientados por linha de comando e funcionam


com Java, PHP, Ruby, C e qualquer outra linguagem.
3. Ambiente de Entrega Contnua 20

Estavel: suas compilacoes sao executadas em uma maquina diferente do GitLab.

Builds paralelos: o GitLab divide divisoes sobre varias maquinas, para execucao
rapida.

Registro em tempo real: um link na solicitacao de mesclagem leva voce ao registro


de compilacao atual que atualiza dinamicamente.

Testes em versao: um arquivo .gitlab-ci.yml que contem seus testes, permitindo que
todos contribuam com mudancas e assegurem que cada ramo obtenha os testes
que ele precisa.

Pipeline: voce pode definir varios trabalhos por etapa e voce pode desencadear
outras compilacoes.

Autoscaling: voce pode escalar automaticamente para cima e para baixo suas VMs
para garantir que suas compilacoes sejam processadas imediatamente e minimizar
custos.

Construa artefatos: capacidade de enviar binarios e outros artefatos de compilacao


para o GitLab e navegar e fazer o download deles.

Suporte do Docker: Capacidade de usar imagens Docker personalizadas, servicos


de spin up como parte do teste, criar novas imagens do Docker.

3.8.5 Analise das Ferramentas

Na figura 3.4, faremos uma comparacao entre os recursos oferecidos pelas ferramen-
tas citadas anteriormente, com adicao da ferramenta do gitlab-ce. E quais etapas do
processo de entrega continua essas ferramentas dao suporte.

Como visto na imagem 3.4, as tres ferramentas oferecem suporte para mesmas etapas
do processo, evidenciando a falta da etapa de code commit em todas.

Uma das importancias do gitlab e que a ferramenta possui uma ferramenta de controle
de versao, que proporciona uma visualizacao da etapa de code commit junto as etapas
de build, testes e deploy. Com isso, no momento em que um desenvolvedor vai avaliar
uma solicitacao de integracao no codigo, a ferramenta proporciona informacoes sobre
3. Ambiente de Entrega Contnua 21

Figura 3.4: Visualizacao das da cobertura de atapas do processo de CD proporcionadas


pelas ferramentas descritas.[6], [1], [4]

a construcao do projeto, informacoes sobre a execucao da sua sute de testes, e se a


ferramenta foi capaz de enviar o projeto a algum ambiente de testes, todas essas visoes
junto a analise de codigo.

3.9 Consideracoes Finais

Nesta secao falamos sobre os processos de CI e CD, focando nos processos usados
para obter um ambiente desejado. Logo apos, descrevemos uma linha de raciocnio en-
tre os processos e os tipos de ferramentas que devem ser adotadas para automacao
do processo. Mostramos alguns desafios relevantes dentro da utilizacao desses pro-
cessos. Alem da citacao do forte surgimento do docker e microservices em ambientes
que executam CI e CD. Por fim demonstramos alguns servicos de ferramentas ofertados
ao mercado, os quais possuem suporte aos ambientes mais atuais, destacando seus
recursos e seus custos de acordo com uma necessidade mnima.
Captulo 4

Construcao do ambiente com a


ferramenta gitlab-ce

Neste captulo sera proposto o uso da ferramenta do gitlab para a construcao de um am-
biente DevOps, para que exista uma centralizacao no acompanhamento dos processos.
Assim demonstraremos a utilizacao da ferramenta do gitlab, sitada no captulo 3 desta
pesquisa. Temos alguns objetivos a serem alcancados neste captulo, que sao:

Abordar a configuracao da ferramenta em um ambiente de producao.

Utilizar um exemplo de aplicacao web para percorrer o fluxo de entrega contnua.

Demonstrar as conclusoes sobre o uso da ferramenta

4.1 Arquitetura

O GitLab CI e uma parte do GitLab, uma aplicacao web com uma API que armazena
seu estado em um banco de dados. Ele gerencia projetos / compilacoes e fornece uma
interface de usuario agradavel, alem de todos os recursos do GitLab.

O GitLab Runner e uma aplicacao que processa compilacoes. Ele pode ser implantado
separadamente em uma maquina diferente da do gitlab server e funciona com o GitLab
CI atraves de uma API.
4. Construcao do ambiente com a ferramenta gitlab-ce 23

Para executar nossos testes, precisaremos de pelo menos uma instancia do GitLab e um
GitLab Runner.

4.2 Configurando as ferramentas

Nesta secao iremos implementar um tutorial exemplo de como construir um ambiente


de entrega contnua usando o gitlab-ce (Community Edition) a versao open source da
ferramenta. Iremos usar tambem utilizar os servicos da AWS. Lembrando que essa abor-
dagem cobre processos de CI e CD citados na secao 3 desse trabalho, o ambiente
proposto esta na fig 4.1.

Figura 4.1: Ambiente proposto para o uso do gitlab.


4. Construcao do ambiente com a ferramenta gitlab-ce 24

Assim como numa receita de bolo, primeiro iremos fazer uma lista de tudo que precisa-
remos:

Acesso a maquinas virtuais no AWS EC2.

Ter o servico do docker instalado em todas as maquinas que serao usadas. A AWS
permite que voce escolha uma maquina que ja possua o docker instalado, esse
passo sera mostrado a mais a frente.

Como mostrado na imagem, precisaremos de uma maquina para o servidor do


gitlab, nela teremos nosso processo de commit stage, facilitando revisoes e analises
de erros dos commits que estarao elegveis para o deploy.

Outra maquina virtual tera a funcao de processar os builds do projeto, criando o


ambiente especfico e executando sua switch de testes. Para isso o gitlab disponi-
biliza um instalador e um token para que o servidor do gitlab use o processamento
de uma outra, na execucao de build e teste do projeto.

Por fim precisaremos da maquina o qual recebera o deploy do projeto.

4.2.1 Configurando Gitlab server

Antes de instalar nosso servidor do gitlab, O primeiro passo e configurar uma VM no EC2
da AWS, as especificacoes da maquina estao na imagem 4.2

Figura 4.2: Exemplo de VMs que tem o Docker pre-instalado.


4. Construcao do ambiente com a ferramenta gitlab-ce 25

A unica configuracao especfica na criacao da nossa VM e a abertura de algumas portas,


figura 4.3. Pois por padrao as VMs da AWS sao criadas com todas suas portas fechadas
para acesso externo.

Figura 4.3: Configuracoes das portas ao acesso externo.

Depois de iniciar a VM partiremos para a instalacao do gitlab-ce server. Se voce


estiver utilizando o CentOS, os comandos abaixo tambem abrirao acesso HTTP e
SSH no firewall do sistema.
$ sudo apt - get install curl openssh - server ca - certificates
postfix

Adicionando pacote do gitlab server e instalando.

$ curl - sS $ https :// packages . gitlab . com / install / repositories /


gitlab / gitlab - ce / script . deb . $ sh | sudo bash
$ sudo apt - get install gitlab - ce

Configurando e iniciando o gitlab server


sudo gitlab - ctl reconfigure

Navegue ate o nome do host e faca o login. Na sua primeira visita, voce sera
redirecionado para uma tela de redefinicao de senha para fornecer a senha da
conta de administrador inicial. Digite a senha desejada e voce sera redirecionado
de volta para a tela de login.O nome de usuario da conta padrao e root. Forneca a
senha que voce criou anteriormente e faca o login. Apos o login, voce pode alterar
o nome de usuario se desejar.

Ao finalizar essa etapa teremos nosso servidor do gitlab, onde ja podemos utilizar a
ferramenta de controle de versao, gerenciamento de atividades, visualizacao de todo o
processo de entrega do sistema.
4. Construcao do ambiente com a ferramenta gitlab-ce 26

4.2.2 Configurando Gitlab Runner

Nesta secao iremos configurar a VM o qual processara os testes, e tera a funcao de


construir e enviar a aplicacao para deploy.

Baixar o instalador do Gitlab Runner de acordo com a versao da sua VM:

$ sudo wget -O / usr / local / bin / gitlab - runner https :// gitlab - ci -
multi - runner - downloads . s3 . amazonaws . com / latest / binaries /
gitlab - ci - multi - runner - linux -386
$ sudo wget -O / usr / local / bin / gitlab - runner https :// gitlab - ci -
multi - runner - downloads . s3 . amazonaws . com / latest / binaries /
gitlab - ci - multi - runner - linux - amd64
$ sudo wget -O / usr / local / bin / gitlab - runner https :// gitlab - ci -
multi - runner - downloads . s3 . amazonaws . com / latest / binaries /
gitlab - ci - multi - runner - linux - arm

E preciso dar permissoes de execucao:

$ sudo chmod + x / usr / local / bin / gitlab - runner

Criar um usuario para o GitLab CI:

sudo useradd -- comment GitLab Runner TCC -- create - home gitlab


- runner -- shell / bin / bash

Para registrar o Runner ao cliente Gitlab server, algumas etapas sao necessarias, estas
etapas sao descritas a seguir:

Pre-requisitos: Antes de registrar nosso Runner, precisamos de:

Ter o gitlab server instalado em uma VM

Obter o token de compartilhamento fornecido via Gitlab, esse token e encontrado


na pagina de pipeline CI/CD no gitlab server. A demonstracao dessa etapa se
encontra na figura 4.4:

Para registrar o runner instalado ao gitlab server precisaremos de:


4. Construcao do ambiente com a ferramenta gitlab-ce 27

Rodar o seguinte comando:

$ sudo gitlab - runner register

inserir a url do seu gitlab server:

Please enter the gitlab - ci coordinator URL ( e . g . https :// gitlab


. com )
https :// gitlab . com

Inserir o token que adquirimos para registrar nosso Runner:

Please enter the gitlab - ci token for this runner


xxxTOKENxxx

Adicionar uma descricao ao Runner, devido a possibilidade te ter varios com


propositos:

Please enter the gitlab - ci description for this runner


[ hostame ] my - runner

Adicionar uma tag, com essa tag voce pode diferenciar os projetos que serao exe-
cutados neste runner:

Please enter the gitlab - ci tags for this runner ( comma


separated ) :
my - tag , another - tag

Escolher se voce permite que projetos sem flags sejam executados (defaults to
false):

Whether to run untagged jobs [ true / false ]:


[ false ]: true

Escolher qual programa sera o executor do seu projeto, esse passo e bastante
importante devido ao uso do docker, que sera nosso Runner executor:

Please enter the executor : ssh , docker + machine , docker - ssh +


machine , kubernetes , docker , parallels , virtualbox , docker -
ssh , shell :
docker
4. Construcao do ambiente com a ferramenta gitlab-ce 28

Ao final desse passo, teremos uma infraestrutura capaz de ter um controle de versao do
nosso codigo, ambiente para revisoes de codigo, servidor de CI, e interface para implan-
tar um pipeline de deploy. Todo esse processo sera descrito em apenas um arquivo, que
sera abordado na proxima secao deste trabalho.

Figura 4.4: Obtencao de token para o GitLab Runner.


4. Construcao do ambiente com a ferramenta gitlab-ce 29

4.2.3 Descrevendo o Pipeline em um Unico Arquivo

A partir da versao 7.12, o GitLab CI usa um arquivo YAML (.gitlab-ci.yml) para a


configuracao do projeto. E colocado na raiz do seu repositorio e contem definicoes de
como seu projeto deve ser construdo [4].

O arquivo YAML define um conjunto de tarefas com restricoes indicando quando eles
devem ser executados. As tarefas sao definidos como elementos de nvel superior com
um nome e sempre devem conter pelo menos uma linha de script.

Iremos dividir nosso pipeline em duas partes, a primeira contem nosso pipeline de CI e
a segunda nossa parte de CD. Lembrando que as duas images sao partes de um unico
arquivo gitlab-ci.yml.

Figura 4.5: Primeira parte do gitlab-ci.yml.


4. Construcao do ambiente com a ferramenta gitlab-ce 30

Iremos descrever cada etapa da primeira etapa do nosso arquivo fig 4.5.

As especificacoes Image e services detalham para nosso Runner, qual servico sera
usado para construir nosso projeto.

A especificacao stages detalha os passos para construcao do nosso projeto, o qual


ficara visvel na interface do gitlab. Assim como na imagem abaixo:

before script: Como a construcao do projeto sera executada dentro de um container


docker, e preciso instalar algumas dependencias adicionais, como a de exemplo na
imagem.

variables: Aqui colocamos todas as variaveis de ambientes utilizadas na aplicacao,


como repositorio destino de releases. Em cada passo de estagio como test, rele-
ase e deploy os scripts para execucao de cada tarefa e passado ao arquivo.

Partimos agora para descricao da segunda parte do nosso arquivo. Iremos descrever as
etapas dos nossos ambientes de estagio e producao.

Figura 4.6: Exibicao dos ambientes implementados no gitlab-ci.yml.


4. Construcao do ambiente com a ferramenta gitlab-ce 31

Nesta etapa (fig 4.6)a tarefa de deploy e unica para qualquer ambiente. O que precisa-
mos notar e a descricao do atributo enviroment e a url destino do ambiente que recebera
o deploy.

4.3 Executando Fluxo da Ferramenta

Nesta secao iremos demonstrar como funciona a ferramenta, ao ser usada por uma
aplicacao web de exemplo, todo o projeto esta disponvel na referencia [18]. Os requisitos
tecnicos para a execucao do pipeline sao:

Docker;

Python;

Django.

Make

os passos a serem mostrados na execucao da ferramenta sao:

Estrutura do projeto;

Arquivo de configuracao de build do projeto;

Arquivo de configuracao Docker

Arquivo de configuracao do pipeline, gitlab-ci.yml

Etapa de commit stage;

Etapa de execucao de testes;

Etapa de deploy;

O primeiro passo e demonstrar a estrutura do projeto. O projeto e uma aplicacao Django,


onde temos um arquivo de teste, e nosso arquivo de Build sera construdo em um Make-
file, alem disso temos o arquivo Dockerfile para configuracao docker, que descreve como
a aplicacao e construda dentro de um container. A estrutura do projeto e demonstrada
na figura 4.7.
4. Construcao do ambiente com a ferramenta gitlab-ce 32

Figura 4.7: Exibicao dos ambientes implementados no gitlab-ci.yml.

Makefile, nele descrevemos nossos scripts de execucao, onde iremos construir o projeto,
executar nossos testes, e efetuar o deploy. Arquivo descrito a seguir:

MANAGE_PY = python manage . py


PROJECT_NAME = django_and_gitlab
dev : $ ( eval SETTINGS := $ ( SETTINGS_DEV ) )
prod : $ ( eval SETTINGS := $ ( SETTINGS_PROD ) )
build :
@docker build -t demo_app_gitlab .
runserver :
@docker run - it -p 8080:8080 demo_app_gitlab
test :
@docker run - it demo_app_gitlab $ ( MANAGE_PY ) test
deploy : build runserver

Nesta etapa, mostraremos como configurar o Dockerfile, este arquivo descreve os passos
necessarios para gerar seus container.

FROM python :3.6


RUN mkdir current /
COPY . current /
COPY requirements . txt current /
4. Construcao do ambiente com a ferramenta gitlab-ce 33

WORKDIR current /
RUN pip install -r requirements . txt
RUN python manage . py migrate -- noinput
CMD python manage . py runserver 0.0.0.0:8080

O arquivo descreve a linguagem necessaria para executar o projeto, copia o projeto para
dentro da imagem do container, instala as dependencias, e por fim, o CMD descreve que
quando o container for colocado em execucao, ele ira executar a aplicacao django.

Demonstrado os pontos anteriores, agora possumos os passos necessarios para entrar


no nosso pipeline de entrega contnua, pois podemos efetuar um commit da aplicacao,
efetuar o build do projeto, executar os testes, e se todo o fluxo for executado com sucesso,
a proxima etapa e o envio para um ambiente de testes e consequentemente de producao.

O proximo arquivo e o gitlab-ci.yml que descreve por quais etapas uma alteracao deve
percorrer ate ser entregue ao ambiente de producao.

image : docker : latest


services :
- docker : dind
stages :
- test
- staging
- production
variables :
C ON TA I N E R _ R E L E A S E _ I M A G E : demo_app_gitlab
test :
stage : test
script :
- make build
- make test
staging :
stage : staging
environment :
name : staging
url : https ://54.82.134.57
script :
4. Construcao do ambiente com a ferramenta gitlab-ce 34

- make deploy
only :
- master
deploy :
stage : production
environment :
name : production
url : https ://54.82.132.11
script :
- make deploy
only :
- master

Todas essas etapas do gitlab-ci.yml foram descritas na secao 4.2.3, onde descrevemos
os detalhes de cada etapa do arquivo.

Com todos esses arquivos descritos, o gatilho para a execucao do pipeline e efetuar
um commit no repositorio e acompanhar a execucao de todos os passos descritos no
gitlab-ci.yml.

Para a etapa de commit stage, a ferramenta proporciona um ambiente de revisao de


codigo e relatorio da execucao dos testes.Como podemos visualizar na figura 4.8.

Figura 4.8: Tela para analise de alteracoes de codigo

A primeira visao de fluxo na ferramenta pode ser visualizada na pagina de pipelines,


como na figura 4.9.
4. Construcao do ambiente com a ferramenta gitlab-ce 35

Figura 4.9: Exibicao inicial da execucao do pipeline

Uma nova visao pode ser observada ao clicar em uma das etapas em execucao, assim
teremos um acompanhamento da construcao e execucao de testes do projeto. Esse
etapa pode ser vista na figura 4.10.

Figura 4.10: Imagem de acompanhamento de execucao

Por fim da execucao de todas as etapas, teremos a visao da finalizacao do pipeline


descrito. Essa etapa pode ser vista na figura 4.11.
4. Construcao do ambiente com a ferramenta gitlab-ce 36

Figura 4.11: Exibicao inicial da execucao do pipeline

4.4 Consideracoes Finais

Nesta secao descrevemos um tutorial base para configuracao de um ambiente de en-


trega contnua, criacao de um pipeline generico de CI e CD para uma aplicacao web,
usando o gitlab, Make e docker, e o django. Podemos conhecer um pouco sobre o gi-
tlab Runner, ferramenta o qual podemos distribuir o processamento dos nossos testes, e
escalar assim que necessario.

Assim, ao usar esse o ambiente descrito, podemos nos beneficiar da centralizacao da


execucao do pipeline de entrega contnua, tendo em vista que o versionamento e a re-
visao de codigo (commit stage), estao na ferramenta, assim como os relatorios e todo o
acompanhamento das etapas de execucao de testes e deploy da aplicacao. Com isso
demonstramos uma alternativa para os ambientes efetivos de entrega contnua.

Outro ponto interessante e demonstrar que a o custo de uso da ferramenta e viavel com
as tabelas.

Relacao de precos comparado aos servicos citados na secao 3.


4. Construcao do ambiente com a ferramenta gitlab-ce 37

Tabela 4.1: Custos


servico concorrencia preco
Travis-ci 2 $129
CodeShip 2 $150

Tabela 4.2: Custos do ambiente com gitlab


servico VMs preco
gitlab-Server 1 $16.56
gitlab-Runner 2 $16.56
total 49.68

Os custos citados acima sao referentes aos encontrados no site da AWS no momento da
pesquisa. Segue a tabela abaixo:

Figura 4.12: Precos das VMs do servico EC2 da AWS.


Captulo 5

Conclusao

Devido ao grande desenvolvimento de projetos fazendo utilizacao da Computacao em


Nuvem, a necessidade de ter agilidade na entrega de sistemas e foco de varios estudos.
O surgimento do DevOps deixa mais evidente a necessidade de processos e ferramentas
ageis. Assim como a utilizacao do CI, CD , Docker e microservices , (todos citados nesta
pesquisa). Este trabalho mostrou os benefcios provindos da utilizacao de uma biblioteca
open source do gitlab, o gitlab-ce (community edition) como por exemplo uma maior
centralizacao de recursos no gitlab e AWS, compartilhamento de recursos ao usar o gitlab
Runner, facilidade na implementacao e reducao de custos com servicos de terceiros.

O objetivo principal desta pesquisa foi propor uma implementacao do gitlab-ce para co-
brir os processos de CI e CD, utilizando o Docker como provedor de dependencias da
aplicacao. O intuito foi mostrar a ferramenta de uma forma que os desenvolvedores ache-
a tao simples e usual, que a tenham como uma alternativa para construcao de ambientes
de entrega contnua.
Referencias Bibliograficas

[1] Codeship. URL https://codeship.com/.

[2] Docker. URL https://www.docker.com/what-docker.

[3] Django project. URL https://www.djangoproject.com/.

[4] Gitlab community edition. URL https://gitlab.com/gitlab-org/gitlab-ce.

[5] Jenkins. URL https://jenkins.io/.

[6] Travis-ci. URL https://travis-ci.com/.

[7] Charles Anderson. Docker. 2017.

[8] Estrella Julio Cezar Ferreira Carlos Henrique Gomes Filho Dionisio Machado Leite
Nakamura Luis Hideo Vasconcelos Reiff-Marganiec Stephan Santana Marcos Jose
Santana Regina Helena Carlucc Batista, Bruno Guazzelli. Performance Evaluation
of Resource Management in Cloud Computing Environments. 2015.

[9] Christian Bird Tamara Marshall-Keim Foutse Khomh Kim Moir Mozilla Bram Adams,
Stephany Bellomo. The practice and future of release engineering. IEE Software,
2015.

[10] George Champlin-Scharff. Devops and its practices. IBM, 2016.

[11] Lianping Chen. Continuous delivery: Huge benefits, but challenges too. IEEE soft-
ware, 2015.

[12] Josune Hernantes Christof Ebert, Gorka Gallardo and Nicolas Serran. Devops.
IEEE, 2016.

[13] Juha Itkonena Casper Lassenius b Eero Laukkanena. Problems, causes and soluti-
ons when adopting continuous delivery. ELSEVIER, 2016.
Referencias Bibliograficas 40

[14] EMA. Devops, continuous delivery, and the cloud journey: an evolutionary model.
IEEE, 2016.

[15] M. Fowler. Continuous delivery. 2013.

[16] AybukeAurum G.G. Claps, RichardBerntsson Svensson. On the journey to continu-


ous deployment: Technical and social challenges along the way. Information and
Software Tech, 2015.

[17] D. HUMBLE, J.; FARLEY. Continuous delivery: Reliable software releases through
build, test, and deployment automation. ISBN, 2010.

[18] JonnatasCabral. Django and gitlab. URL https://github.com/JonnatasCabral/


django_and_gitlab.

[19] Alberto Lluch Lafuente Manuel Mazzara Fabrizio Montesi Ruslan Mustafin Larisa Sa-
fina Nicola Dragoni, Saverio Giallorenzo. Microservices: yesterday, today, and tomor-
row. Cornell University, 2017.

[20] Timothy Grance Peter Mell. The nist definition of cloud computing. IBM, 2011.

[21] Chris Richardson. Microservices: Decomposicao de aplicacoes para implantacao e


escalabilidade. INFOQ, 2014.