Anatomia de um workflow: triggers, jobs e steps
Objetivos desta aula
- Escolher triggers adequados
- Estruturar jobs paralelos e dependentes
- Usar matriz de versões
Um workflow reage a eventos: push, pull_request, schedule, workflow_dispatch (manual) e release. A escolha do trigger define o custo e a utilidade: validar em pull_request protege a main; publicar em push de tag garante que só versões marcadas geram artefato.
Jobs rodam em paralelo por padrão e em máquinas separadas, o que significa que nada é compartilhado automaticamente entre eles — use needs para ordenar e artifacts para transportar arquivos. Steps dentro de um job compartilham o mesmo runner e diretório.
Matriz é a forma de testar múltiplas versões sem duplicar YAML, e concurrency cancela execuções antigas do mesmo branch, economizando minutos e evitando confusão de resultados.
1. O que é CI e o que é CD
Integração contínua: a cada push, o código é compilado e testado automaticamente. Entrega contínua: todo commit aprovado vira um artefato pronto para produção. Deploy contínuo: esse artefato vai para produção sem intervenção manual.
2. Hierarquia do GitHub Actions
Workflow (arquivo em .github/workflows) → jobs (rodam em paralelo por padrão, cada um em uma máquina nova) → steps (comandos ou actions, em sequência, compartilhando o filesystem do job).
3. Triggers
push, pull_request, workflow_dispatch (manual), schedule (cron), release. Use filtros de branches e paths para não rodar o pipeline do backend quando só o README mudou.
4. Dependência entre jobs e artefatos
needs: test cria ordem. Como jobs não compartilham disco, passe arquivos com upload-artifact/download-artifact ou valores com outputs.
5. Matrix
strategy.matrix roda o mesmo job em várias versões (Node 18/20/22) ou sistemas, em paralelo.
6. Checagem final
Você deve ler um workflow e dizer o que roda, quando, em que ordem e em que máquina.
Na prática
CI do CloudShop em PRs
yaml
name: ci
on:
pull_request:
branches: [main]
push:
branches: [main]
permissions:
contents: read
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
qualidade:
runs-on: ubuntu-latest
strategy:
matrix:
node: [20, 22]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
cache: npm
- run: npm ci
- run: npm run lint
- run: npm test -- --coverage
- uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-node${{ matrix.node }}
path: coverage/
shell:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: sudo apt-get install -y shellcheck
- run: shellcheck scripts/*.shNota de segurança: Declare permissions no topo. O token padrão com escrita permite que uma dependência maliciosa altere o repositório.
Workflow com filtros, matrix e dependência
yaml
name: api-ci
on:
pull_request:
paths: ["api/**", ".github/workflows/api-ci.yml"]
push:
branches: [main]
concurrency:
group: api-ci-${{ github.ref }}
cancel-in-progress: true # cancela execucao antiga do mesmo branch
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix: { node: [20, 22] }
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: ${{ matrix.node }} }
- run: npm ci && npm test
working-directory: api
build:
needs: test # so roda se test passar
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t cloudshop-api:ci apiPor que isso importa
Pipeline é o que dá confiança para entregar várias vezes ao dia sem medo.
Erro comum
Assumir que arquivos gerados em um job estarão disponíveis em outro.
Dica de produção
Fixe actions por versão maior e evite referências a branch (@main) de terceiros.
Alerta de segurança
pull_request_target com checkout do código do PR é um vetor clássico de exfiltração de secrets.
Pergunta de entrevista
Qual a diferença entre job e step, e o que é compartilhado entre eles?
Glossário
- runner
- Máquina que executa um job do workflow.
- concurrency
- Regra que limita execuções simultâneas e pode cancelar as anteriores.
- runner
- Máquina que executa os jobs do workflow.
- matrix
- Estratégia que multiplica um job por combinações de parâmetros.
- concurrency
- Controle que evita execuções simultâneas do mesmo grupo.
Conexão com o CloudShop
Tornar o CI obrigatório para merge no cloudshop-app.
Quiz da aula
1. Como transportar arquivos entre dois jobs?
2. Jobs de um workflow compartilham o disco?
3. Como evitar rodar o CI da API quando só o README muda?
Minhas anotações
Salvo automaticamente neste navegador.