📖 第一课:你的第一个标签触发工作流

预计完成时间:10 分钟  |  难度:入门  |  类型:知识 + 技能


本课目标

在本课结束时,你将能够:


核心概念:标签即命令

这两个参考仓库的核心思想很简单:标签是一种向自动化系统发送命令的方式

想象一下,你不是点击按钮或输入命令,而是给 GitHub Issue 加一个标签,然后机器人醒来开始工作:

agent:explore GitHub Action 触发 AI 代理探索代码库 发表评论分析 Issue
agent:implement GitHub Action 触发 AI 代理实现功能 创建 Pull Request
💡 要点:这个模式与你在终端中运行的命令没有本质区别——只是触发方式变成了给 Issue 设置标签。一旦你掌握了这个模式,你就可以用它来驱动任何自动化任务。

基础知识:让工作流"听到"标签

GitHub Actions 工作流使用 on 键来声明监听的事件。要监听标签添加事件,我们需要两个关键配置:

  1. 事件类型issues: types: [labeled] — 当任何标签被添加到 Issue 时触发
  2. 标签过滤if: github.event.label.name == 'agent:explore' — 只对特定标签响应

为什么这个模式很重要?

你可能会问:为什么不直接在 Issue 创建时触发?两个原因:


动手实践:你的第一个工作流文件

在你自己的仓库中,在 .github/workflows/ 目录下创建以下文件。我们从一个最简单的例子开始:当你在 Issue 上添加 agent:hello 标签时,机器人会在该 Issue 下回复一条评论。

📄 .github/workflows/agent-hello.yml
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 }}
📝 YAML 速查:[] 是语法,不是装饰
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: 块中声明
🔑 自动 vs 手动:GITHUB_TOKEN唯一自动注入的 secret——每次运行由 GitHub 当场生成,结束后立即作废,不需要你去 Settings 创建。但其他任何 secret(如 OPENAI_API_KEYDEPLOY_KEY)都必须去仓库 Settings → Secrets and variables → Actions 手动添加。

标签生命周期模式

你注意到了吗?工作流做的第一件事是移除触发标签。这不是可有可无的——它是一个关键的设计决策:

agent:hello 工作流开始 移除 agent:hello 执行任务 完成 ✅

为什么移除?因为如果工作流移除标签,标签会一直留在 Issue 上。下次你添加任何标签时,工作流会再次被触发——即使你不想这样。

在后面的课程中,我们将学习如何将移除替换为更高级的标签状态机(trigger → in-progress → done/blocked)。


✏️ 诊断性测验

以下测验帮助你检验是否真正理解了核心概念。请尝试在脑中回答后再展开答案。

1. 如果一个工作流监听 issues: types: [labeled]没有 if: 门控,会发生什么?

A. 什么都不会发生,因为没有指定标签
B. 只有在添加 agent:* 标签时才会触发
C. 任何标签被添加到任何 Issue 时,都会触发工作流
D. 工作流会因缺少配置而报错

2. 在工作流的第一步中移除触发标签的主要原因是什么?

A. 为了让 Issue 看起来更干净
B. 防止后续无关标签操作导致工作流再次误触发
C. GitHub 要求工作流必须清理自己的标签
D. 为了触发其他监听该标签移除的工作流

3. github.event.issue.number 的值从哪里来?

A. 需要手动在工作流文件中定义
B. 从仓库设置中读取
C. GitHub 自动从触发事件的 Issue 中提取
D. 通过 gh issue list 命令获取

4. 关于 secrets.GITHUB_TOKEN,以下哪项是正确的?

A. 需要去 Settings → Secrets 手动创建
B. 每次运行自动生成,结束后立即作废
C. 只有 GitHub 付费计划用户才能使用
D. 只有在使用了 actions/checkout 的工作流中才存在


🧪 技能练习:在你的仓库中部署这个工作流

现在是实际动手的时候了。在你的 GitHub 仓库中完成以下步骤:

  1. 1 在 GitHub 网页上打开你的仓库 → 点击 Add fileCreate new file → 文件名填 .github/workflows/agent-hello.yml(注意以点开头,workflows 有 s)→ 将上面的代码粘贴到编辑器 → 点击 Commit new file
  2. 2 进入仓库的 IssuesLabelsNew label → 名称填 agent:hello,颜色随意 → Create label
  3. 3 进入 IssuesNew issue → 随便写标题和内容 → 提交后在右侧 Labels 面板选 agent:hello
  4. 4 观察 Actions 标签页,查看工作流运行情况
  5. 5 检查 Issue 评论区 — 你应该看到机器人的回复!
🎯 完成检查:如果你看到了机器人发表的评论,你就成功创建了人生中第一个标签触发工作流!这个简单的模式是 sandcastle 和 course-video-manager 中所有复杂自动化的基础。

推荐进一步阅读


下一课:标签状态机 →

💬 有问题?在阅读或实践过程中遇到任何不清楚的地方,都可以直接向你的 AI 导师提问。例如: