Fundamentos de Workflow
Workflow Mínimo
# .github/workflows/ci.yml name: CI on: push jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: echo "Hello from CI"
Conceitos Principais
WorkflowArquivo YAML em .github/workflows/ que define automação
EventGatilho que inicia um workflow (push, PR, schedule, etc.)
JobConjunto de steps que rodam no mesmo runner
StepTarefa individual — executa comando ou usa uma action
RunnerVM que executa jobs (ubuntu-latest, macos-latest, windows-latest)
ActionUnidade de código reutilizável referenciada com uses:
Triggers
Eventos Comuns
on: push: branches: [main] pull_request: branches: [main] schedule: - cron: "0 6 * * 1" # every Monday 6 AM UTC workflow_dispatch: # manual trigger
Filtros de Evento
branches:Acionar somente para branches específicas
paths:Acionar somente quando arquivos correspondentes mudam
tags:Acionar em pushes de tag (v*)
types: [opened, synchronize]Filtrar tipos de atividade de PR
branches-ignore:Excluir branches específicas
paths-ignore:Excluir caminhos de arquivo específicos
Jobs e Steps
Configuração de Job
jobs: test: runs-on: ubuntu-latest needs: build # depends on build job if: github.ref == 'refs/heads/main' timeout-minutes: 10 steps: - uses: actions/checkout@v4 - run: npm test
Tipos de Step
run:Executar um comando shell
uses:Usar uma action publicada
with:Passar inputs para uma action
name:Nome de exibição na UI
id:Referenciar outputs do step via steps..outputs
if:Execução condicional
continue-on-error: trueNão falhar o job se o step falhar
Actions
Usando Actions
steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - uses: ./.github/actions/my-action # local action
Actions Populares
actions/checkout@v4Fazer checkout do código do repositório
actions/setup-node@v4Instalar Node.js
actions/setup-python@v5Instalar Python
actions/upload-artifact@v4Fazer upload de artefatos de build
actions/download-artifact@v4Baixar artefatos de outro job
actions/cache@v4Cachear dependências entre execuções
actions/github-script@v7Executar JS com cliente da API do GitHub
Variáveis de Ambiente
Definindo Variáveis
env: # workflow-level NODE_ENV: production jobs: build: env: # job-level CI: true steps: - run: echo "$MY_VAR" env: # step-level MY_VAR: hello
Variáveis Padrão
github.shaSHA do commit que acionou o workflow
github.refRef de branch ou tag (refs/heads/main)
github.repositoryNome owner/repo
github.actorUsuário que acionou o workflow
github.event_nameEvento que acionou o workflow
runner.osSO do runner (Linux, macOS, Windows)
Secrets
Usando Secrets
steps: - run: deploy --token "$TOKEN" env: TOKEN: ${{ secrets.DEPLOY_TOKEN }} - uses: some/action@v1 with: api-key: ${{ secrets.API_KEY }}
Regras de Secrets
secrets.GITHUB_TOKENToken gerado automaticamente com escopo do repositório
Settings → SecretsAdicionar secrets nas configurações do repo ou org
MaskingValores de secrets são mascarados nos logs automaticamente
Environment secretsCom escopo para um ambiente de deploy
Org secretsCompartilhados entre repos de uma organização
Estratégia Matrix
Builds em Matrix
jobs: test: strategy: matrix: os: [ubuntu-latest, macos-latest] node: [18, 20] runs-on: ${{ matrix.os }} steps: - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }}
Opções de Matrix
matrix:Definir combinações de variáveis para expandir
include:Adicionar combinações extras à matrix
exclude:Remover combinações específicas
fail-fast: falseContinuar outros jobs se um falhar
max-parallel: 2Limitar jobs matrix concorrentes
Cache
Cachear Dependências
- uses: actions/cache@v4 with: path: ~/.npm key: npm-${{ hashFiles('package-lock.json') }} restore-keys: npm-
Cache Embutido
- uses: actions/setup-node@v4 with: node-version: 20 cache: npm # auto-cache for npm/yarn/pnpm - uses: actions/setup-python@v5 with: python-version: "3.12" cache: pip # auto-cache for pip
Artifacts
Upload e Download
- uses: actions/upload-artifact@v4 with: name: build-output path: dist/ retention-days: 7 - uses: actions/download-artifact@v4 with: name: build-output
Notas sobre Artifacts
retention-daysAuto-excluir após N dias (padrão 90)
pathArquivo ou diretório para upload (suporta globs)
Cross-jobUpload em um job, download em outro com needs:
compression-level0 (nenhuma) a 9 (máxima), padrão 6
Padrões Comuns
Deploy Condicional
- name: Deploy to production if: github.ref == 'refs/heads/main' run: ./deploy.sh - name: Post PR comment if: github.event_name == 'pull_request' run: gh pr comment $PR --body "Build passed"
Expressões Úteis
success()Verdadeiro se todos os steps anteriores passaram
failure()Verdadeiro se algum step anterior falhou
always()Executar independente do status (limpeza)
cancelled()Verdadeiro se o workflow foi cancelado
contains(github.ref, 'release')Verificação se string contém
startsWith(github.ref, 'refs/tags')Verificação de prefixo de string
hashFiles('**/lock*')SHA-256 de arquivos (para chaves de cache)