跳至内容

中间参数

v3.4 及更高版本

传统上,Argo workflows仅在工作流启动时支持从用户界面输入参数,之后基本上就处于自动运行状态。然而,存在许多需要人工交互的使用场景。

这种交互形式是在工作流过程中提供输入文本,并从工作流步骤智能生成的选项下拉列表中进行选择。

在jenkins中你可以看到一个类似的功能是pipeline-input-step

示例用例包括:

  • 在生产环境中执行操作前需要人工审批。
  • 以编程方式生成输入列表供用户选择。 从工作流自身生成的可用数据库列表中进行选择。

该功能通过suspend template实现。

工作流将在Suspend节点处暂停,用户将能够使用文本或下拉字段类型来更新参数。

中间参数审批示例

  • 以下示例展示了静态枚举值approval步骤。
  • 用户可以在[YES, NO]之间进行选择,该选择将用于后续步骤。

Approval Example Demo

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: intermediate-parameters-cicd-
spec:
  entrypoint: cicd-pipeline
  templates:
    - name: cicd-pipeline
      steps:
          - - name: deploy-pre-prod
              template: deploy
          - - name: approval
              template: approval
          - - name: deploy-prod
              template: deploy
              when: '{{steps.approval.outputs.parameters.approve}} == YES'
    - name: approval
      suspend: {}
      inputs:
          parameters:
            - name: approve
              default: 'NO'
              enum:
                  - 'YES'
                  - 'NO'
              description: >-
                Choose YES to continue workflow and deploy to production
      outputs:
          parameters:
            - name: approve
              valueFrom:
                  supplied: {}
    - name: deploy
      container:
          image: 'argoproj/argosay:v2'
          command:
            - /argosay
          args:
            - echo
            - deploying

中间参数数据库模式更新示例

  • 以下示例展示了如何以编程方式生成enum枚举值。
  • generate-db-list模板会生成一个名为db_list的输出。
  • 该输出的类型为json
  • 由于这个json有一个名为keyenum字段,包含一组选项数组,用户界面会解析并以下拉菜单形式显示。
  • 输出也可以是任意字符串,这种情况下用户界面会将其显示为文本字段,用户之后可以编辑。

DB Schema Update Example Demo

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: intermediate-parameters-db-
spec:
  entrypoint: db-schema-update
  templates:
      - name: db-schema-update
        steps:
          - - name: generate-db-list
              template: generate-db-list
          - - name: choose-db
              template: choose-db
              arguments:
                parameters:
                  - name: db_name
                    value: '{{steps.generate-db-list.outputs.parameters.db_list}}'
          - - name: update-schema
              template: update-schema
              arguments:
                parameters:
                  - name: db_name
                    value: '{{steps.choose-db.outputs.parameters.db_name}}'
      - name: generate-db-list
        outputs:
          parameters:
            - name: db_list
              valueFrom:
                path: /tmp/db_list.txt
        container:
          name: main
          image: 'argoproj/argosay:v2'
          command:
            - sh
            - '-c'
          args:
            - >-
              echo "{\"enum\": [\"db1\", \"db2\", \"db3\"]}" | tee /tmp/db_list.txt
      - name: choose-db
        inputs:
          parameters:
            - name: db_name
              description: >-
                Choose DB to update a schema
        outputs:
          parameters:
            - name: db_name
              valueFrom:
                supplied: {}
        suspend: {}
      - name: update-schema
        inputs:
          parameters:
            - name: db_name
        container:
          name: main
          image: 'argoproj/argosay:v2'
          command:
            - sh
            - '-c'
          args:
            - echo Updating DB {{inputs.parameters.db_name}}

一些重要细节

  • 暂停的节点应在inputs.parametersoutputs.parameters中定义相同的参数。
  • 挂起节点中的所有输出参数都应包含 valueFrom.supplied: {}
  • 选定的值将在 .outputs.parameters. 处可用

有问题吗?

Search on GitHub Discussions and Slack.