与串行变换(Transformation)完全指南)
云原生容器编排工作流自动化任务调度后端【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址https://gitcode.com/gh_mirrors/ar/argo-workflows点击查看免费下载适用版本Argo Workflows v3.1 及以上data模板是 Argo WorkflowsWorkflow Engine for Kubernetes在 v3.1 中引入的一等公民模板类型用于在工作流内部完成数据获取 数据变换这两类高频操作它从一个数据源目前为artifactPaths即对象存储中的工件路径列表拉取数据再将数据串行地传递给一个或多个expression变换表达式处理最终结果被序列化为 JSON 写入模板的outputs.result可被后续步骤直接引用。阅读本文后你将掌握data模板的完整 Spec 结构、真实可运行的 YAML 写法、底层执行原理源码级以及它与bash管道式数据处理如find | grep | sed之间的映射关系。为什么需要 data 模板与 bash 管道的类比在真实工作流中用户经常需要先搜集一批数据例如对象存储桶里的文件清单再对这批数据做过滤、映射等变换。这类操作在bash中通常写成管道find -r . | grep .pdf | sed s/foo/foo.ready/这条命令由两个核心部分组成数据源sourcefind -r .负责产出原始数据一系列变换transformations| grep .pdf | sed s/foo/foo.ready/按顺序串行作用于上游输出。例如可以用它生成一份待处理文件的候选清单并按需过滤、改写清单内容。Argo Workflows 将这一模式抽象为data模板用声明式 YAML 表达同样的逻辑。官方文档给出的等价写法如下- name: generate-artifacts data: source: # 定义数据源仅允许一个 source artifactPaths: # 预定义源生成指定工件仓库中的全部工件路径清单 s3: # 从 S3 桶中获取 bucket: test endpoint: minio:9000 insecure: true accessKeySecret: name: my-minio-cred key: accesskey secretKeySecret: name: my-minio-cred key: secretkey transformation: # 数据源输出随后被交给这里的变换逐个处理 - expression: filter(data, {# endsWith \.pdf\}) - expression: map(data, {# \.ready\})可以看到filter对应grep的过滤语义map对应sed的改写语义而artifactPaths对应find的枚举语义。相比 shell 脚本data模板的优势在于它完全声明式、可版本化、可被 Argo 的校验与 lint 工具检查且与工作流其余部分参数、工件、步骤编排无缝集成。data 模板 Spec 详解data模板的 Spec 定义在源码 pkg/apis/workflow/v1alpha1/data_types.go 中核心类型如下type Data struct { Source DataSource json:source // 数据源必填 Transformation Transformation json:transformation // 变换列表 } type Transformation []TransformationStep // 有序的变换步骤序列 type TransformationStep struct { Expression string json:expression // 一个 expr 表达式 } type DataSource struct { ArtifactPaths *ArtifactPaths json:artifactPaths,omitempty } type ArtifactPaths struct { Artifact json:,inline // 内嵌标准 Artifact 字段s3/git/http/oss 等工件定位信息 }source数据源必填一个data模板必须包含source。目前可用的数据源只有一种artifactPaths从指定的工件仓库artifact repository生成工件路径artifact paths列表。它内嵌了标准的Artifact结构因此可以使用 S3、GCS、OSS、HTTP、Git、Raw 等任何 Argo 支持的工件类型来定位目录级别的数据由工件驱动artifact driver递归枚举对象。在源码 workflow/data/data.go 的processSource中若source.ArtifactPaths nil会直接返回错误no valid source is used for data template从实现上强制了 source 的必填语义。transformation变换列表可选data模板可以包含**任意数量含零个的变换它们按书写顺序串行serially**执行上一个变换的输出作为下一个变换的输入管道式传递。目前可用的变换只有一种expression一个 expr 表达式表达式语言与 Argo 变量系统{{...}}使用的是同一个github.com/expr-lang/expr引擎当前仓库go.mod中锁定版本为expr v1.17.8。在表达式内当前数据通过名为data的变量暴露见上文示例。官方文档同时坦率地指出expression变换目前功能有限作者团队有意以最小可用bare-bones状态发布该特性希望借助社区反馈持续扩充参见文档顶部的 enhancement proposal 入口。端到端实战示例从 S3 列出日志并按需处理仓库中的官方示例 examples/data-transformations.yaml 给出了一个完整的列桶 过滤 逐文件处理工作流可直接复制运行需具备可访问的 S3/MinIO 环境# See doc docs/data-sourcing-and-transformation.md apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: labels: workflows.argoproj.io/no-test: environment generateName:>func ProcessData(ctx context.Context, data *wfv1.Data, processor wfv1.DataSourceProcessor) (any, error) { sourcedData, err : processSource(ctx, data.Source, processor) // 1. 处理数据源 ... transformedData, err : processTransformation(sourcedData, data.Transformation) // 2. 串行变换 ... return transformedData, nil }processSource按switch分派到具体的源处理器目前仅有ArtifactPaths分支其余情况返回no valid source is used for data template。processTransformation遍历Transformation切片对每个step.Expression ! 的步骤调用processExpression前一步的输出直接作为下一步的输入data变量随之更新实现管道式串行。表达式为空串的步骤会被跳过当transformation为 nil 或空切片时原样返回数据零变换合法。表达式求值processExpressionfunc processExpression(expression string, data any) (any, error) { env : map[string]any{data: data} program, err : expr.Compile(expression, expr.Env(env)) ... return expr.Run(program, env) }它把当前数据放入表达式环境{data: data}用expr-lang/expr编译并执行——这正是文档中filter(data, ...)/map(data, ...)里data变量的来源。你可以借助 expr 内置的高阶函数filter、map等谓词通过{# ...}引用单个元素实现过滤与映射。工件路径枚举executorDataSourceProcessor数据源的实际落地实现在 workflow/executor/executor_data_source_processor.gofunc (ep *executorDataSourceProcessor) ProcessArtifactPaths(ctx context.Context, artifacts *wfv1.ArtifactPaths) (any, error) { driverArt, err : ep.we.newDriverArt(artifacts.Artifact) ... artDriver, err : ep.we.InitDriver(ctx, driverArt) ... files, err artDriver.ListObjects(ctx, artifacts.Artifact) // 列出全部对象路径 ... return files, nil }它把artifactPaths当作普通工件处理先按工件类型S3/GCS/OSS/HTTP/Git…初始化对应的工件驱动driver再调用ListObjects递归枚举对象返回字符串切片[]string。结果输出executor 侧的 Data 执行data模板由工作流执行器workflow executor在 Pod 内执行入口在 workflow/executor/data.gofunc (we *WorkflowExecutor) Data(ctx context.Context) error { transformedData, err : we.processData(ctx) // 调用 data.ProcessData ... out, err : json.Marshal(transformedData) // 序列化为 JSON ... we.Template.Outputs.Result new(string(out)) // 写入 outputs.result err we.ReportOutputs(ctx, nil) // 上报输出 ... }关键点整个处理过程被包裹在process_data_template追踪 Span见 util/telemetry/traces_list.go中可通过 tracing 观测参考 docs/tracing.md变换结果会以JSON 字符串形式写入模板的outputs.result因此下游步骤如示例中的withParam: {{steps.list-log-files.outputs.result}}才能拿到这份清单。与工作流 Pod 的集成在工作流控制器侧workflow/controller/workflowpod.go 中通过tmpl.Data.Source.GetArtifactIfNeeded()实现见 pkg/apis/workflow/v1alpha1/data_types.go判断data模板是否需要为数据源工件注入卷挂载volume mount或工件侧车sidecar说明数据源工件与普通输入工件在 Pod 装配层面是统一的。测试用例行为验证workflow/data/data_test.go 中的单元测试对上述语义给出了直接验证数据源TestProcessSource验证ArtifactPaths源会产出如[]any{foo.py, bar.pdf, goo/foo.py, moo/bar.pdf}的路径清单源处理失败或 source 缺失空DataSource{}都会返回错误。过滤filter(data, {# endsWith .py})得到[foo.py, goo/foo.py]filter(data, {# contains /})得到带子目录的条目filter(data, {not(# contains /)})得到根级条目。映射map(data, {# .processed})为每个元素追加后缀。串行组合filter后再接filter、或filter后接map结果与管道语义一致例如先过滤出根级文件再统一追加.processed。容错边界transformation为 nil、空切片或包含空表达式步骤时均不报错而表达式语法错误如map(data, {# .processed}括号不闭合会返回错误。这些用例可作为编写自定义变换表达式时的语法参考手册例如endsWith、contains、not(...)谓词以及#元素引用符的用法。数据模板的注意事项与设计取向版本门槛data模板自v3.1起可用官方示例通过workflows.argoproj.io/version: 3.1.0注解声明兼容性并通过workflows.argoproj.io/no-test: environment标记该示例依赖外部环境、不纳入常规 e2e 自动测试。有意的最小可用设计官方文档明确表示该特性以 bare-bones 形态发布当前只有artifactPaths一种数据源与expression一种变换且expression的语义仅限定为对data变量的表达式运算。社区反馈与 enhancement proposal 是功能演进的主要驱动力。source 单数语义每个data模板仅允许一个source多数据源、多变换类型如内置去重、排序、JSON 解析等目前不在开箱功能内。调试思路data模板无容器逻辑在 executor 中完成可通过查看outputs.result与 tracing 中的process_data_templatespan 定位问题表达式错误会以error processing data step %d下标从 0 计形式暴露便于定位第几步出错。延伸阅读官方文档原文docs/data-sourcing-and-transformation.md可运行示例examples/data-transformations.yaml类型定义pkg/apis/workflow/v1alpha1/data_types.go处理管线实现workflow/data/data.go数据源落地实现workflow/executor/executor_data_source_processor.go执行器入口workflow/executor/data.go行为验证workflow/data/data_test.go表达式语法docs/variables.md赞分享云原生容器编排工作流自动化任务调度后端【免费下载链接】argo-workflowsWorkflow Engine for Kubernetes项目地址https://gitcode.com/gh_mirrors/ar/argo-workflows点击查看免费下载相关推荐IPython 自定义输入变换Input Transformation完全指南字符串变换与 AST 变换实战IPython 自定义输入变换Input Transformation完全指南字符串变换与 AST 变换实战 IPython 之所以能支持 %magic开发工具CLIAlertmanager 通知模板完全参考Data 数据结构与模板函数实战指南Alertmanager 通知模板完全参考Data 数据结构与模板函数实战指南 Prometheus 负责产生并推送告警Alertmanager 收到后按标后端可观测性告警消息路由Vuesax v4响应式布局实战轻松适配手机、平板和桌面设备Vuesax v4响应式布局实战轻松适配手机、平板和桌面设备 在当今多设备时代构建能够完美适配手机、平板和桌面设备的Web应用已成为前端开发的基本要求。Vu开发工具CLI配置管理上一篇HS2-HF Patch 从零上手全流程一次安装搞定 Honey Select 2 汉化去码与插件部署下一篇过期回放打不开这款免费英雄联盟回放播放器 ROFL-Player 帮你救回来创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考