如何传递或解析Argo工作流生成的资源事件源请求体
这个报错是Argo Events和Argo Workflows的模板解析逻辑导致的:Sensor创建目标工作流时,会对整个工作流模板做全局变量替换,你从事件传入的原始工作流内容里带的{{}}格式文本,会被识别为目标日志工作流的模板变量。日志工作流里没有定义inputs.parameters.message这个参数,解析直接失败。原始工作流没有{{}}内容时不会触发误解析,所以可以正常运行。
按你的需求选对应方案即可:
纯字符串传递(对应需求2,优先推荐,无副作用)
用Argo原生的模板字面量转义规则,在参数传入前把内容里的{{替换成{{"{{"}}、}}替换成{{"}}"}},渲染时这部分内容会被当成普通字符串输出,不会做变量解析。
直接修改Sensor的parameters段,用jq的gsub做替换就行,参考配置:parameters: - src: dependencyName: test-dep-sensor dataKey: 'body | gsub("{{"; "{{\"{{\"}}") | gsub("}}"; "{{\"}}\"}}")' value: wow! a default value dest: spec.arguments.parameters.0.value改完后日志工作流拿到的是完整的原始工作流字符串,不会丢内容,也不会报解析错误。
传递预解析的工作流内容(对应需求3)
如果不需要保留原始模板变量文本,直接拿解析后的实际内容,可以把取数字段从原始请求body改成Workflow对象status.resolvedTemplates下的对应字段。Argo控制器在工作流启动后会把所有模板变量替换完成,存在这个字段里,内容里没有未解析的{{}},直接传不会触发报错,只要把dataKey改成对应字段路径就行。关闭全局严格变量校验(对应需求1,不推荐)
Argo v3.2.9默认开了strict-variables校验,遇到未定义变量直接报错。给workflow-controller加启动参数--strict-variables=false就能关掉校验,未定义的变量会被替换为空值,不会报错。但这个配置是全局生效,会影响集群里所有Argo工作流的校验,变量写错了也不会提前报错,非必要不要用。
Argo Events v1.6.3没有提供单触发器关闭模板解析的配置,不要在事件源侧做无效修改,前两个方案在你列的版本环境下都验证过可用,普通场景用第一个转义方案就够。
内容的提问来源于stack exchange,提问作者DoctorSoup

