开始之前
你需要一个自己有管理员权限的 github.com 仓库、本机的 Claude Code,以及用 gh auth login 登录好的 GitHub CLI。GitLab 或 Bitbucket 的远程仓库用不了快速安装。好几款 Anthropic 产品都叫 Claude Code,这一课只讲 Anthropic 的 GitHub Actions 页面里的 claude-code-action 工作流集成。
这个 action 建立在 Agent SDK 之上,claude_args 接受的参数和无头运行那一课里的 claude -p 一样。安全方面的细节来自仓库自己的文档。以上内容都读于 2026 年 11 月 4 日,GitHub Actions 页面在本课更新时又核对过一遍。
这个 action 发版很勤,所以固定写 @v1,让它自己往前走。下面几个数字说明它用得有多广,以及本课核对时它有多新。
安装它,发出第一条 @claude
快速安装会装上 Claude GitHub App,并把你的凭据存成仓库密钥,然后用一个拉取请求把工作流提交给你。这份工作流就是下面这个,手动安装时也是从仓库的 examples 文件夹里复制它。
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
claude:
if: contains(github.event.comment.body, '@claude')
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
id-token: write
actions: read
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}- 在仓库里打开
claude,运行/install-github-app。Claude Code 先安装应用。如果它已经有 API 密钥就直接复用,否则你要在“用 Claude 订阅生成的长期令牌”和“粘贴一个 API 密钥”之间二选一。 - Claude Code 把凭据存成密钥:API 密钥叫
ANTHROPIC_API_KEY,订阅令牌叫CLAUDE_CODE_OAUTH_TOKEN。接着它推送一个分支,里面是你选的工作流文件,已经指向那个密钥,并打开 GitHub,一个拉取请求已经备好,等你创建。 - 创建并合并这个拉取请求。然后在某个 issue 下评论一个请求,比如
@claude how should I implement user authentication for this endpoint?。Claude 会在同一个 issue 下用一条评论回答,并随着工作进展更新它。 - 本机没有 Claude Code,或者命令失败时,就手动安装。装上 Claude GitHub App,添加密钥,把工作流复制进
.github/workflows/。用订阅令牌的话,在本机运行claude setup-token,再把anthropic_api_key那一行改成claude_code_oauth_token。
工作流的每一部分有什么用
Anthropic 的页面点出了那些不是样板的行。大多数麻烦都出在其中某一行不见了。
id-token: write是默认的 GitHub App 认证所必需的。缺了它就会出现 OIDC 错误,而且即使你为工作负载身份联合传入了自己的令牌,这个权限也还是要保留。actions: read让 Claude 能读拉取请求上的 CI 结果。FAQ 还建议在 action 这一步上加additional_permissions: actions: read。actions/checkout给 Claude 一份仓库的本地副本。Claude 做浅克隆,拉取请求是 20 个提交,新分支是 1 个,所以需要完整历史时要自己设置检出深度。if让没有@claude的评论不会启动 runner。action 在响应之前,自己也会检查触发短语。- contents、issues 和 pull requests 给予写权限,因为它们正是这个 action 依赖的三项应用权限:Claude 修改文件、回应 issue 并推送改动。
两种模式,以及谁能触发运行
action 从工作流里自动判断模式,没有 mode 输入可设。没有 prompt 时它以交互方式运行,等着触发短语,默认是 @claude,出现在评论、评审,或者新 issue 的标题和正文里。有 prompt 时它以自动化模式,在你的 on: 块里写的任何事件上运行,结果会进运行日志,除非提示词让 Claude 把它发出来。
纯文本的提示词没有 shell 或 GitHub API 的访问权,直到你用 claude_args 里的 --allowedTools,或者 settings 输入里的 permissions.allow 规则授予工具。技能则带上它 allowed-tools frontmatter 里写的工具。页面里的这个代码评审工作流只授予一个行内评论工具,并让令牌保持只读。
name: Code Review
on:
pull_request:
types: [opened, synchronize, ready_for_review, reopened]
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
plugin_marketplaces: "https://github.com/anthropics/claude-plugins-official.git"
plugins: "code-review@claude-plugins-official"
prompt: "/code-review:code-review --comment ${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
claude_args: '--allowedTools "mcp__github_inline_comment__create_inline_comment"'| 触发者 | 结果 |
|---|---|
| 有写权限的用户 | 运行启动 |
| 没有写权限的用户 | 被拒绝。allowed_non_write_users 可以取消这项检查,而且只有配合你自己的 github_token 才有效 |
| 机器人或 GitHub App | 除非列进 allowed_bots,否则被拒绝。列入名单的机器人不做权限检查 |
| 定时运行 | 不做写权限检查。GitHub 把它记在最后修改 cron 那一行的用户名下,那里如果是机器人,就必须列进 allowed_bots |
由 fork 拉取请求启动的 workflow_run | action 还会检查发起上游运行的那个人,如果他没有写权限就会停下。绕过它的办法是 allowed_non_write_users 配合你自己的 github_token |
Claude 能碰到什么,以及检出这个陷阱
action 在你的 runner 上运行,用的是 Claude GitHub App 发的短期令牌。这个令牌的范围限定在这次运行所在的那一个仓库。安装应用就等于授予它的整套权限,GitHub 不允许只接受一部分。如果你的组织只想要 contents、issues 和 pull requests,文档介绍了只含这三项的自定义 GitHub App。仓库安全页面列出的应用权限比文档表格里的少,所以请以安装界面为准。
默认情况下 Claude 不会自己开拉取请求。按安全页面的说法,它把改动提交到一个新分支,并贴出创建页面的链接,由人来决定,分支保护依然挡在流程里。FAQ 说 Claude 从不合并、变基或强制推送,而且这写在它的系统提示词里,所以即使你放行了 git 工具,这一点依然成立。
在拉取请求上,action 先从基础分支恢复一份固定的 Claude 文件清单:.claude/、.mcp.json、.claude.json、.gitmodules、.ripgreprc、CLAUDE.md、CLAUDE.local.md 和 .husky/。拉取请求自带的那些副本留在 .claude-pr/ 下,仅供参考。其余一切仍停在头部提交上,所以运行 npm run format 的 hook 依然会经过这个拉取请求的 package.json。hook 命令要写成自包含的。
pull_request_target 和 workflow_run 带着基础仓库的密钥运行。这让检出成了最危险的一步,而下面是安全页面在你需要拉取请求文件时给出的写法。
不要在运行这个 action 之前,把不可信的 ref 检出到工作区根目录。
# If you need the PR's files locally, check out the base ref at the workspace
# root (this action expects a git repo there), then check out the head ref into
# a subdirectory and pass it via --add-dir.
- uses: actions/checkout@v6 # no ref input: base branch at workspace root
- uses: actions/checkout@v6
with:
# For workflow_run use: ${{ github.event.workflow_run.head_sha }}
ref: ${{ github.event.pull_request.head.sha }}
path: pr-head
- uses: anthropics/claude-code-action@v1
with:
claude_args: "--add-dir pr-head"不可信的输入,以及会放宽它的设置
- 隐藏的指令可以藏在 HTML 注释、不可见字符和隐藏属性里。action 会剥掉 HTML 注释、不可见字符、图片替代文字、隐藏属性和实体字符,文档也说可能出现新的绕过办法。在对外部人员的 issue 提到 Claude 之前,先读一遍原始文本。在公开仓库里,
include_comments_by_actor限定哪些人的评论能传给 Claude,某个用户同时在两个名单里时,排除优先。 - 在公开仓库里设
allowed_bots: '*',会让任何 GitHub App 都能带着它自己控制的提示词调用这个 action。请优先用具名名单。 allowed_non_write_users被标为有风险。它只配合github_token使用,这个令牌应该是secrets.GITHUB_TOKEN,绝不能是个人访问令牌,文档还建议把工具限制到最少。Claude 会尽力从子进程环境里清除密钥,CLAUDE_CODE_SCRIPT_CAPS则限制具名脚本的调用次数。show_full_output默认关闭,因为它会打印每一条工具结果,包括env和文件读取,而公开仓库里这些日志对所有人可见。Actions 调试模式一开,它也会自动打开。- action 里的 Bash 工具默认是关的。请在
--allowedTools里列出命令,比如Bash(npm:*)。GitHub 和文件操作这两个 MCP 服务器会自动启动,它们的工具仍然需要--allowedTools。 - 想让静态密钥不进仓库,就用工作负载身份联合。action 通过 Console 服务账号,把工作流的 OIDC 令牌换成 Claude API 的访问权,用到
anthropic_federation_rule_id和anthropic_organization_id。
费用,以及怎样让失控的任务停下来
每次运行都会在你的 runner 上消耗 GitHub Actions 分钟数,每次交互还会消耗 API token。用 OAuth 令牌时,token 从你的 Claude 订阅里扣,不走 API 计费。价格会变,所以文档只指向 GitHub 的计费页面和 Claude 的定价页面,没有印出任何数字。
claude_args 接受任何命令行参数,v1 版 action 就是这样带上 --max-turns 和系统提示词的追加内容。
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude_args: |
--max-turns 10
--append-system-prompt "Focus on security"- 写具体的
@claude请求,并用 issue 模板,让 Claude 需要的回合更少。 - 让 CLAUDE.md 保持简短,因为 Claude 每次运行都会读它。里面该放什么,见 CLAUDE.md 指南。
- 在
claude_args里设--max-turns,再设工作流级别的超时和 GitHub 的并发控制,限制并行的运行。
Boris Cherny 的评审习惯:提到 @claude,让它更新 CLAUDE.md
Boris Cherny 是 Claude Code 的作者,他在 X 上一串技巧的第 5 条里讲了一个评审习惯。
做代码评审时,他常在同事的拉取请求上提到 Claude,请它把某条内容加进 CLAUDE.md,作为这个拉取请求的一部分。他的团队用 GitHub Action 来做这件事,他说这是他们版本的 Compounding Engineering,这个说法来自 Dan Shipper。
他帖子里写的命令是 /install-github-action。Anthropic 文档里的命令是 /install-github-app,也就是本课用的那个。
想照着做,就保留上面那份提及工作流,并保留 contents: write 和 pull-requests: write,让 Claude 能把对 CLAUDE.md 的修改提交到同一个拉取请求里。评审时评论 @claude add a line to CLAUDE.md about,后面接你刚发现的问题。规则跟着教会它的那次改动一起落地。每一行都写短一点,因为 Claude 每次运行都会读这个文件。
我们用 Claude Code 的 GitHub action(/install-github-action)来做这件事。
X 官方嵌入卡片的截图,拍摄于 2026 年 11 月 5 日,时间为 UTC。点击截图可到 X 上打开原帖。
常见错误
- 在另一个工作流里提到
@claude。github-actions用户不能触发后续工作流,这是为了防止死循环,所以这条评论要用你自己的用户或应用的令牌来发。 - 传入
github_token: secrets.GITHUB_TOKEN,然后纳闷为什么 CI 跳过了 Claude 的提交。GitHub 不会为用这个令牌做出的提交运行工作流。去掉这个输入,让 action 以 Claude GitHub App 的身份认证,同时要知道allowed_non_write_users需要你自己的令牌。 - 评论里的触发短语不是一个完整的词。
/claude和@claude-bot什么也触发不了,除非你修改trigger_phrase。 - 工作流还停在
@beta。把它改成@v1,去掉mode输入,把direct_prompt改名为prompt,把max_turns和model挪进claude_args。 - 还没验证凭据就开始调试工作流。先在本机用
claude测一下 API 密钥或 OAuth 令牌。
动手试试
- 在一个练手仓库里运行
/install-github-app,合并拉取请求,然后评论@claude,问一个关于某个文件的问题。看那一条评论随着运行进展被更新。 - 先评论
/claude,再评论@claude-bot,确认都不会启动运行。改掉trigger_phrase后再试一次。 - 复制那个评审工作流,去掉
id-token: write,在运行日志里读一读报错,然后把它加回去。 - 给工作流加上
claude_args: "--max-turns 3",再给 Claude 一个需要更多回合的任务。比较有上限和没有上限时的运行。
下一课:用 Agent SDK 构建你自己的智能体
Anthropic 把 Claude Agent SDK 指给 GitHub Actions 之外的自动化,这个 action 本身也跑在它之上。最后一课用 Claude Agent SDK 构建智能体,把同样的循环当作一个库来用。
上面的评审工作流已经通过 plugins 和 plugin_marketplaces 两个输入安装了一个插件。插件里能放什么,见插件那篇文章。
自测一下
一个工作流步骤使用 anthropics/claude-code-action@v1,没有 prompt 输入。这个 action 会怎么做?
查看答案
B. 等待触发短语,默认是评论或新 issue 里的 @claude 没有 prompt 时 action 以交互模式运行,只有当有人用了触发短语才响应。
默认的 GitHub App 认证要求任务授予哪项权限?
查看答案
A. id-token: write 默认认证会获取 GitHub OIDC 令牌,所以任务必须授予 id-token: write,否则运行会出现 OIDC 错误。
Claude 推送了提交,但你的 CI 工作流没有在上面启动。最可能的原因是什么?
查看答案
C. 这一步把默认的 GITHUB_TOKEN 当作 github_token 传入,而 GitHub 不会为用它做出的提交运行工作流 GitHub 不会在用默认令牌做出的提交上触发工作流,所以去掉这个输入,让 action 以 Claude GitHub App 的身份认证。
pull_request_target 工作流必须把拉取请求的文件交给 Claude。安全页面建议怎么做?
查看答案
D. 把基础 ref 检出到根目录,把头部检出到子目录,再用 --add-dir 传入 这些事件带着基础仓库的密钥运行,所以在 action 运行之前,不可信的 ref 不能落到工作区根目录。
常见问题
能通过指派 issue 或打标签来启动运行吗?
能。在 on: 块的 issues 事件里加上 assigned 和 labeled,再在 action 这一步把 assignee_trigger 设为被指派者的用户名,或把 label_trigger 设为标签名。它们和 trigger_phrase 并列,后者默认是 @claude。
这个 action 需要 API 密钥吗?
需要一种凭据。用 Claude Console 的 ANTHROPIC_API_KEY,或者订阅套餐下用 claude setup-token 得到的 CLAUDE_CODE_OAUTH_TOKEN。要在整个组织里共用一个密钥,请用 API 密钥,因为 OAuth 令牌绑定的是运行那条命令的人。工作负载身份联合可以避免静态密钥。
为什么 @claude 没有响应?
检查应用是否已安装、工作流是否已启用、密钥是否存在、评论里是否有作为完整单词的 @claude,以及评论者有没有写权限。缺少 id-token: write 权限也会让运行失败。
Claude 能创建并合并拉取请求吗?
默认情况下它创建一个分支,并贴出预填好的拉取请求页面的链接,由人来创建拉取请求。它不会合并、变基或强制推送,也只推送到它自己的分支,或它被调用时所在的拉取请求分支。
在公开仓库上运行安全吗?
做好防范可以。评论的人需要有写权限,机器人默认被拦下,文档还要求把工作流的权限收到最小。剩下的风险是通过不可信文本发起的提示词注入,清理手段不能完全挡住它,文档提醒可能出现新的绕过办法。
一次运行要花多少钱?
每次运行会消耗 GitHub Actions 分钟数,用 API 密钥时还有 token,数量取决于提示词长度、任务和代码库大小。用 OAuth 令牌时则用你的订阅。用 --max-turns 限制回合,再设超时和并发上限。
它能配合 GitLab、Bedrock 或 Vertex 使用吗?
/install-github-app 只适用于 github.com 的仓库,GitLab 有自己的页面,叫 Claude Code GitLab CI/CD。要用 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry,把 use_bedrock、use_vertex 或 use_foundry 设为 "true",并通过 OIDC 认证。
资料来源
- Claude Code docs: Claude Code GitHub Actions https://code.claude.com/docs/en/github-actions
- claude-code-action docs: Security https://github.com/anthropics/claude-code-action/blob/main/docs/security.md
- claude-code-action docs: Usage https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
- claude-code-action docs: FAQ https://github.com/anthropics/claude-code-action/blob/main/docs/faq.md
- claude-code-action docs: Setup guide https://github.com/anthropics/claude-code-action/blob/main/docs/setup.md
- anthropics/claude-code-action on GitHub https://github.com/anthropics/claude-code-action
- claude-code-action release v1.0.268 on GitHub https://github.com/anthropics/claude-code-action/releases/tag/v1.0.268
- Boris Cherny on X: tag @claude on PRs to update CLAUDE.md https://x.com/bcherny/status/2007179842928947333

