5分钟上手Windmill:多语言脚本(Python/TS/Go/Bash)零代码构建自动化工作流
Windmill是一个开源开发者平台,能够将脚本转换为工作流和用户界面。作为最快的工作流引擎(比Airflow快5倍),它是Airplane和Retool的开源替代品,支持Python、TypeScript、Go、Bash等多种脚本语言,帮助团队快速构建内部工具和自动化流程。
为什么选择Windmill?
传统的工作流工具往往存在学习曲线陡峭、执行速度慢或扩展性差等问题。Windmill通过创新的架构设计和多语言支持,解决了这些痛点:
- 极速性能:比Airflow快5倍的工作流引擎,单任务启动延迟低至50ms
- 多语言支持:原生支持Python、TypeScript、Go、Bash等多种编程语言
- 自动生成UI:脚本参数自动转换为交互式界面,无需前端开发
- 灵活部署:支持Docker Compose、Kubernetes等多种部署方式
- 安全沙箱:采用Google nsjail技术隔离执行环境,确保脚本安全运行
快速开始:5分钟部署Windmill
Docker Compose一键部署
Windmill提供了简单的部署方式,只需三条命令即可在本地启动完整环境:
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/docker-compose.yml -o docker-compose.yml
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/Caddyfile -o Caddyfile
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/.env -o .env
docker compose up -d
访问http://localhost,使用默认账号admin@windmill.dev/changeme登录,即可开始使用。
多语言脚本实战指南
Python脚本:数据处理自动化
Windmill对Python提供了完善支持,包括类型提示解析、依赖管理和结果可视化。以下是一个处理CSV数据的示例:
import pandas as pd
from wmill import get_resource
def main(csv_url: str):
# 从URL加载CSV数据
df = pd.read_csv(csv_url)
# 数据处理:计算平均值
avg_value = df['value'].mean()
# 获取数据库资源(在Windmill UI中预先配置)
db = get_resource("postgres/main")
# 写入结果到数据库
db.execute("INSERT INTO metrics (date, value) VALUES (NOW(), %s)", [avg_value])
return {"average": avg_value, "row_count": len(df)}
将此脚本上传到Windmill后,系统会自动解析参数并生成如下UI界面:
TypeScript脚本:API集成与数据转换
TypeScript脚本支持通过npm导入任意依赖,并与Windmill的资源系统无缝集成:
import * as wmill from "windmill-client";
import axios from "axios@1.6.0";
// 定义资源类型
type SlackWebhook = {
url: string;
};
export async function main(
slack_webhook: SlackWebhook,
message: string,
priority: "low" | "medium" | "high" = "medium"
) {
// 获取环境变量
const user = process.env["WM_EMAIL"];
// 发送Slack消息
await axios.post(slack_webhook.url, {
text: `[${priority.toUpperCase()}] ${user}: ${message}`
});
// 存储执行状态
await wmill.setState({ last_sent: new Date().toISOString() });
return { success: true, timestamp: Date.now() };
}
TypeScript脚本在Windmill中使用Deno和Bun运行时,确保了高效的执行性能和广泛的库支持。
Go脚本:高性能后端任务
Go脚本适合需要高性能处理的场景,Windmill会自动处理依赖管理和参数解析:
package main
import (
"context"
"fmt"
"net/http"
"time"
"github.com/windmill-labs/windmill-go-client/v2"
)
type Args struct {
Url string `json:"url"`
TimeoutMs int `json:"timeout_ms"`
Method string `json:"method"`
}
func main(ctx context.Context, args Args) (map[string]interface{}, error) {
// 设置超时
timeout := time.Duration(args.TimeoutMs) * time.Millisecond
client := http.Client{Timeout: timeout}
// 发送HTTP请求
req, err := http.NewRequest(args.Method, args.Url, nil)
if err != nil {
return nil, err
}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
// 返回结果
return map[string]interface{}{
"status": resp.StatusCode,
"headers": resp.Header,
}, nil
}
Go脚本在Windmill中以原生二进制形式执行,特别适合CPU密集型任务和系统级操作。
Bash脚本:系统自动化与DevOps任务
Bash脚本适合简单的系统自动化任务,Windmill提供了完整的环境隔离和资源访问控制:
#!/bin/bash
# 接收参数
BACKUP_DIR=$1
RETENTION_DAYS=$2
# 创建备份目录
mkdir -p "$BACKUP_DIR/$(date +%Y%m%d)"
# 执行数据库备份
pg_dump -h $DB_HOST -U $DB_USER $DB_NAME > "$BACKUP_DIR/$(date +%Y%m%d)/db.sql"
# 压缩备份文件
gzip "$BACKUP_DIR/$(date +%Y%m%d)/db.sql"
# 删除旧备份
find "$BACKUP_DIR" -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;
# 返回备份信息
echo "{\"backup_path\": \"$BACKUP_DIR/$(date +%Y%m%d)\", \"files\": $(ls -1q "$BACKUP_DIR/$(date +%Y%m%d)" | wc -l)}"
Bash脚本在Windmill中运行于受限环境,通过环境变量安全地获取敏感信息,避免了硬编码凭证的安全风险。
构建多语言工作流
Windmill的真正强大之处在于能够将不同语言的脚本组合成复杂工作流。以下是一个包含Python数据处理、TypeScript通知和Bash系统操作的完整工作流:
工作流定义采用JSON格式,可以通过UI编辑器或代码方式创建:
{
"nodes": [
{
"id": "fetch_data",
"type": "script",
"path": "python/fetch_and_process",
"args": {
"source_url": "https://api.example.com/data"
}
},
{
"id": "send_notification",
"type": "script",
"path": "ts/slack_notify",
"args": {
"message": "Data processed: {{nodes.fetch_data.output.row_count}} rows",
"priority": "high"
},
"dependencies": ["fetch_data"]
},
{
"id": "backup_files",
"type": "script",
"path": "bash/backup",
"args": {
"backup_dir": "/data/backups",
"retention_days": 7
},
"dependencies": ["send_notification"]
}
]
}
部署与扩展
Windmill提供了多种部署选项,满足不同规模的需求:
Docker Compose部署
对于小型团队或个人使用,Docker Compose部署最简单:
# docker-compose.yml 示例片段
version: '3'
services:
windmill:
image: ghcr.io/windmill-labs/windmill
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://user:password@db:5432/windmill
depends_on:
- db
db:
image: postgres:14
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=windmill
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Kubernetes部署
企业级部署可使用官方Helm图表:
helm repo add windmill https://windmill-labs.github.io/windmill-helm-charts/
helm install windmill windmill/windmill --namespace windmill --create-namespace
Windmill支持自动扩展工作节点,可根据任务负载动态调整资源使用:
最佳实践与资源
脚本开发规范
- 参数设计:使用清晰的参数名称和类型注解,便于自动生成UI
- 错误处理:适当的错误处理和日志记录,便于调试
- 资源使用:通过Windmill资源系统管理外部服务连接,避免硬编码凭证
- 幂等性设计:确保脚本可以安全重试,适合自动化调度
学习资源
- 官方文档:README.md
- 示例脚本库:examples/
- API客户端:python-client/、typescript-client/
- 开发指南:frontend/README_DEV.md
总结
Windmill通过创新的多语言支持和自动化UI生成,极大降低了构建内部工具和自动化工作流的门槛。无论是简单的脚本任务还是复杂的多步骤工作流,Windmill都能提供高效、安全、可扩展的解决方案。
立即通过以下命令开始使用Windmill:
git clone https://gitcode.com/GitHub_Trending/wi/windmill
cd windmill
docker compose up -d
访问http://localhost开始您的自动化之旅!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考








