Uma introdução ao GitLab CI/CD
Tags: devops, beginners, webdev
Published: 2023-02-06 20:42:36

## Conceitos básicos sobre CI/CD
Integração Contínua
Resumidamente, é uma prática de desenvolvimento de software em que os desenvolvedores, de forma regular e confiável, juntam suas alterações de código em um repositório central. Depois disso, builds e testes são executados.

Este processo pode ser muito trabalhoso se feito de forma manual. Por isso, hoje utilizamos diversas ferramentas para automatizar esse processo, sendo o Gitlab uma delas. Dessa forma, é possível criarmos scripts que vão “buildar” e “testar” nossa aplicação automaticamente sempre que um desenvolvedor fizer um “push” no repositório que especificarmos.

### Entrega Contínua
Segundo a documentação do Gitlab, é um passo além da integração contínua. Onde sua aplicação não é somente “buildada” e testada, mas também “deployada” continuamente. Mas você ainda realiza o deploy manualmente.

### Implantação Contínua

Segundo documentação do Gitlab, é outro passo além da Integração Contínua onde o deploy ocorre de forma automática sem intervenção humana.

Por fim, Segundo Lucas Gertel:

> Juntas, essas práticas conectadas costumam ser chamadas de “𝗖𝗜/𝗖𝗗 𝗣𝗶𝗽𝗲𝗹𝗶𝗻𝗲”. Eles geralmente são mantidos usando a abordagem DevOps ou SRE. Existem vários benefícios de ter pipelines de CI/CD, como melhor colaboração e qualidade de código, bem como sistemas mais ágeis e confiáveis.

Agora vamos entender na prática como construir um simples pipeline com Gitlab.


## Gitlab
O que é o Gitlab?
Segundo meu entendimento: é uma plataforma com ferramentas e soluções de DevSecOps que busca ajudar as empresas a entregar software de maneira mais rápida através da automatização de processos.
Para mais informações, sugiro visitar o site oficial: https://about.gitlab.com/

### Conceitos de CI/CD no Gitlab

**pipeline**: É um fluxo de etapas chamadas de stages que executam um ou mais jobs. A ideia é que quando realizamos um ‘push’ para alguma branch mapeada, esse pipeline vai ser disparado pelo Gitlab e vai realizar todas as etapas necessárias para entregar essas alterações no ambiente em questão, tudo de forma automática.
**stage**: é uma agregação lógica de jobs. Exemplos de stages: build, test.
**job**: É um dos elementos fundamentais do pipeline. Sua principal função é executar scripts que contém comandos de Linux, Node, Maven, depende do objetivo do job.

### Construindo um pipeline com Gitlab

Para começar, precisamos criar um arquivo específico na raiz do seu repositório, chamado: .gitlab-ci.yml

O Gitlab reconhece esse arquivo e executa automaticamente qualquer pipeline configurado nele assim que uma ação específica acontece, como por exemplo um merge na branch master.

É neste arquivo que vamos descrever todo nosso pipeline e diferentes estratégias para diferentes branches, dependendo do seu contexto. É complicado mostrar um exemplo real, pois o pipeline é construído de forma particular ao seu código, projeto, estratégias, etc… então vou mostrar um exemplo simples da Digital Ocean (veja referências).

Arquivo .gitlab-ci.yml:

```
image: node:latest

stages:
  - build
  - test

cache:
  paths:
    - node_modules/

install_dependencies:
  stage: build
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/

test_with_lab:
  stage: test
  script: npm test
```

Neste simples pipeline temos:

- A definição global de uma image do tipo “node:latest” que será usado por todos os jobs que não especificarem uma imagem.
- Dois estágios, sendo eles “build” e “test”
- Realizaremos cache do diretório node_modules, porque pode ser necessário em outro job
- Temos o job install_dependencies que vai executar no stage de build. Seu script possui um único comando “npm install” que gera o artefato node_modules
- Temos um segundo job test_with_lab que vai executar no stage de “test” cujo script possui apenas o comando “npm test”
- Como neste exemplo não foi especificado onde esses jobs vão executar, por exemplo “only: master”, então basta realizar um commit de teste e o pipeline começa a executar conforme imagem abaixo:
![Exemplo de pipeline executando no Gitlab](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pvi4n147mr9o8sj993oi.png)


## Conclusão
Chegamos ao final deste overview de Gitlab, a ideia realmente não era aprofundar, mas introduzir conceitos de CI/CD, exemplificar com o Gitlab e mostrar as vantagens de utilizar essas práticas que hoje já são bem difundidas e utilizadas no mercado.
Espero ter contribuído e qualquer dúvida, crítica ou sugestão, fiquem a vontade para deixar nos comentários.


### Referências
https://www.redhat.com/pt-br/topics/devops/what-is-ci-cd
https://www.linkedin.com/feed/update/urn:li:activity:7026552798615941120/
https://docs.gitlab.com/ee/ci/introduction/
https://www.digitalocean.com/community/tutorials/como-configurar-pipelines-de-integracao-continua-com-o-gitlab-ci-no-ubuntu-16-04-pt