1

我有一个工作流程,在其中我使用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调用另一个 workflowTemplate 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

可能是什么问题?

4

1 回答 1

2

当表达式无法求值时,Argo Workflows 根本不会用其求值值替换表达式。Argo Workflows 将表达式作为参数传递。

{{=}}Argo Workflows 中的“表达式标签模板”必须按照expr 语言规范编写。

在简单的标签模板中,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未替换,并且接收该参数的任何 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')}}"
于 2022-02-05T22:55:08.083 回答