A Execução de Jobs com Docker no GitLab CI/CD (FGV 2023)

Capa do artigo A Execução de Jobs com Docker no GitLab CI/CD (FGV 2023), sobre Conteinerização de aplicações e DeVOps, no blog do Acertei: fundo azul-marinho com o título em destaque
Ficha da questão
BancaFGV
Ano2023
ÓrgãoPref Niterói – Prefeitura Municipal de Niterói
ProvaAnalista (PGM Niterói) / Tecnologia da Informação
DisciplinaInfraestrutura
AssuntoConteinerização de aplicações e DeVOps
NívelSUPERIOR
Infográfico de estudo Execução de Jobs no GitLab CI/CD, resumindo Conteinerização de aplicações e DeVOps para concurso público: painéis com a definição, a comparação cobrada pela banca e a pegadinha mais frequente.
Diferença entre cláusulas e a conexão de serviços no Docker

A integração contínua e a entrega contínua (CI/CD) são pilares do desenvolvimento de software moderno, e o GitLab CI/CD é uma das ferramentas mais poderosas para essa automação. Um dos seus recursos mais cobrados em concursos é a capacidade de executar jobs de automação dentro de contêineres Docker. Isso garante um ambiente de build limpo, consistente e isolado. A questão da prova para Analista da PGM de Niterói (2023, FGV) é um exemplo perfeito de como as bancas testam o conhecimento fundamental sobre a configuração desses ambientes. A questão exigia saber como especificar a imagem Docker principal para o job de build e, crucialmente, como “anexar” um serviço secundário, como um banco de dados, também em um contêiner. Dominar essas duas diretivas, image e services, é o primeiro passo para gabaritar qualquer questão sobre o tema.

O Ambiente de Execução do Job: A Cláusula image

No coração de um job que roda com Docker no GitLab CI/CD está a palavra-chave image. Sua função é única e essencial: definir a imagem Docker que será usada para criar o contêiner onde os scripts do seu job serão executados. [2] Pense nela como a “planta” do sistema operacional e das ferramentas que seu job terá à disposição. Se você precisa compilar um código Java, usará uma image que contenha o JDK. Se for uma aplicação Node.js, usará uma imagem com Node.js.

No contexto da questão, o BuildJob precisa de um ambiente para automatizar o build da aplicação PGMApp. A diretiva image é a que fornece esse ambiente principal.

Exemplo de uso no arquivo .gitlab-ci.yml:


build_job:
  stage: build
  image: node:18-alpine
  script:
    - echo "Executando dentro de um contêiner baseado na imagem node:18-alpine..."
    - npm install
    - npm run build
    

Serviços de Apoio: A Cláusula services

Muitas aplicações não funcionam sozinhas. Elas dependem de serviços externos, como bancos de dados, servidores de cache ou APIs. A cláusula services foi criada exatamente para isso. Ela permite definir uma ou mais imagens Docker que rodarão em contêineres separados, mas vinculados em rede ao contêiner principal do job. [1]

No cenário da questão, a aplicação PGMApp precisa de um banco de dados para ser testada durante o build. Em vez de instalar um servidor de banco de dados do zero a cada execução (o que seria lento e ineficiente), Ana, a analista, pode simplesmente declarar uma imagem de banco de dados como um serviço. O GitLab Runner se encarrega de iniciar o contêiner do banco de dados e garantir que o contêiner do job (definido pela image) consiga se comunicar com ele. [3, 4]

Analisando as Alternativas Incorretas: Por que workflow e artifacts Estão Errados?

Entender por que as outras opções estão erradas é tão importante quanto saber a certa. Isso demonstra um domínio completo do fluxo de trabalho do GitLab CI/CD.

O Erro Conceitual de workflow

A palavra-chave workflow é utilizada no nível mais alto (top-level) do arquivo .gitlab-ci.yml. Sua função é controlar se e quando um pipeline inteiro deve ser executado. Por exemplo, você pode usar workflow:rules para impedir a execução de pipelines duplicados para merge requests ou para executar pipelines apenas em branches específicos. Ela não tem nenhuma relação com a definição de imagens Docker dentro de um job específico.

O Erro Conceitual de artifacts

A palavra-chave artifacts define os resultados de um job que devem ser preservados e disponibilizados para jobs posteriores no mesmo pipeline. Pense nela como a “saída” ou o “produto” de um job. Por exemplo, após o BuildJob compilar a aplicação, ele pode declarar o arquivo binário gerado como um artefato. Um DeployJob em um estágio seguinte poderia então baixar e usar esse artefato para fazer a implantação. Portanto, artifacts lida com o que o job *produz*, enquanto image e services lidam com o ambiente em que o job *executa*.

Expandindo o Conhecimento: Conceitos Correlacionados

O Arquivo .gitlab-ci.yml

Este é o arquivo central que define todo o seu pipeline de CI/CD. Ele é escrito em YAML (YAML Ain’t Markup Language), um formato de serialização de dados legível por humanos. A estrutura é hierárquica e utiliza palavras-chave (keywords) reservadas, como image, services, script, stages, workflow e artifacts, para descrever o que, quando e como automatizar.

Runners com Executor Docker

Nada disso funcionaria sem um GitLab Runner. O Runner é o agente que efetivamente executa os jobs. Ele pode ser configurado com diferentes “executores”, que determinam como o job será rodado (ex: `shell`, `virtualbox`, `kubernetes`). Para que as cláusulas image e services funcionem, o Runner deve estar configurado com o executor docker ou docker-machine. [2]

Apelidos (alias) para Serviços

E se você precisar de dois bancos de dados da mesma imagem? Por padrão, ambos teriam o mesmo hostname, causando um conflito. Para resolver isso, você pode usar a palavra-chave alias dentro da definição do serviço. Isso permite que você defina um hostname personalizado para o serviço, garantindo que ele seja unicamente acessível pelo contêiner do job. [5]


test_job:
  image: ruby:3.1
  services:
    - name: postgres:14
      alias: db-primario
    - name: postgres:14
      alias: db-secundario
  script:
    - "bundle exec rspec" # Script de teste que pode acessar 'db-primario' e 'db-secundario'
    

Compreendendo a função distinta de image, services, artifacts e workflow, você não apenas resolve a questão proposta, mas se prepara para uma vasta gama de problemas práticos e teóricos sobre automação com GitLab CI/CD.

Mapa da Aprovação: Resumo Esquematizado

Cláusula (.gitlab-ci.yml)Função PrincipalContexto de UsoAnalogia para Memorização
imageDefine o ambiente de execução principal do job.Dentro de um job, para especificar o contêiner Docker base.A Cozinha: Onde todo o trabalho principal é feito.
servicesDefine contêineres auxiliares (dependências) para o job.Dentro de um job, para fornecer serviços como bancos de dados ou caches.Os Eletrodomésticos: Ferramentas de apoio (micro-ondas, batedeira) que a cozinha usa.
artifactsPreserva arquivos e diretórios gerados por um job.Dentro de um job, para passar seus resultados para jobs futuros.O Prato Pronto: O resultado final que sai da cozinha para ser servido.
workflowControla a execução do pipeline como um todo.No nível raiz do arquivo, para definir regras globais de execução.O Cardápio: Define quais pratos (pipelines) serão feitos hoje.

Teste Seus Conhecimentos: Questões de Fixação

Referências:

  1. [1] Services | GitLab Docs
  2. [2] Run your CI/CD jobs in Docker containers – GitLab Docs
  3. [3] Index · Services · Ci · Help · GitLab
  4. [4] Index · Services · Ci · Help · GitLab – ETSI Labs
  5. [5] GitLab Services in CI/CD Pipelines | by Anju – Medium
Resolva questões comentadas como esta no aplicativo do Acertei.Começar agora, no navegadorBaixar o appSem instalar nada: o Acertei abre direto no navegador.

Leia também

Política de Privacidade | Termos de Uso | Preferências de cookies
Rolar para cima