Criar fluxos de trabalho confiáveis – resultados, contextos, gatilhos e transferências entre tarefas
Nesta unidade, você aprenderá:
Como passar dados por fluxos de trabalho usando saídas de etapas e tarefas
Como usar GitHub contextos para configuração e controle
Como projetar fluxos de trabalho com gatilhos seguros e barreiras defensivas
Como garantir que os fluxos de trabalho só são executados no contexto correto
Como criar fluxos de trabalho confiáveis usando dados estruturados e lógica de evento
A autonomia deve ser projetada, não assumida
Tarefas diferentes têm riscos diferentes. Uma boa arquitetura de agente usa a política para expressar diferentes níveis de autonomia em vez de aplicar as mesmas regras em todos os lugares.
Um modelo de autonomia simples baseado em risco pode ter esta aparência:
| Tipo de tarefa | Caminhos de exemplo | Nível de risco | Design de autonomia |
|---|---|---|---|
| Baixo | docs/, formatação | Baixo | A mesclagem pode ser automatizada usando GitHub automerge após as verificações necessárias (e as revisões, se configuradas) serem aprovadas |
| Medium | src/, atualizações de dependências | Medium | PR obrigatório + verificações + pelo menos uma revisão |
| Alto | infra/, .github/workflows/ | Alto | CODEOWNERS + revisões múltiplas + conjuntos de regras mais rigorosos |
| Crítico | a produção implementa configurações e segredos | Crítico | aprovações ambientais; o agente prepara, mas não pode executar |
Implementação: aprovações de ambiente para execução de alto risco
Os ambientes fornecem um forte ponto de controle para ações arriscadas, como implantações e acesso a segredos protegidos. Se um ambiente estiver configurado com revisores necessários, um trabalho direcionado a esse ambiente será pausado até que a aprovação seja concedida.
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: production
steps:
- run: echo "Deploying to production..."
Esse design permite que o agente prepare as alterações, impedindo que ele execute ações que afetam a produção de forma independente.
Os resultados são contratos de fluxo de trabalho (resultados de etapa vs. resultados de tarefa vs. ambiente)
Quando um fluxo de trabalho gera informações que as etapas ou tarefas subsequentes precisam utilizar, trate esses dados como uma saída explícita, e não como “apenas logs”.
Ensinar e aplicar estes princípios:
As saídas das etapas transmitem valores entre as etapas de um mesmo trabalho.
Os resultados de trabalhos transmitem valores entre trabalhos (por meio de dependências entre trabalhos).
As variáveis de ambiente configuram o comportamento de runtime, mas não devem substituir as saídas para o fluxo de dados estruturado.
Padrão ilustrativo (com mecânica apresentada, mas não no formato de exame):
- id: generate_plan
run: |
echo "plan=high level steps..." >> "$GITHUB_OUTPUT"
- run: |
echo "Plan: ${{ steps.generate_plan.outputs.plan }}"
Para compartilhar resultados entre tarefas, publique o resultado de uma tarefa e faça referência a ele em uma tarefa 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 env
Use o contexto certo para a finalidade certa:
github.* → metadados de evento e decisões de runtime ("o que disparou essa execução?")
vars.* → valores de configuração gerenciados centralmente projetados para serem reutilizados
env.* → variáveis de ambiente no nível do trabalho e configuração de runtime
Gatilho seguro e bloqueio defensivo
Mesmo quando os fluxos de trabalho são projetados para PRs, os repositórios geralmente têm vários gatilhos. Adicione um mecanismo de verificação de segurança para que o comportamento "somente PR" não seja executado acidentalmente sem um contexto de PR.
Padrão geral a ser ensinado:
- Use condições de nível de trabalho para garantir que as ações dependentes de PR sejam executadas somente quando a execução estiver vinculada a um evento de PR.
Controle de acesso defensivo para comportamento restrito a solicitações de pull
Mesmo que um fluxo de trabalho seja executado apenas para solicitações de pull, ele ainda poderá ser disparado por outros eventos (por exemplo, push, workflow_dispatch ou agendamento). Sem proteções adicionais, etapas específicas de PR, como comentar uma solicitação de pull ou avaliar alterações, podem falhar ou se comportar inesperadamente.
Você pode evitar isso adicionando uma condição de nível de trabalho que garante que o fluxo de trabalho seja executado somente quando ele estiver associado a uma solicitação de pull.
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"
Principal conclusão: a confiabilidade do fluxo de trabalho melhora quando os planos e sinais são tratados como saídas estruturadas e protegidos por lógica sensível a eventos.
Em seguida, você operará os agentes com segurança, tornando as execuções auditáveis, controlando ferramentas e segredos e criando barreiras de proteção e padrões de confiabilidade baseados em hooks.