预计完成时间:10 分钟 | 难度:入门 | 类型:知识 + 技能
在本课结束时,你将能够:
github.event.label.name 如何作为"选择器"工作gh CLI 操作标签和评论这两个参考仓库的核心思想很简单:标签是一种向自动化系统发送命令的方式。
想象一下,你不是点击按钮或输入命令,而是给 GitHub Issue 加一个标签,然后机器人醒来开始工作:
GitHub Actions 工作流使用 on 键来声明监听的事件。要监听标签添加事件,我们需要两个关键配置:
issues: types: [labeled] — 当任何标签被添加到 Issue 时触发if: github.event.label.name == 'agent:explore' — 只对特定标签响应你可能会问:为什么不直接在 Issue 创建时触发?两个原因:
在你自己的仓库中,在 .github/workflows/ 目录下创建以下文件。我们从一个最简单的例子开始:当你在 Issue 上添加 agent:hello 标签时,机器人会在该 Issue 下回复一条评论。
name: "Agent: Hello"
on:
issues:
types: [labeled]
jobs:
hello:
# 🔑 关键:只在特定标签被添加时运行
if: github.event.label.name == 'agent:hello'
runs-on: ubuntu-latest
permissions:
issues: write # 允许评论和操作标签
env:
GH_REPO: ${{ github.repository }} # 让 gh CLI 知道是哪个仓库
steps:
- name: "移除触发标签,防止重复触发"
run: |
gh issue edit "$ISSUE_NUMBER" \
--remove-label "agent:hello" || true
env:
ISSUE_NUMBER: ${{ github.event.issue.number }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: "发表评论"
run: |
gh issue comment "$ISSUE_NUMBER" \
--body "👋 你好!我收到了你的 \`agent:hello\` 命令。
这个 Issue 的标题是:**$ISSUE_TITLE**
🕐 触发时间:$(date -u '+%Y-%m-%d %H:%M:%S UTC')"
env:
ISSUE_NUMBER: ${{ github.event.issue.number }}
ISSUE_TITLE: ${{ github.event.issue.title }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
[] 是语法,不是装饰types: [labeled] 中的方括号是 YAML 内联数组写法。下面的写法完全等价:
types: [labeled] # 内联数组 — 紧凑
types: # 块级数组 — 多类型时更清晰
- labeled
如果误写成 types: labeled(去掉了 [] 或 -),YAML 会把它当成字符串而不是数组,GitHub Actions 将无法正确触发工作流。
| 配置 | 作用 |
|---|---|
on: issues: types: [labeled] |
告诉 GitHub:每次 Issue 被添加标签时,运行这个工作流 |
if: github.event.label.name == 'agent:hello' |
标签门控:只对 agent:hello 标签做出反应。如果没有这一行,任何标签的添加都会触发此工作流 |
github.event.issue.number |
触发此工作流的 Issue 编号。来自 GitHub 的 事件上下文 |
env: GH_REPO: ${{ github.repository }} |
⚠️ 容易遗漏:告诉 gh CLI 当前仓库是哪个。没有这行且未 checkout 代码时,gh 会因为找不到 .git 目录而报错 |
secrets.GITHUB_TOKEN |
GitHub 自动提供的令牌(无需手动创建)。权限在 permissions: 块中声明 |
GITHUB_TOKEN 是唯一自动注入的 secret——每次运行由 GitHub 当场生成,结束后立即作废,不需要你去 Settings 创建。但其他任何 secret(如 OPENAI_API_KEY、DEPLOY_KEY)都必须去仓库 Settings → Secrets and variables → Actions 手动添加。
你注意到了吗?工作流做的第一件事是移除触发标签。这不是可有可无的——它是一个关键的设计决策:
为什么移除?因为如果工作流不移除标签,标签会一直留在 Issue 上。下次你添加任何标签时,工作流会再次被触发——即使你不想这样。
在后面的课程中,我们将学习如何将移除替换为更高级的标签状态机(trigger → in-progress → done/blocked)。
以下测验帮助你检验是否真正理解了核心概念。请尝试在脑中回答后再展开答案。
1. 如果一个工作流监听 issues: types: [labeled] 但没有 if: 门控,会发生什么?
agent:* 标签时才会触发2. 在工作流的第一步中移除触发标签的主要原因是什么?
3. github.event.issue.number 的值从哪里来?
gh issue list 命令获取4. 关于 secrets.GITHUB_TOKEN,以下哪项是正确的?
现在是实际动手的时候了。在你的 GitHub 仓库中完成以下步骤:
.github/workflows/agent-hello.yml(注意以点开头,workflows 有 s)→ 将上面的代码粘贴到编辑器 → 点击 Commit new fileagent:hello,颜色随意 → Create labelagent:helloissues 事件的官方参考,包含 labeled、opened 等类型