无法将jsonpath函数用于Argo工作流中的输出参数



我有一个工作流,在该工作流中,我使用jsonpath函数作为输出参数,从json字符串中提取特定值,但它失败了,出现了以下错误Error (exit code 255)

这是我的工作流程

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: wf-dev-
spec:
entrypoint: main
templates:
- name: main
dag:
tasks:
- name: dev-create
templateRef:
name: dev-create-wft
template: main
arguments:
parameters:
- name: param1
value: "val1"
- name: dev-outputs
depends: dev-create.Succeeded
templateRef:
name: dev-outputs-wft
template: main
arguments:
parameters:
- name: devoutputs
value: "{{=jsonpath(tasks.dev-create.outputs.parameters.devoutputs, '$.alias.value')}}"

在上面的工作流任务dev-create调用另一个工作流模板dev-create-wft,后者返回另一个workflowTemplate 的输出

这是我的工作流模板

apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: dev-create-wft
spec:
entrypoint: main
templates:
- name: main
outputs:
parameters:
- name: devoutputs
valueFrom:
expression: "tasks['dev1'].outputs.parameters.devoutputs"
inputs:
parameters:
- name: param1
dag:
tasks:
- name: dev1
templateRef:
name: fnl-dev
template: main
arguments:
parameters:
- name: param1
value: "{{inputs.parameters.param1}}"

返回的json输出看起来像这个

{
"alias": {
"value": "testing:dev1infra",
"type": "string",
"sensitive": false
},
"match": {
"value": "dev1infra-testing",
"type": "string",
"sensitive": false
}
}

工作流中是否支持jsonpath功能?我问的原因是,当我在另一个工作流模板dev-outputs-wft中使用相同的函数时,它正在工作

可能是什么问题?

当表达式无法求值时,Argo工作流不会用其求值值替换表达式。Argo工作流传递表达式,就好像它是参数一样。

CCD_ 7";表达式标记模板";在Argo中,工作流必须根据expr语言规范编写

在简单的标签模板中,Argo Workflows自己进行解释。因此,参数名称中允许使用连字符。例如,Argo工作流将value: "{{inputs.parameters.what-it-is}}"评估为value: "over 9000!"

但在表达式标记模板中,expr将连字符解释为减号运算符。所以value: "{{=inputs.parameters.what-it-is}}"看起来像一个非常奇怪的数学表达式,失败了,并且没有被替换。解决方法是使用['what-it-is']访问相应的映射项。

我的猜测是,您的表达式失败了,Argo Workflows正在将表达式传递给dev-outputs-wft,而无论哪个shell脚本接收到该参数,都会中断。

如果我是对的,修复很容易:

- name: dev-outputs
depends: dev-create.Succeeded
templateRef:
name: dev-outputs-wft
template: main
arguments:
parameters:
- name: devoutputs
-                   value: "{{=jsonpath(tasks.dev-create.outputs.parameters.devoutputs, '$.alias.value')}}"
+                   value: "{{=jsonpath(tasks['dev-create'].outputs.parameters.devoutputs, '$.alias.value')}}"

相关内容

  • 没有找到相关文章

最新更新