gh-aw:GitHub 官方用 Go 写了个「AI CI/CD 编译器」,Markdown 即工作流
2026年2月,GitHub Next 团队发布了 gh-aw(Agentic Workflows)——一个用 Go 编写的 CLI 扩展,把 Markdown 自然语言编译成安全加固的 GitHub Actions。Agent 永远没有直接写权限,SafeOutputs 设计让 AI 自动化终于有了企业级安全感。
CI/CD 的第三次范式转变
GitHub Actions 自 2019 年发布以来,彻底改变了 CI/CD 的写法。但本质上,它仍然是「用 YAML 写代码」——开发者需要用 if/then 覆盖每一个边缘情况。
2026年,GitHub 提出了第三种范式:用自然语言写需求,AI 来执行。
# 传统 Actions:你必须预判每种情况
name: Triage
on:
issues:
types: [opened]
jobs:
triage:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
script: |
const title = context.payload.issue.title;
const body = context.payload.issue.body || '';
if (title.includes('bug') || body.includes('error')) {
github.issues.addLabels({...labels: ['bug']});
} else if (title.includes('feature')) {
github.issues.addLabels({...labels: ['feature']});
}
// ... 还有多少种情况没覆盖?
# Agentic Workflows:告诉 AI 你要什么
---
description: Automatically triage new issues
on:
issues:
types: [opened]
permissions:
contents: read
issues: read
safe-outputs:
add-comment:
max: 1
update-issue:
max: 1
---
# Issue Triage Agent
When a new issue is opened:
1. Read the issue title, body, and any code snippets
2. Classify it as bug, feature, question, docs, or chore
3. Assess priority (critical, high, medium, low)
4. Apply the appropriate labels
5. Post a helpful response
不用写一行逻辑代码。AI 理解上下文,自适应处理各种边缘情况——即使用户用中文提 Issue,用奇怪的格式描述 bug,AI 也能理解并正确分类。
项目概览
| 项目 | 详情 |
|---|---|
| 仓库 | github.com/github/gh-aw |
| 语言 | Go 1.25.8 |
| 当前版本 | v0.67.3(技术预览阶段) |
| Star 数 | 4,300+ |
| 团队 | GitHub Next + Microsoft Research |
| 核心贡献者 | Don Syme(F# 语言设计者,async/await 概念提出者) |
| 安装 | gh extension install github/gh-aw |
gh-aw 是一个 gh CLI 扩展,核心功能是将 .md 文件编译为 .lock.yml GitHub Actions 工作流。它不是「替代」GitHub Actions,而是在其上层构建了一层 AI 抽象。
Go 技术栈:GitHub 官方的品味
从 go.mod 看 GitHub Next 团队的 Go 技术选型:
require (
// CLI 框架
github.com/spf13/cobra v1.10.2
// Charm v2 全家桶(TUI界面)
charm.land/bubbles/v2 v2.1.0
charm.land/bubbletea/v2 v2.0.2
charm.land/huh/v2 v2.0.3
charm.land/lipgloss/v2 v2.0.2
// YAML 处理(比标准库快)
goccy/go-yaml v1.19.2
// MCP 协议官方 Go SDK
github.com/modelcontextprotocol/go-sdk v1.5.0
// GitHub Actions 静态分析
github.com/rhysd/actionlint v1.7.12
// 安全扫描
github.com/securego/gosec/v2 v2.25.0
// 并发工具
github.com/sourcegraph/conc v0.3.0
)
几个值得注意的选择:
- goccy/go-yaml 替代标准库:比 gopkg.in/yaml.v3 快 2-3 倍,支持 YAML Schema 验证
- Charm v2 全家桶:bubbletea/bubbles/lipgloss/huh 四件套,编译模式下有精美 TUI 界面
- actionlint 作为编译阶段安全检查:编译期就能发现 YAML 层面的安全问题
- 官方 MCP Go SDK:让 gh-aw 可以通过 MCP 为 Agent 提供 GitHub 工具
编译器:五阶段管线
gh-aw 的核心是 pkg/workflow/compiler.go(786行),一个五阶段编译器:
阶段 1:解析(Parse)
从 .md 文件中提取两部分:
- YAML Frontmatter(
---之间):声明式配置——触发器、权限、工具、安全策略 - Markdown 正文:自然语言指令,直接作为 AI Agent 的系统提示
阶段 2:验证(Validate)
编译器最重的阶段,包含十多个子验证器:
| 验证器 | 职责 |
|---|---|
| validateExpressionSafety | GitHub Actions 表达式白名单检查,防注入 |
| validateRuntimeImportFiles | 导入文件安全检查 |
| validateNoTemplateInjection | run: 命令中表达式注入检测 |
| validateContainerImages | 容器镜像验证 |
| validateNetworkConfig | 网络白名单验证 |
| validateSafeOutputs | 输出操作白名单和上限 |
| validateSandboxConfig | 沙箱配置验证 |
| validatePermissions | 权限审计(危险权限检查) |
关键常量约束:
const (
MaxLockFileSize = 512000 // .lock.yml 最大 500KB
MaxExpressionSize = 21000 // 单个表达式最大 21KB(GitHub硬限制)
MaxPromptChunkSize = 20000 // 每块提示词最大 20KB
MaxPromptChunks = 5 // 最多 5 块(总共 100KB 提示词)
)
阶段 3:编译(Compile)
将解析后的数据转换为 GitHub Actions YAML。关键设计是权限最小化和SafeOutputs 注入。
阶段 4:锁定(Lock)
输出 .lock.yml 文件——这是实际执行的工作流。开发者提交 .md,CI 系统编译出 .lock.yml,两者一起版本控制。
阶段 5:运行时(Runtime)
Agent 执行时,gh-aw 注入运行时防护:
- MCP 工具服务器:通过 Model Context Protocol 为 Agent 提供安全的 GitHub API 访问
- SafeOutputs 拦截:Agent 的所有写操作都经过白名单检查
- 沙箱隔离:网络访问受限,文件系统隔离
SafeOutputs:核心安全设计
这是 gh-aw 最重要的设计——Agent 永远没有直接写权限。
safe-outputs:
add-comment:
max: 3 # 最多发 3 条评论
update-issue:
max: 1 # 最多更新 1 次 Issue
create-pull-request:
max: 1 # 最多创建 1 个 PR
Agent 只能通过 SafeOutputs 发出「意图」,运行时验证后才执行。即使 AI 被 prompt injection 攻击,也无法:
- 删除仓库
- 修改 CI 配置
- 泄露 secrets
- 执行任意代码
实战示例
PR Review Agent
---
description: Review pull requests for security issues
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: read
pull-requests: read
safe-outputs:
add-comment:
max: 3
engine: claude
---
# PR Security Review
Review this pull request:
1. Check for SQL injection vulnerabilities
2. Verify input validation
3. Look for hardcoded secrets
4. Suggest security improvements
Issue 自动分类
---
description: Auto-label new issues
on:
issues:
types: [opened]
permissions:
contents: read
issues: read
safe-outputs:
add-label:
max: 5
add-comment:
max: 1
---
# Issue Triage
Classify this issue and apply labels:
- bug, feature, docs, question, chore
- priority: critical, high, medium, low
gh-aw vs 其他方案
| 特性 | gh-aw | 传统 Actions | GitHub Copilot Workspace |
|---|---|---|---|
| 编写方式 | Markdown 自然语言 | YAML + 代码 | 自然语言 + 代码 |
| 安全模型 | SafeOutputs 强制约束 | 开发者自行保证 | 平台托管 |
| AI 原生 | 是 | 否 | 是 |
| 可审计 | .lock.yml 版本控制 | 直接 YAML | 黑盒 |
| 离线编译 | 支持 | N/A | 需要网络 |
| 自托管 Runner | 支持 | 支持 | 不支持 |
安装与使用
# 安装 gh 扩展
gh extension install github/gh-aw
# 创建新工作流(交互式向导)
gh aw new
# 编译 Markdown 为 .lock.yml
gh aw compile workflow.md
# 监听模式(TUI 界面)
gh aw compile --watch workflow.md
# 验证工作流
gh aw validate workflow.md
总结
gh-aw 代表了 CI/CD 的第三次范式转变:从「用 YAML 写代码」到「用自然语言描述意图」。它的核心创新不是「用 AI 写 YAML」,而是重新设计了安全模型——Agent 永远没有直接写权限,所有操作都经过 SafeOutputs 验证。
对于 Go 开发者来说,gh-aw 的技术栈也值得关注:Cobra + Charm v2 + goccy/go-yaml + MCP SDK,这是 2026 年 Go CLI 开发的最佳实践组合。
开源地址:https://github.com/github/gh-aw