Construa fluxos de trabalho fiáveis – saídas, contextos, gatilhos e transferências entre tarefas
Nesta unidade, você aprenderá:
Como passar dados através de fluxos de trabalho usando os resultados por etapas e trabalhos
Como usar contextos do GitHub para configuração e controlo
Como desenhar fluxos de trabalho com gatilhos seguros e bloqueios defensivos
Como garantir que os fluxos de trabalho funcionam apenas no contexto correto
Como construir fluxos de trabalho fiáveis usando dados estruturados e lógica de eventos
A autonomia deve ser desenhada, não assumida
Diferentes tarefas acarretam riscos distintos. Uma boa arquitetura de agentes usa políticas para expressar diferentes níveis de autonomia em vez de aplicar as mesmas regras em todo o lado.
Um modelo simples de autonomia baseado no risco poderia ser assim:
| Tipo de tarefa | Caminhos de exemplo | Nível de risco | Projeto de autonomia |
|---|---|---|---|
| Low | docs/, formatação | Low | O merge pode ser automatizado usando o automerge do GitHub após as verificações obrigatórias (e revisões, se configuradas) passarem |
| Medium | src/, atualizações de dependências | Medium | PR obrigatório + verificações + pelo menos uma avaliação |
| Alto | infra/, .github/workflows/ | Alto | CODEOWNERS + múltiplas análises + conjuntos de regras mais rigorosos |
| Crítico | Produção implementa cenários, segredos | Crítico | aprovações de ambiente; O agente prepara mas não consegue executar |
Implementação: aprovações ambientais para execução de alto risco
Os ambientes fornecem um ponto de controlo forte para ações arriscadas, como implantações e acesso a segredos protegidos. Se um ambiente estiver configurado com revisores obrigatórios, um trabalho direcionado para esse ambiente fará uma pausa até que a aprovação seja concedida.
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: production
steps:
- run: echo "Deploying to production..."
Este design permite ao agente preparar alterações enquanto impede que execute ações que impactam a produção de forma independente.
Os outputs são contratos de fluxo de trabalho (outputs de etapas vs outputs de trabalhos vs ambiente)
Quando um fluxo de trabalho gera informação que passos posteriores ou trabalhos têm de consumir, trate esses dados como uma saída explícita em vez de "apenas registos".
Ensine e aplique estes princípios:
As saídas dos passos transmitem valores entre passos na mesma tarefa.
Os resultados do trabalho transferem valores entre tarefas (através de dependências de tarefas).
As variáveis de ambiente configuram o comportamento em tempo de execução, mas não devem substituir as saídas para o fluxo de dados estruturados.
Padrão ilustrativo (demonstrações apresentadas, mas sem formato de exame)
- id: generate_plan
run: |
echo "plan=high level steps..." >> "$GITHUB_OUTPUT"
- run: |
echo "Plan: ${{ steps.generate_plan.outputs.plan }}"
Para partilha entre tarefas, publique um resultado de trabalho e faça referência a ele a partir de um trabalho dependente:
jobs:
plan:
outputs:
plan: ${{ steps.generate_plan.outputs.plan }}
steps:
- id: generate_plan
run: echo "plan=..." >> "$GITHUB_OUTPUT"
implement:
needs: plan
steps:
- run: echo "Using plan: ${{ needs.plan.outputs.plan }}"
Contextos: GitHub vs vars vs ambiente
Use o contexto certo para o propósito certo:
GitHub.* → metadados de eventos e decisões em tempo de execução ("O que desencadeou esta execução?")
vars.* → valores de configuração geridos centralmente, concebidos para serem reutilizados
env.* → variáveis de ambiente ao nível do trabalho e configuração em tempo de execução
Ativação segura e filtragem defensiva
Mesmo quando os fluxos de trabalho são desenhados para PRs, os repositórios frequentemente têm múltiplos gatilhos. Adicione bloqueios defensivos para que o comportamento "apenas PR" não apareça acidentalmente sem contexto PR.
Padrão geral a ensinar:
- Use condições a nível de trabalho para garantir que as ações dependentes de PR só sejam executadas quando a execução estiver ligada a um evento PR.
Bloqueio defensivo para comportamento apenas de pull requests
Mesmo que um fluxo de trabalho seja pensado para ser executado apenas para pull requests, pode ainda assim ser desencadeado por outros eventos (por exemplo, push, workflow_dispatch ou agendamento). Sem salvaguardas adicionais, passos específicos de RP — como comentar um pull request ou avaliar alterações — podem falhar ou comportar-se de forma inesperada.
Pode evitar isto adicionando uma condição ao nível do trabalho que garanta que o fluxo de trabalho só corre quando está associado a um pull request.
name: PR Validation
on:
pull_request:
branches: [ main ]
workflow_dispatch: # allows manual runs, but still gated below
jobs:
validate-pr:
# Defensive gating: only run if this is actually a PR context
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: npm test
- name: Comment on PR
run: echo "Validation complete"
Conclusão chave: A fiabilidade do fluxo de trabalho melhora quando planos e sinais são tratados como saídas estruturadas e protegidos por lógica consciente de eventos.
De seguida, irá operar os agentes em segurança, tornando as execuções auditáveis, controlando ferramentas e segredos, e construindo rails de proteção baseados em ganchos e padrões de fiabilidade.