"曾经有一份完整的CI/CD流水线摆在我面前,我没有珍惜,等到Skill上线崩溃才后悔莫及。" —— 来自一位忘了跑测试的Agent开发者
把你的Skill从「在本机跑得好好的」变成「在哪跑都不会炸」的完整流水线方案
想象一下这个场景:凌晨两点,你刚写了一个超酷的 summarize-slack-thread Skill,得意地往 ~/.openclaw/skills/ 一丢,倒头就睡。第二天老板说「你那个Skill把公司所有Slack消息都转成了猪叫emoji」—— 你才发现忘了跑 openclaw validate。
「你以为Skill是天上掉下来的馅饼啊?不跑CI就往线上怼,跟吃火锅不蘸调料有什么区别?—— 可以吃,但人生会失去很多意义。」
CI/CD 不是大厂的专利。个人开发者更需要它,因为你的睡眠质量取决于你的流水线质量。一个正经的 CI/CD 流水线能帮你:
每次提交自动跑语法检查、依赖检测、权限审计,不让坏Skill过门
在隔离环境里测试Skill,不会把你的Agent搞崩
合并到main自动发布到ClawHub或私有仓库,像发火箭一样丝滑
哪个版本炸了一查就知道,不用在文件夹里翻 skill_final_v3_真的最终版.yaml
这条流水线的每个环节都对应一个 openclaw CLI 命令。你不需要自己写脚本——把这些命令串起来就行。
| 阶段 | 命令/工具 | 干了什么 |
|---|---|---|
| 格式检查 | openclaw skill lint | 检查YAML语法、字段完整性、命名规范 |
| 单元测试 | openclaw skill test | 运行Skill内置测试用例 |
| 安全扫描 | openclaw security scan | 检查依赖漏洞、权限越界、敏感信息泄露 |
| 冲突检测 | openclaw skill validate --conflicts | 检测与已安装Skills的冲突 |
| 构建打包 | openclaw skill build | 生成可分发的 .skill 包 |
| 发布部署 | openclaw skill publish | 推送到ClawHub或NPM/MCP Registry |
下面是一个完整的 .github/workflows/skill-ci.yml 配置。别怕长——复制粘贴改一下就能用。
# .github/workflows/skill-ci.yml
name: OpenClaw Skill CI/CD
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup OpenClaw CLI
uses: openclaw/setup-cli@v1
with:
version: 'latest'
- name: Lint Skill
run: openclaw skill lint ./skills/
- name: Run Tests
run: openclaw skill test ./skills/ --coverage
- name: Security Scan
run: openclaw security scan ./skills/
build-and-publish:
needs: validate
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Skill Package
run: openclaw skill build ./skills/ --output ./dist/
- name: Publish to ClawHub
run: openclaw skill publish ./dist/*.skill
env:
CLAWHUB_TOKEN: ${{ secrets.CLAWHUB_TOKEN }}
Token 管理:永远不要把 CLAWHUB_TOKEN 写死在代码里。用 GitHub Secrets 存,像藏私房钱一样藏好。
「人最大的烦恼,就是记不住自己上次改了什么。所以有了Git commit。人最大的悲剧,就是把commit直接推到了生产环境。所以有了CI/CD。」
—— 你永远不知道,那个git push --force的背后,是改了一个标点符号,还是删掉了整个validate函数。
Skill 测试不是玄学,是科学。科学的尽头是玄学,但中间那段归你管。
| 层级 | 覆盖范围 | 工具 | 速度 |
|---|---|---|---|
| 🔹 L1 单元测试 | 单个tool/action逻辑 | openclaw skill test --unit | ⚡ 毫秒级 |
| 🔹 L2 集成测试 | 多tool协作流程 | openclaw skill test --integration | ⏱️ 秒级 |
| 🔹 L3 端到端测试 | Agent+Skill全链路 | openclaw agent test | 🐢 分钟级 |
在Skill目录下创建 tests/ 文件夹,放一个 test_*.yaml:
# tests/test_summarize.yaml
name: "Slack Summarizer 测试套件"
description: "验证总结功能在不同场景下的表现"
cases:
- name: "短消息总结"
input:
messages: ["今天上线了吗?", "还没有", "那就继续写吧"]
expected:
topic: "上线状态确认"
sentiment: "neutral"
action_items: ["继续开发"]
- name: "空消息处理"
input:
messages: []
expected:
error: "EMPTY_INPUT"
fallback: "没有消息可总结"
「写测试就像买保险——你希望永远用不上,但真要用的时候,你会感激当年那个有远见的自己。顺便说一句,没写测试的Skill,就像没放辣椒的重庆火锅,能吃饱但没灵魂。」
测试覆盖策略:至少覆盖正常路径 + 边界情况 + 错误路径。如果你的Skill有一个「把大象放进冰箱」的功能,记得测试「冰箱放不下大象」的情况。
部署策略决定了你的Skill上线时是「烟花」还是「哑炮」。
| 策略 | 适用场景 | 风险 | 配置 |
|---|---|---|---|
| 🟢 直接部署 | 个人项目、实验性Skill | 低 | on: push to main |
| 🟡 金丝雀部署 | 团队协作、核心Skill | 中 | 先发布到10% Agent,验证再全量 |
| 🔴 蓝绿部署 | 生产环境、企业级 | 低 | 两套环境切换,秒级回滚 |
遵循 SemVer 规范:MAJOR.MINOR.PATCH
# 自动版本号注入(GitHub Actions)
- name: Auto Version
run: |
VERSION=$(git describe --tags --abbrev=0)
echo "SKILL_VERSION=$VERSION" >> $GITHUB_ENV
- name: Build with Version
run: |
openclaw skill build \
--version ${{ env.SKILL_VERSION }} \
--output ./dist/
「版本号是一个Skill的身份证。你把版本从1.0.0跳到2.0.0,以为是个大版本——实际上只是换了个README里的emoji。但用户不这么想,他们觉得你的Skill脱胎换骨了。有时候,人生也是这样。」
| 翻车现场 | 原因 | 解决方法 |
|---|---|---|
| CI跑了一小时还没完 | 测试里塞了GPT-4调用 | Mock掉LLM,别在CI里烧API钱 |
| 本地能跑,CI炸了 | 依赖路径写死(/Users/你的名字/) | 用相对路径,环境变量代替硬编码 |
| 发布后Agent说「找不到这个Skill」 | ClawHub Token过期 | 设置Token自动续期,用GitHub Secrets存 |
| code review请求发了237个commits | 每次保存都自动push | 用 pre-commit 钩子,不要用 watcher |
「我看过最离谱的CI失败:一个开发者把 npm test 写成了 npm tset,然后盯着日志看了三小时,问为什么测试跑不起来。兄弟,你连命令都打不对,AI都救不了你。」
| 指南 | 适合谁 |
|---|---|
| 📖 Agent Skills 开发完整指南 | 想从头学Skill开发的你 |
| 🎯 Skill Workshop 精通指南 | 想用Workshop管理Skill的你 |
| 🏪 ClawHub 技能市场完全攻略 | 想发布/赚钱的你 |
| 🛠️ Skills 开发教程 | 新手入门看这个 |
| 📊 Agent 质量评估框架 | 想知道Skill好不好的你 |
这些文章可能对你有帮助