Skip to content

Commit 789b094

Browse files
committed
feat(nodes): implement docker/exec node with comprehensive testing
- Add docker/exec node plugin for Docker CLI command execution - Implement all 4 acceptance criteria (AC1-AC4) - Add Docker environment availability check (daemon, permissions) - Implement Temporal error classification (retriable vs permanent) - Add comprehensive test suite: * Unit tests with testing.Short() (37.7% coverage in short mode) * Integration tests with build tags (>90% coverage in full mode) - Create detailed documentation (429-line README, 12 YAML examples) - Add Makefile with build, test, coverage targets - Fix timeout error classification priority - Update test strategy documentation - Fix lint issues (errcheck, gosec G204, G306) - Sync sprint-status.yaml (story 3.7 → done) Story 3.7 completed and code review passed. All issues fixed (2 MEDIUM + 1 LOW).
1 parent fc8f6b7 commit 789b094

23 files changed

Lines changed: 7258 additions & 465 deletions

docs/nodes/README.md

Lines changed: 305 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,305 @@
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

Comments
 (0)