|
| 1 | +# Waterflow 核心节点库 |
| 2 | + |
| 3 | +Waterflow 提供了 7 个核心节点,覆盖命令执行、流程控制、网络通信、文件操作、容器管理等常见场景。 |
| 4 | + |
| 5 | +## 快速参考 |
| 6 | + |
| 7 | +| 节点 | 版本 | 分类 | 简介 | 常用场景 | |
| 8 | +|------|------|------|------|----------| |
| 9 | +| [exec/shell](exec/shell.md) | v1 | 执行 | Shell 命令执行 | 系统命令、工具调用、脚本执行 | |
| 10 | +| [exec/script](exec/script.md) | v1 | 执行 | 脚本文件执行 | 复杂脚本、多语言支持、批处理 | |
| 11 | +| [flow/sleep](flow/sleep.md) | v1 | 流程 | 延迟等待 | 服务启动等待、API 限流、健康检查间隔 | |
| 12 | +| [http/request](http/request.md) | v1 | 网络 | HTTP 请求 | REST API 调用、Webhook 通知、数据同步 | |
| 13 | +| [file/transfer](file/transfer.md) | v1 | 文件 | 文件传输 (SFTP/SCP) | 配置分发、日志收集、备份传输 | |
| 14 | +| [docker/exec](docker/exec.md) | v1 | 容器 | Docker 命令执行 | 容器管理、镜像操作、容器监控 | |
| 15 | +| [docker/compose](docker/compose.md) | v1 | 容器 | Compose 栈管理 | 多容器部署、应用栈管理、环境管理 | |
| 16 | + |
| 17 | +## 按分类浏览 |
| 18 | + |
| 19 | +### 执行类 (exec) |
| 20 | + |
| 21 | +命令和脚本执行节点,用于在 Agent 服务器上执行系统命令和脚本。 |
| 22 | + |
| 23 | +- **[exec/shell](exec/shell.md)** - 执行 Shell 命令 |
| 24 | + - 用途: 运行系统命令、调用 CLI 工具、文件操作 |
| 25 | + - 典型场景: `ls`, `git`, `kubectl`, `aws` |
| 26 | + |
| 27 | +- **[exec/script](exec/script.md)** - 执行脚本文件 |
| 28 | + - 用途: 执行 Bash/Python/Node 等脚本 |
| 29 | + - 典型场景: 复杂逻辑、多行脚本、多语言支持 |
| 30 | + |
| 31 | +### 流程控制类 (flow) |
| 32 | + |
| 33 | +工作流流程控制节点,用于管理工作流执行流程。 |
| 34 | + |
| 35 | +- **[flow/sleep](flow/sleep.md)** - 延迟等待 |
| 36 | + - 用途: 在步骤间添加延迟 |
| 37 | + - 典型场景: 等待服务启动、API 限流、健康检查间隔 |
| 38 | + |
| 39 | +### 网络通信类 (http) |
| 40 | + |
| 41 | +HTTP/REST API 集成节点,用于与外部系统通信。 |
| 42 | + |
| 43 | +- **[http/request](http/request.md)** - 发送 HTTP 请求 |
| 44 | + - 用途: 调用 REST API、发送 Webhook |
| 45 | + - 典型场景: API 集成、数据同步、通知推送 |
| 46 | + |
| 47 | +### 文件操作类 (file) |
| 48 | + |
| 49 | +文件传输和操作节点,用于服务器间文件管理。 |
| 50 | + |
| 51 | +- **[file/transfer](file/transfer.md)** - SFTP/SCP 文件传输 |
| 52 | + - 用途: 服务器间文件上传/下载 |
| 53 | + - 典型场景: 配置分发、日志收集、部署资产 |
| 54 | + |
| 55 | +### 容器管理类 (docker) |
| 56 | + |
| 57 | +Docker 容器和编排节点,用于容器化应用管理。 |
| 58 | + |
| 59 | +- **[docker/exec](docker/exec.md)** - 执行 Docker CLI 命令 |
| 60 | + - 用途: 管理容器和镜像 |
| 61 | + - 典型场景: 容器启停、镜像拉取、日志查看 |
| 62 | + |
| 63 | +- **[docker/compose](docker/compose.md)** - 管理 Compose 栈 |
| 64 | + - 用途: 部署和管理多容器应用 |
| 65 | + - 典型场景: 应用栈部署、开发环境、蓝绿部署 |
| 66 | + |
| 67 | +## 如何使用节点 |
| 68 | + |
| 69 | +### 基本语法 |
| 70 | + |
| 71 | +工作流中使用节点的基本语法: |
| 72 | + |
| 73 | +```yaml |
| 74 | +steps: |
| 75 | + - name: Step name |
| 76 | + uses: category/name@version |
| 77 | + with: |
| 78 | + param1: value1 |
| 79 | + param2: value2 |
| 80 | +``` |
| 81 | +
|
| 82 | +**组成部分:** |
| 83 | +- `name`: 步骤名称(可选) |
| 84 | +- `uses`: 节点标识符 `category/name@version` |
| 85 | +- `with`: 节点参数(键值对) |
| 86 | + |
| 87 | +### 引用输出 |
| 88 | + |
| 89 | +使用 `id` 标识步骤,后续步骤可引用其输出: |
| 90 | + |
| 91 | +```yaml |
| 92 | +steps: |
| 93 | + - name: Get info |
| 94 | + uses: exec/shell@v1 |
| 95 | + with: |
| 96 | + command: whoami |
| 97 | + id: user_info |
| 98 | + |
| 99 | + - name: Use output |
| 100 | + uses: exec/shell@v1 |
| 101 | + with: |
| 102 | + command: echo "Current user is ${{ steps.user_info.outputs.stdout }}" |
| 103 | +``` |
| 104 | + |
| 105 | +**输出引用语法:** |
| 106 | +- `${{ steps.<step_id>.outputs.<output_name> }}` |
| 107 | +- 可用于任何参数值 |
| 108 | + |
| 109 | +### 条件执行 |
| 110 | + |
| 111 | +根据前一步骤的结果执行不同操作: |
| 112 | + |
| 113 | +```yaml |
| 114 | +steps: |
| 115 | + - name: Check service |
| 116 | + uses: http/request@v1 |
| 117 | + with: |
| 118 | + url: http://localhost:8080/health |
| 119 | + id: health_check |
| 120 | + continue-on-error: true |
| 121 | + |
| 122 | + - name: Service is healthy |
| 123 | + if: steps.health_check.outputs.status_code == 200 |
| 124 | + uses: exec/shell@v1 |
| 125 | + with: |
| 126 | + command: echo "Service is running" |
| 127 | + |
| 128 | + - name: Service is down |
| 129 | + if: steps.health_check.outputs.status_code != 200 |
| 130 | + uses: exec/shell@v1 |
| 131 | + with: |
| 132 | + command: echo "Service is not available" |
| 133 | +``` |
| 134 | + |
| 135 | +### 错误处理 |
| 136 | + |
| 137 | +#### 继续执行(忽略错误) |
| 138 | + |
| 139 | +```yaml |
| 140 | +steps: |
| 141 | + - name: Try to stop container |
| 142 | + uses: docker/exec@v1 |
| 143 | + with: |
| 144 | + command: stop |
| 145 | + args: ["my-container"] |
| 146 | + continue-on-error: true # 容器不存在也继续执行 |
| 147 | +``` |
| 148 | + |
| 149 | +#### 重试策略 |
| 150 | + |
| 151 | +```yaml |
| 152 | +steps: |
| 153 | + - name: Pull image with retry |
| 154 | + uses: docker/exec@v1 |
| 155 | + with: |
| 156 | + command: pull |
| 157 | + args: ["nginx:latest"] |
| 158 | + retry: |
| 159 | + max_attempts: 3 |
| 160 | + initial_interval: 5s |
| 161 | + backoff_coefficient: 2.0 |
| 162 | +``` |
| 163 | + |
| 164 | +**重试参数:** |
| 165 | +- `max_attempts`: 最大尝试次数 |
| 166 | +- `initial_interval`: 初始重试间隔 |
| 167 | +- `backoff_coefficient`: 退避系数(每次重试间隔乘以此系数) |
| 168 | + |
| 169 | +### 使用 Secrets |
| 170 | + |
| 171 | +敏感信息(密码、密钥、Token)使用 Secrets 管理: |
| 172 | + |
| 173 | +```yaml |
| 174 | +steps: |
| 175 | + - name: Upload with SSH |
| 176 | + uses: file/transfer@v1 |
| 177 | + with: |
| 178 | + mode: upload |
| 179 | + host: example.com |
| 180 | + user: deploy |
| 181 | + password: ${{ secrets.SSH_PASSWORD }} # 使用 Secret |
| 182 | + source_path: /local/app.tar.gz |
| 183 | + target_path: /remote/app.tar.gz |
| 184 | +``` |
| 185 | + |
| 186 | +**Secrets 引用语法:** |
| 187 | +- `${{ secrets.SECRET_NAME }}` |
| 188 | +- Secrets 在日志中自动脱敏 |
| 189 | + |
| 190 | +### 环境变量 |
| 191 | + |
| 192 | +在工作流级别或步骤级别定义环境变量: |
| 193 | + |
| 194 | +```yaml |
| 195 | +env: |
| 196 | + DEPLOY_ENV: production |
| 197 | + API_URL: https://api.example.com |
| 198 | +
|
| 199 | +steps: |
| 200 | + - name: Deploy with env |
| 201 | + uses: exec/shell@v1 |
| 202 | + with: |
| 203 | + command: ./deploy.sh |
| 204 | + env: |
| 205 | + VERSION: "1.2.3" # 步骤级别环境变量 |
| 206 | +``` |
| 207 | + |
| 208 | +## 节点参数通用说明 |
| 209 | + |
| 210 | +### 参数类型 |
| 211 | + |
| 212 | +| 类型 | 说明 | 示例 | |
| 213 | +|------|------|------| |
| 214 | +| string | 字符串 | `"hello"`, `"30s"` | |
| 215 | +| int | 整数 | `30`, `8080` | |
| 216 | +| bool | 布尔值 | `true`, `false` | |
| 217 | +| array | 数组 | `["-la", "/tmp"]` | |
| 218 | +| object | 键值对对象 | `{KEY: "value"}` | |
| 219 | + |
| 220 | +### 参数必需性 |
| 221 | + |
| 222 | +- ✅ **必需参数**: 必须提供,否则执行失败 |
| 223 | +- ❌ **可选参数**: 可省略,使用默认值 |
| 224 | + |
| 225 | +### 时间格式 |
| 226 | + |
| 227 | +多个节点支持时间参数(如 `timeout`, `duration`): |
| 228 | + |
| 229 | +| 格式 | 说明 | 示例 | |
| 230 | +|------|------|------| |
| 231 | +| `30s` | 秒 | 30 秒 | |
| 232 | +| `5m` | 分钟 | 5 分钟 | |
| 233 | +| `2h` | 小时 | 2 小时 | |
| 234 | +| `1h30m` | 组合 | 1 小时 30 分钟 | |
| 235 | + |
| 236 | +## 版本兼容性 |
| 237 | + |
| 238 | +所有核心节点当前版本为 **v1**,保证向后兼容。 |
| 239 | + |
| 240 | +**版本策略:** |
| 241 | +- **v1**: 当前稳定版本,新增参数必须为可选参数 |
| 242 | +- **v2**: 计划中(可能引入不兼容变更) |
| 243 | + |
| 244 | +**升级原则:** |
| 245 | +- 同一主版本内保证向后兼容 |
| 246 | +- 新增参数必须是可选的且有合理默认值 |
| 247 | +- 不会删除现有参数或改变核心行为 |
| 248 | + |
| 249 | +## 常见问题 (FAQ) |
| 250 | + |
| 251 | +### 1. 如何选择合适的节点? |
| 252 | + |
| 253 | +根据任务类型选择: |
| 254 | + |
| 255 | +- **执行系统命令**: 使用 `exec/shell` |
| 256 | +- **执行脚本文件**: 使用 `exec/script` |
| 257 | +- **等待/延迟**: 使用 `flow/sleep` |
| 258 | +- **调用 HTTP API**: 使用 `http/request` |
| 259 | +- **传输文件**: 使用 `file/transfer` |
| 260 | +- **管理 Docker 容器**: 使用 `docker/exec` |
| 261 | +- **部署 Compose 栈**: 使用 `docker/compose` |
| 262 | + |
| 263 | +### 2. 节点在哪里执行? |
| 264 | + |
| 265 | +节点在 **Agent 服务器**上执行。Agent 是部署在目标服务器上的执行器,接收 Waterflow Server 分发的任务。 |
| 266 | + |
| 267 | +### 3. 如何调试节点执行失败? |
| 268 | + |
| 269 | +1. **查看日志**: 节点输出的 `stdout` 和 `stderr` 包含详细错误信息 |
| 270 | +2. **检查退出码**: `exit_code` 显示命令执行结果 |
| 271 | +3. **验证参数**: 确认所有必需参数已提供且格式正确 |
| 272 | +4. **检查环境**: 确认 Agent 服务器满足节点前置条件(如 Docker 已安装) |
| 273 | + |
| 274 | +### 4. 节点执行超时怎么办? |
| 275 | + |
| 276 | +1. **增加超时时间**: 根据实际情况调整 `timeout` 参数 |
| 277 | +2. **优化执行效率**: 减少不必要的操作 |
| 278 | +3. **使用异步模式**: 某些节点支持后台执行(如 `docker/compose` 的 `detach` 参数) |
| 279 | + |
| 280 | +### 5. 如何处理敏感信息? |
| 281 | + |
| 282 | +- **使用 Secrets**: 密码、密钥等敏感信息存储在 Secrets 中 |
| 283 | +- **避免硬编码**: 不要在 YAML 中直接写入密码 |
| 284 | +- **日志脱敏**: Secrets 值在日志中自动隐藏 |
| 285 | + |
| 286 | +### 6. 节点支持并发执行吗? |
| 287 | + |
| 288 | +支持。工作流可以同时执行多个步骤,每个节点实例独立执行,互不干扰。 |
| 289 | + |
| 290 | +### 7. 如何贡献自定义节点? |
| 291 | + |
| 292 | +参见 [自定义节点开发指南](../guides/node-development.md)。 |
| 293 | + |
| 294 | +## 参考文档 |
| 295 | + |
| 296 | +- [工作流语法参考](../yaml-dsl-syntax-reference.md) |
| 297 | +- [自定义节点开发指南](../guides/node-development.md) |
| 298 | +- [Architecture: 节点系统](../adr/0003-plugin-based-node-system.md) |
| 299 | +- [Story 3.1: 节点接口设计](../sprint-artifacts/3-1-node-interface-design.md) |
| 300 | + |
| 301 | +--- |
| 302 | + |
| 303 | +**文档版本**: v1 |
| 304 | +**最后更新**: 2025-12-31 |
| 305 | +**状态**: 稳定 |
0 commit comments