Сбой выполнения шаблона рабочего процесса Argo при использовании условия when с циклом withParam вместе с вводом артефакта

#conditional-operator #argo-workflows #argocd

#условный оператор #argo-workflows #argocd

Вопрос:

У меня есть следующий шаблон рабочего процесса, в котором условие when when: "'{{item}}' =~ '^tests/'" , артефакты вводятся в качестве пути к файлу в S3 корзине AWS и withParam цикле.

Вот мой шаблон рабочего процесса

 apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
  name: process-wft
spec:
  entrypoint: main
  templates:
    - name: main
      inputs:
        parameters:
          - name: dir-process
            default: true
          - name: dir


        artifacts:
          - name: Code

      dag:
        tasks:
          - name: process-wft-tests
            when: "'{{item}}' =~ '^tests/'"
            templateRef:
              name: tf-wf-rn
              template: main
            arguments:
              parameters:
                - name: dir-process
                  value: "{{inputs.parameters.dir-process}}"
              artifacts:
                - name: Code
                  from: "{{inputs.artifacts.Code}}"
            withParam: "{{inputs.parameters.dir}}"
 

вот Code результат извлечения моего входного артефакта, который передается из моего рабочего процесса

 inputs:
  artifacts:
  - archive:
      tar:
        compressionLevel: 9
    archiveLogs: true
    globalName: GitSource
    name: Code
    path: /mnt/out/code
    s3:
      key: process-kfxqf/process-kfxqf-1938174407/GitSource.tgz
 

При запуске моего рабочего процесса возникает ошибка, приведенная ниже

 message: failed to resolve {{inputs.artifacts.Code}}
 

В чем ошибка, которую я здесь делаю? если это не сработает, какой альтернативный способ заставить это работать?

Примечание: я попробовал выполнить рабочий процесс, удалив условие when, оно работает нормально. Проблема возникает только при добавлении условия when.

Комментарии:

1. Можете ли вы поделиться тем, как вы вызываете этот WorkflowTemplate? Это с argo submit --from workflowtemplate/process-wft или, может быть, другой рабочий процесс с a workflowTemplateRef ? И можете ли вы уточнить, откуда берется второй блок кода?

2. @Michael Crenshaw — я вызываю этот шаблон рабочего workflowTemplateRef процесса из другого рабочего процесса, а второй блок кода является результатом артефакта Code , упомянутого в шаблоне рабочего процесса. Второй блок кода я только что добавил для лучшего понимания результата артефакта Code .

3. Это очень похоже на ошибку. Я собираюсь отправить проблему, а затем ссылку здесь.

4. Хорошо, есть ли у нас какой-либо обходной путь для устранения этой проблемы в моем текущем шаблоне рабочего процесса?

5. Обновлен ответ с потенциальным обходным путем. Еще одна идея: есть ли какой-либо способ передать только информацию об артефакте в качестве параметров, а затем фактически загрузить артефакт в main шаблон tf-wf-rn WorkflowTemplate?

Ответ №1:

Это ошибка.

Кажется, что когда условие оценивается false как, некоторый код пропускает заполнение артефакта (имеет смысл, экономит время), но какой-то другой код не соблюдает when условие и все еще ожидает, что артефакт будет заполнен.

Возможные обходные пути:

  1. Переместите условную логику в контейнер.
    1. удалите when условие
    2. передайте dir параметр main шаблону в вашем tf-wf-rn WorkflowTemplate
    3. измените main шаблон, чтобы запускать регулярное выражение для dir параметра — если он не совпадает, просто выйдите из 0

    Это может значительно замедлить рабочий процесс, потому что вам придется запускать модуль для каждой итерации цикла, чтобы определить, действительно ли нужно выполнить какую-либо работу.

  2. Если вы можете вычислить всю информацию об артефакте, передайте эту информацию в качестве параметров main шаблону в вашем tf-wf-rn WorkflowTemplate. Затем фактически загрузите артефакт в этот необусловленный, не зацикленный шаблон. (В основном классики по проблемному коду.)
  3. Попробуйте более старую версию.

    Если вы обнаружите работающую более старую версию, пожалуйста, 1) прокомментируйте сообщение об ошибке и 2) убедитесь, что более старая версия не имеет каких-либо соответствующих уязвимостей в системе безопасности, прежде чем запускать ее в производственной системе.