O laboratório GQS utiliza o **GitLab** como ferramenta para gerenciar seus projetos.
O GitLab possui uma ferramenta chamada **gitlab-ci**, que possibilita o desenvolvedor de planejar, montar e executar fluxos de integração contínua em seus projetos.
Neste guia, vamos mostrar os principais componentes desta ferramenta, e explicar como eles funcionam.
### A linguagem básica do gitlab-ci
As pipelines do **gitlab-ci** são escritas em um arquivo com a extensão **.yml**, de nome **gitlab-ci.yml** que deve ficar na raiz do projeto.
Este arquivo conterá os scripts que deverão ser executados ao iniciar o fluxo de integração contínua.
Estas pipelines são compostas pelos seguintes componentes:
-**Jobs:** Que define o que deve ser feito, como um job para realizar um deploy ou rodar os testes, por exemplo.
-**Stages (ou estágios):** É composto por jobs, e é usado para definir em que ordem os jobs devem rodar.
O arquivo **gitlab-ci.yml**, em sua estrutura básica, terá os seguintes componentes:
-**Um valor `stages`**, contendo a lista de estágios do script.<br>
Por padrão, o os scripts do gitlab-ci possuem stages básicos, como `build`, `test` e `deploy`, mas o desenvolvedor pode usar o atributo `stages` para definir estágios especificos, como no exemplo:
```yml
stages:
-build
-test
-test_again
-deploy_on_dev
-deploy_on_prod
```
-**Uma sequência de jobs**, indicando o que deverá ser executado.<br>
Cada job pode possuir uma série de atributos, sendo seus atributos básicos:
-**`stage` (obrigatório):** Define em qual **stage** o **job** deverá ser executado.
-**`script` (obrigatório):** Define a sequência de comandos que deverão ser executados ao rodar o **job**.
-**`before_script` (opcional):** Um script a ser rodado antes de rodar o job, util para usar como preparação para executar alguma rotina, como instalação de dependências.
-**`when` (opcional):** Indica quando exatamente o job deverá ser rodado.<br>
Esta cláusula é útil quando queremos rodar algo manualmente, ou em uma situação
específica.<br>
Mais especificações na [documentação oficial](https://docs.gitlab.com/ee/ci/yaml/#when).
-**`only` (opcional):** Indica qual branch esse job deverá ser executado.<br>
É útil para quando temos um job de deploy, por exemplo, que deverá ser executado apenas
na branch master.
Aqui temos um exemplo de arquivo **gitlab-ci.yml** contendo todos os componentes citados:
Os **stages** serão executados na mesma ordem definida no valor `stages`.<br>
O motor do **gitlab-ci** tentará executar todos os jobs dentro de um stage em paralelo, e cada stage sequencialmente!
Jobs manuais, como o `test application` do exemplo, deverão ser executados manualmente através da interface de pipelines do próprio GitLab!
Com estas informações, o desenvolvedor já pode criar pipelines para a maioria dos casos de uso.
Para mais informações, ou especificações mais avançadas, favor ver na [Documentação oficial da linguagem gitlab-ci](https://docs.gitlab.com/ee/ci/yaml/).