子字符串匹配条件时的Argo工作流



如果字符串以特定子字符串开头,我想在Argo工作流中执行任务。例如,我的字符串是tests/dev-or.yaml,如果我的字符串以tasks/开头,我想执行任务

这是我的工作流程,但条件没有得到正确的验证

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: conditional-
spec:
entrypoint: conditional-example
arguments:
parameters:
- name: should-print
value: "tests/dev-or.yaml"
templates:
- name: conditional-example
inputs:
parameters:
- name: should-print
steps:
- - name: print-hello
template: whalesay
when: "{{inputs.parameters.should-print }} startsWith 'tests/'"
- name: whalesay
container:
image: docker/whalesay:latest
command: [sh, -c]
args: ["cowsay hello"]

下面是当我运行工作流程时它给出的错误

WorkflowFailed 7s workflow-controller  Invalid 'when' expression 'tests/dev-or.yaml startsWith 'tests/'': Unable to access unexported field 'yaml' in token 'or.yaml'

在评估when条件时,似乎不接受-.yaml/

我的工作流程中有什么错误吗?使用这种条件的正确方法是什么?

tl;dr-使用这个:when: "'{{inputs.parameters.should-print}}' =~ '^tests/'"

参数替换发生在计算when表达式之前。所以当表达式实际上是tests/dev-or.yaml startsWith 'tests/'。正如您所看到的,第一个字符串需要引号。

但是,即使您有when: "'{{inputs.parameters.should-print}}' startsWith 'tests/'"(添加了单引号(,表达式也会失败,并出现以下错误:Cannot transition token types from STRING [tests/dev-or.yaml] to VARIABLE [startsWith]

Argo工作流的条件被评估为govaluate表达式。govaluate没有任何内置功能,Argo工作流也没有用任何功能来增强它。所以startsWith没有定义。

相反,您应该使用govaluate的regex比较器。表达式如下所示:when: "'{{inputs.parameters.should-print}}' =~ '^tests/'"

这是功能工作流:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: conditional-
spec:
entrypoint: conditional-example
arguments:
parameters:
- name: should-print
value: "tests/dev-or.yaml"
templates:
- name: conditional-example
inputs:
parameters:
- name: should-print
steps:
- - name: print-hello
template: whalesay
when: "'{{inputs.parameters.should-print}}' =~ '^tests/'"
- name: whalesay
container:
image: docker/whalesay:latest
command: [sh, -c]
args: ["cowsay hello"]

相关内容

  • 没有找到相关文章

最新更新