无法在 Argo Workflows 中将 jsonpath 函数用于输出参数
Unable to use jsonpath function for output parameter in Argo Workflows
我有一个工作流,其中我将 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
其中 returns 另一个工作流模板
的输出
这是我的工作流模板
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
功能?我问的原因是,当我在另一个 workflowTemplate dev-outputs-wft
中使用相同的功能时它正在工作
可能是什么问题?
当表达式无法求值时,Argo Workflows 不会用求值值替换表达式。 Argo Workflows 传递表达式 就好像它是参数 .
{{=}}
Argo Workflows中的“表达式标签模板”必须按照expr language spec.
编写
在简单的标签模板中,Argo Workflows 本身会进行解释。所以参数名称中的连字符是允许的。例如,value: "{{inputs.parameters.what-it-is}}"
被 Argo Workflows 评估为 value: "over 9000!"
.
但在表达式标记模板中,expr 将连字符解释为减号运算符。所以 value: "{{=inputs.parameters.what-it-is}}"
看起来像一个非常奇怪的数学表达式,失败了,并且没有被替换。解决方法是使用 ['what-it-is']
访问适当的地图项。
我的猜测是您的表达式失败了,Argo Workflows 正在将表达式传递给 dev-outputs-wft
un-replaced,并且 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')}}"
我有一个工作流,其中我将 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
其中 returns 另一个工作流模板
这是我的工作流模板
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
功能?我问的原因是,当我在另一个 workflowTemplate dev-outputs-wft
可能是什么问题?
当表达式无法求值时,Argo Workflows 不会用求值值替换表达式。 Argo Workflows 传递表达式 就好像它是参数 .
{{=}}
Argo Workflows中的“表达式标签模板”必须按照expr language spec.
在简单的标签模板中,Argo Workflows 本身会进行解释。所以参数名称中的连字符是允许的。例如,value: "{{inputs.parameters.what-it-is}}"
被 Argo Workflows 评估为 value: "over 9000!"
.
但在表达式标记模板中,expr 将连字符解释为减号运算符。所以 value: "{{=inputs.parameters.what-it-is}}"
看起来像一个非常奇怪的数学表达式,失败了,并且没有被替换。解决方法是使用 ['what-it-is']
访问适当的地图项。
我的猜测是您的表达式失败了,Argo Workflows 正在将表达式传递给 dev-outputs-wft
un-replaced,并且 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')}}"