Integração e Entrega Contínua

Simulado respondido, com a resposta correta destacada e explicação de cada questão.

CI/CD - Conceitos Gerais

Questão 1
Qual é o objetivo principal da Integração Contínua (CI)?
  • A. Automatizar a implementação de software diretamente no ambiente de produção.
  • B. Mesclar com frequência alterações de código num repositório partilhado, validando-as com testes automáticos.
  • C. Gerir a infraestrutura do servidor através de código (IaC).
  • D. Substituir a necessidade de programadores realizarem testes unitários manuais.
Por quê: CI é sobre integrar código com frequência (várias vezes ao dia) num repositório compartilhado, rodando testes automáticos a cada mudança para detectar problemas cedo. Deploy em produção é papel do CD, não do CI.
Questão 2
Qual é a diferença fundamental entre Entrega Contínua (Continuous Delivery) e Implementação Contínua (Continuous Deployment)?
  • A. Não existe diferença; os termos são sinónimos no DevOps.
  • B. A Entrega Contínua requer uma intervenção manual para o lançamento em produção, enquanto a Implementação Contínua é automática.
  • C. A Entrega Contínua não utiliza pipelines de automação.
  • D. A Implementação Contínua foca-se apenas em ambientes de teste.
Por quê: Nos dois casos o código passa por testes automatizados e fica pronto para produção. A diferença está no "gatilho" do deploy: na Entrega Contínua alguém aperta o botão (decisão humana); na Implementação Contínua o deploy acontece sozinho assim que os testes passam.
Questão 3
Num pipeline de CI/CD, o que representa o termo 'Pipeline'?
  • A. Uma linguagem de programação utilizada para automação.
  • B. Uma ferramenta específica de chat para comunicação entre equipas.
  • C. Um conjunto de passos automatizados que o código percorre desde a submissão até à produção.
  • D. O hardware físico onde o código é guardado.
Por quê: Pipeline é a sequência de etapas (build, teste, deploy etc.) que o código atravessa automaticamente. Pense numa "linha de montagem" do código.
Questão 4
Qual destes é um benefício direto da adoção de práticas de CI/CD?
  • A. Garantia de que o código nunca terá bugs.
  • B. Eliminação total da necessidade de comunicação entre programadores e operações.
  • C. Redução do risco em cada lançamento através de atualizações menores e frequentes.
  • D. Aumento do tempo necessário para realizar uma build.
Por quê: Lançar mudanças pequenas e frequentes é mais fácil de testar e de reverter caso algo dê errado, reduzindo o risco de cada release. CI/CD não elimina bugs nem a comunicação entre equipas.
Questão 5
O que acontece normalmente na fase de 'Build' de um pipeline de CI?
  • A. Os servidores são desligados para manutenção.
  • B. O gestor de projeto aprova as novas funcionalidades.
  • C. O código é compilado e as dependências são resolvidas para gerar um artefato executável.
  • D. O software é vendido aos clientes finais.
Por quê: "Build" é literalmente a etapa de compilação: transformar o código-fonte, com suas dependências, num artefato pronto para ser testado/executado (ex.: um .jar, um binário, uma imagem Docker).
Questão 6
O que caracteriza um 'Staging Environment' num pipeline de CD?
  • A. Um ambiente isolado onde apenas são realizados testes unitários.
  • B. Uma réplica exata do ambiente de produção usada para testes finais antes do lançamento.
  • C. É o computador pessoal do programador onde o código é escrito.
  • D. O servidor onde o código-fonte é armazenado permanentemente.
Por quê: Staging existe para simular produção o mais fielmente possível, servindo de última validação antes do lançamento real.
Questão 7
Qual é a importância dos 'Testes de Regressão' num pipeline automatizado?
  • A. Testar a velocidade de escrita dos programadores.
  • B. Validar apenas o design visual da aplicação.
  • C. Apagar o histórico de commits do repositório.
  • D. Garantir que novas alterações não quebraram funcionalidades que já funcionavam anteriormente.
Por quê: "Regressão" significa "voltar atrás": esses testes existem para pegar casos em que uma mudança nova quebrou algo que já funcionava.

Linux - Linha de Comando

Questão 8
Qual comando é utilizado para listar os arquivos e subdiretórios em diretório, incluindo os arquivos ocultos?
  • A. show hidden
  • B. list --all
  • C. ls -l
  • D. ls -a
Por quê: A flag -a ("all") do ls mostra também arquivos ocultos (os que começam com ponto). Já -l só muda o formato de exibição (lista longa), sem mostrar ocultos.
Questão 9
Para mudar o proprietário de um arquivo no Linux, qual comando deve ser utilizado?
  • A. chown
  • B. chmod
  • C. own
  • D. Chgrp
Por quê: chown = "change owner". Não confundir com chmod (muda permissões) nem chgrp (muda apenas o grupo).
Questão 10
Qual comando permite visualizar o conteúdo de um arquivo de texto diretamente no terminal sem abrir um editor?
  • A. touch
  • B. cat
  • C. view
  • D. mkdir
Por quê: cat ("concatenate") imprime o conteúdo de um arquivo direto no terminal. touch cria arquivos vazios e mkdir cria diretórios.
Questão 11
Como se apaga um diretório que não está vazio através da linha de comandos?
  • A. delete --all
  • B. remove -dir
  • C. rm -r
  • D. Rmdir
Por quê: rmdir só apaga diretórios vazios. Para remover um diretório com conteúdo é preciso rm -r (recursivo), que apaga tudo dentro dele também.
Questão 12
Qual comando é utilizado para verificar o caminho completo do diretório onde se encontra atualmente?
  • A. pwd
  • B. cd
  • C. whereami
  • D. path
Por quê: pwd = "print working directory", mostra o caminho absoluto de onde você está. cd serve para mudar de diretório, não para mostrar o atual.
Questão 13
Qual é o comando utilizado para pesquisar padrões de texto dentro de arquivos?
  • A. locate
  • B. search
  • C. find
  • D. grep
Por quê: grep busca padrões de texto (inclusive expressões regulares) dentro do conteúdo dos arquivos. find busca arquivos pelo nome/atributos, não pelo conteúdo.
Questão 14
Para dar permissão total (leitura, escrita e execução) a todos os usuários num arquivo, qual comando chmod deve ser usado?
  • A. chmod +x
  • B. chmod 666
  • C. chmod 777
  • D. chmod full
Por quê: Cada dígito representa dono/grupo/outros, e 7 = leitura(4)+escrita(2)+execução(1). 777 dá todas as permissões a todo mundo. 666 não inclui execução.
Questão 15
Como se pode criar um arquivo vazio chamado 'notas.txt' de forma rápida?
  • A. new notas.txt
  • B. cp notas.txt
  • C. touch notas.txt
  • D. mkfile notas.txt
Por quê: touch cria um arquivo vazio (ou atualiza a data de modificação se já existir). É o jeito padrão e rápido no Linux.
Questão 16
Qual comando é usado para mover ou renomear arquivos e diretórios?
  • A. mv
  • B. rn
  • C. move
  • D. cp
Por quê: mv ("move") serve tanto para mover quanto para renomear (renomear é só "mover" para o mesmo lugar com outro nome). cp copia, não move.

Docker

Questão 17
Qual é a principal diferença entre uma Imagem Docker e um Container Docker?
  • A. Uma imagem é uma instância em execução, enquanto um Container é o modelo estático armazenado no disco.
  • B. Imagens são usadas apenas em ambiente de desenvolvimento e Containeres apenas em produção.
  • C. Não há diferença técnica, são apenas nomes diferentes para o mesmo conceito de virtualização.
  • D. Uma imagem é um modelo de leitura apenas (read-only), enquanto um Container é uma instância executável baseada nessa imagem.
Por quê: Pense na imagem como uma "planta"/molde imutável, e o container como uma "casa construída" a partir dessa planta, em execução. Você pode criar vários containers a partir da mesma imagem.
Questão 18
Qual é o objetivo principal do arquivo 'Dockerfile'?
  • A. Listar todos os Containers que estão atualmente em execução no host.
  • B. Gerir as permissões de utilizador dentro do Docker Hub.
  • C. Monitorizar o desempenho dos Containers em tempo real.
  • D. Contém as instruções necessárias para criar automaticamente uma imagem Docker.
Por quê: O Dockerfile é uma "receita": lista passo a passo (FROM, COPY, RUN, CMD...) como montar a imagem automaticamente.
Questão 19
No Docker, para que servem os 'Volumes'?
  • A. Para limitar a quantidade de memória RAM que um Container pode utilizar.
  • B. Para persistir dados gerados por um Container além do seu ciclo de vida.
  • C. Para isolar o tráfego de rede entre diferentes Containers.
  • D. Para aumentar a velocidade de processamento da CPU do Container.
Por quê: Por padrão, dados dentro de um container somem quando ele é removido. Volumes gravam esses dados fora do container (no host ou num volume gerenciado), fazendo-os sobreviver mesmo se o container for apagado.
Questão 20
Qual comando é utilizado para baixar uma imagem do Docker Hub para a sua máquina local sem necessariamente instanciar um container com base nela?
  • A. docker build
  • B. docker run
  • C. docker pull
  • D. docker push
Por quê: docker pull só baixa a imagem. docker run baixa (se não existir localmente) e já cria/inicia um container. docker push faz o caminho inverso (envia para o registro).
Questão 21
Qual é a principal diferença entre um Container Docker e uma Máquina Virtual (VM)?
  • A. As VMs inicializam mais rapidamente do que os Containers Docker.
  • B. Os Containers partilham o kernel do sistema operacional anfitrião (host), enquanto as VMs incluem um SO completo.
  • C. Os Containers Docker requerem um Hypervisor como o VMware ou VirtualBox.
  • D. Não existe diferença de performance entre ambos.
Por quê: Containers virtualizam só a aplicação e reutilizam o kernel do host, por isso são leves e rápidos. VMs carregam um sistema operacional inteiro por cima de um hypervisor, o que é mais pesado e lento para iniciar.
Questão 22
Qual é o comando utilizado para criar uma imagem a partir de um arquivo 'Dockerfile'?
  • A. docker create
  • B. docker run
  • C. docker build
  • D. docker push
Por quê: docker build lê o Dockerfile e gera a imagem. É diferente de docker run, que usa uma imagem já pronta para criar um container.
Questão 23
No Docker, o que acontece aos dados guardados dentro de um Container quando este é removido, caso não tenham sido utilizados volumes?
  • A. Os dados são perdidos permanentemente.
  • B. Os dados são movidos automaticamente para o Docker Hub.
  • C. O Docker impede a remoção do Container se houver arquivos novos.
  • D. Os dados persistem no disco do anfitrião (host) para sempre.
Por quê: Sem volume, os arquivos ficam só na camada de escrita do container. Ao remover o container, essa camada some e os dados se perdem — por isso volumes existem.
Questão 24
Qual instrução do Dockerfile define o comando padrão que será executado quando o Container for iniciado?
  • A. FROM
  • B. RUN
  • C. CMD
  • D. EXPOSE
Por quê: FROM define a imagem base, RUN executa comandos durante a construção da imagem, EXPOSE só documenta portas. CMD é o processo que roda quando o container é iniciado.
Questão 25
Qual é a principal diferença entre o comando 'docker run' e 'docker start'?
  • A. O 'docker start' é utilizado apenas para containers em modo 'detached'.
  • B. O 'docker run' cria e inicia um novo container a partir de uma imagem, enquanto o 'docker start' inicia um container que já existe e está parado.
  • C. O 'docker run' apenas descarrega a imagem, enquanto o 'docker start' executa o processo principal.
  • D. Não há diferença, são sinónimos utilizados em versões diferentes do Docker.
Por quê: run = criar (a partir da imagem) + iniciar. start = apenas religar um container que já existia e estava parado, sem criar um novo.
Questão 26
No contexto de um Dockerfile, para que serve a instrução 'EXPOSE'?
  • A. Para indicar em que portas o container escuta em tempo de execução, servindo como documentação.
  • B. Para definir a variável de ambiente da porta de rede da aplicação.
  • C. Para abrir automaticamente a porta no host e mapeá-la para o mundo exterior.
  • D. Para permitir que o container aceda à rede internet do host.
Por quê: EXPOSE é apenas informativo/documental. Quem realmente abre a porta para o host é a flag -p do docker run.
Questão 27
O que acontece se for executado o comando 'docker run -d nginx'?
  • A. O container é executado em segundo plano (background).
  • B. O Docker apaga o container imediatamente após a execução (deletable).
  • C. O container é executado com privilégios de administrador (debug mode).
  • D. O container é executado em modo interativo com um terminal aberto.
Por quê: A flag -d significa "detached" (segundo plano). Apagar automaticamente é a flag --rm, e modo interativo com terminal é -it.
Questão 28
Qual é a vantagem de utilizar 'Multi-stage builds' num Dockerfile?
  • A. Reduz o tamanho da imagem final ao separar o ambiente de compilação do ambiente de execução, copiando apenas o necessário.
  • B. Torna obrigatório o uso de Docker Compose para construir a aplicação.
  • C. Aumenta a velocidade de download das imagens base originais.
  • D. Permite executar múltiplos Containers ao mesmo tempo a partir do mesmo Dockerfile.
Por quê: Com multi-stage você usa um estágio "pesado" (com compiladores, dependências de build) só para gerar o artefato, e depois copia apenas esse artefato para uma imagem final leve (ex.: nginx:alpine), descartando tudo que não é necessário em produção.

Git

Questão 29
Qual comando é utilizado para criar um novo repositório Git local num diretório existente?
  • A. git init
  • B. git start
  • C. git clone
  • D. git create
Por quê: git init transforma uma pasta comum num repositório Git. git clone é para copiar um repositório remoto já existente, não para criar um do zero.
Questão 30
Após alterar um arquivo, qual comando é usado para adicioná-lo à 'Staging Area' antes do commit?
  • A. git push
  • B. git add
  • C. git commit
  • D. git stage
Por quê: git add move as mudanças para a área de staging (o "carrinho" antes de fechar a compra). Só depois de adicionado é que o git commit registra a mudança no histórico.
Questão 31
Como se pode verificar o estado atual do repositório, vendo quais arquivos foram modificados ou estão na staging area?
  • A. git log
  • B. git status
  • C. git show
  • D. git check
Por quê: git status é o "raio-x" do momento: mostra o que mudou, o que está staged e o que não está. git log mostra o histórico de commits, não o estado atual.
Questão 32
Qual comando cria um novo 'branch' (ramo) e muda para ele imediatamente?
  • A. git merge novo-ramo
  • B. git branch novo-ramo
  • C. git checkout -b novo-ramo
  • D. git switch novo-ramo
Por quê: git branch sozinho só cria o branch, sem mudar para ele. A flag -b do checkout faz as duas coisas: cria e já muda. (Equivalente moderno: git switch -c.)
Questão 33
Para baixar as alterações de um repositório remoto e mesclá-las automaticamente no seu ramo (Branch) local atual, qual comando usa?
  • A. git fetch
  • B. git pull
  • C. git push
  • D. git remote -v
Por quê: git pull = git fetch + git merge automático. O fetch sozinho só baixa as referências, sem mesclar no seu branch.
Questão 34
Como se visualiza o histórico completo de commits de um projeto?
  • A. git history
  • B. git status
  • C. git log
  • D. git list
Por quê: git log lista os commits em ordem cronológica, com autor, data e mensagem.
Questão 35
Qual comando é usado para enviar as suas alterações locais confirmadas para o repositório remoto?
  • A. git commit
  • B. git remote sync
  • C. git upload
  • D. git push
Por quê: git commit só registra localmente. Para mandar isso para o servidor remoto (ex.: GitHub) é preciso git push.
Questão 36
Qual comando mescla o conteúdo de um ramo específico (ex: 'feature') no ramo atual (ex: 'main')?
  • A. git pull feature
  • B. git join feature
  • C. git merge feature
  • D. git combine feature
Por quê: Estando em "main", git merge feature traz e combina as mudanças do branch "feature" para dentro do branch atual.
Questão 37
Qual é a função do comando 'git remote add origin <url>'?
  • A. Cria um novo repositório no GitHub automaticamente.
  • B. Faz o download imediato de todo o código do servidor.
  • C. Apaga todas as versões anteriores do código no servidor.
  • D. Vincula o seu repositório local a um repositório remoto específico, dando-lhe o nome de 'origin'.
Por quê: Esse comando só cria a referência/apelido ("origin") apontando para uma URL remota. Ele não cria repositório nem baixa nada sozinho — quem baixa é o fetch/pull.
Questão 38
Se apagou acidentalmente um arquivo e ainda não fez commit, qual comando (nas versões mais recentes do Git) é recomendado para restaurar esse arquivo?
  • A. git back
  • B. git restore <nome_do_arquivo>
  • C. git clean -f
  • D. git remove –undo
Por quê: git restore é o comando moderno para desfazer mudanças não commitadas em um arquivo, trazendo-o de volta ao último estado salvo. git clean -f remove arquivos não rastreados (o oposto do que queremos aqui).

GitHub Actions

Questão 39
Em qual diretório do repositório e com qual extensão os arquivos de workflow do GitHub Actions devem ser salvos?
  • A. .github/pipelines/ com extensão .json
  • B. .github/workflows/ com extensão .yml
  • C. config/actions/ com extensão .xml
  • D. .workflows/github/ com extensão .sh
Por quê: É uma convenção fixa do GitHub: os arquivos de workflow ficam em .github/workflows/ e são escritos em YAML (.yml ou .yaml).
Questão 40
Por padrão, de que maneira múltiplos jobs definidos dentro de um mesmo arquivo de workflow são executados se nenhuma dependência for especificada?
  • A. Em sequência, na ordem em que aparecem no arquivo.
  • B. De forma aleatória, dependendo da disponibilidade dos servidores.
  • C. Em paralelo, executando simultaneamente.
  • D. Apenas o primeiro job executa, cancelando os demais.
Por quê: Sem usar needs, o GitHub Actions assume que os jobs são independentes e os roda todos ao mesmo tempo, em runners separados, para ganhar velocidade.
Questão 41
Qual palavra-chave do YAML é utilizada na definição de um job para indicar que ele depende da conclusão bem-sucedida de outro job antes de iniciar?
  • A. depends_on
  • B. after
  • C. requires
  • D. needs
Por quê: needs: [nome_do_job] faz um job esperar outro terminar (com sucesso) antes de começar, criando uma sequência.
Questão 42
Como o GitHub Actions gerencia os dados armazenados na seção de Secrets do repositório para garantir a segurança?
  • A. Salva em texto claro e permite visualização a qualquer momento na interface do GitHub.
  • B. Criptografa os valores e exibe *** nos logs caso algum comando tente exibi-los.
  • C. Permite acesso apenas para usuários com perfil de administrador do sistema operacional.
  • D. Armazena os valores em arquivos públicos no diretório .github/workflows.
Por quê: Secrets são criptografados no GitHub e o próprio sistema de logs mascara automaticamente qualquer valor de secret que apareça na saída, mostrando ***.
Questão 43
Qual evento (on:) permite adicionar um botão chamado "Run workflow" na interface do GitHub para disparar a automação manualmente?
  • A. manual_trigger
  • B. repository_dispatch
  • C. workflow_dispatch
  • D. push
Por quê: workflow_dispatch é o evento que habilita o disparo manual pela interface do GitHub (o botão "Run workflow"). repository_dispatch é para disparos via API externa, não pelo botão da UI.
Questão 44
Qual função de status em condicionais (if:) garante que uma etapa de limpeza (cleanup) seja executada sempre, independentemente de sucesso, falha ou cancelamento das etapas anteriores?
  • A. always()
  • B. success()
  • C. failure()
  • D. cancelled()
Por quê: always() ignora o resultado das etapas anteriores e faz aquela etapa rodar sempre — ideal para limpeza de recursos ou notificações finais.
Questão 45
O que a expressão POSIX cron '0 0 * * *' configura ao ser utilizada em um evento agendado (schedule)?
  • A. Executa o workflow a cada 15 minutos.
  • B. Executa o workflow toda segunda-feira às 08:00 (UTC).
  • C. Executa o workflow todo dia à meia-noite (UTC).
  • D. Executa o workflow no dia 1º de cada mês ao meio-dia.
Por quê: A ordem dos campos cron é Minuto Hora Dia-do-mês Mês Dia-da-semana. "0 0 * * *" = minuto 0, hora 0 (meia-noite UTC), todo dia, todo mês, todo dia da semana — ou seja, todos os dias à meia-noite.
Questão 46
Qual é a principal diferença de visibilidade e segurança entre Variáveis de repositório e Secrets?
  • A. Variáveis usam criptografia, enquanto Secrets são exibidos em texto claro nos logs.
  • B. Variáveis armazenam dados não sensíveis visíveis em texto claro, enquanto Secrets são criptografados e mascarados.
  • C. Secrets funcionam apenas no escopo global, e Variáveis funcionam apenas dentro de um step.
  • D. Não há diferença prática de segurança entre ambos.
Por quê: Variáveis (Variables) são para configs não sensíveis (ex.: nome de ambiente) e aparecem em texto puro. Secrets são para dados sensíveis (senhas, tokens) e ficam criptografados/mascarados.
Questão 47
Para configurar uma etapa de notificação ou envio de logs que deve ser executada apenas se pelo menos uma etapa anterior do mesmo job falhar, qual função de status deve ser usada?
  • A. success()
  • B. failure()
  • C. always()
  • D. cancelled()
Por quê: failure() retorna verdadeiro só quando alguma etapa anterior falhou — ideal para disparar alertas apenas em caso de erro.
Questão 48
Em relação à sintaxe dos arquivos YAML no GitHub Actions, qual é a regra quanto à identação?
  • A. Deve-se utilizar obrigatoriamente a tecla TAB para alinhar os blocos.
  • B. Não é necessário manter identação no formato YAML.
  • C. Deve-se utilizar identação com espaços em branco (ex.: 2 espaços) e não utilizar a tecla TAB.
  • D. A identação só é exigida nas linhas iniciadas com - name:.
Por quê: YAML usa a identação para definir a hierarquia dos blocos, e essa identação precisa ser feita com espaços — caracteres TAB não são aceitos e quebram o arquivo.