Workflow Variables
workflow specification의 일부 fields는 Argo에 의해서 자동으로 대체되는 variable references가 가능하다.
해당 변수들은 {}
안에 포함시켜서 사용하면 된다.
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: hello-world-parameters-
spec:
entrypoint: whalesay
arguments:
parameters:
- name: message
value: hello world
templates:
- name: whalesay
inputs:
parameters:
- name: message
container:
image: docker/whalesay
command: [ cowsay ]
args: [ "{{inputs.parameters.message}}" ]
다음과 같은 두 종류의 template tag가 존재한다.
{{workflow.name}}
{{=workflow.name}}
{{
바로 뒤에 =
가 붙은 형식-
으로 연결된 parameter name 혹은 step name인 경우 인텍싱을 통해 참조해야 한다. e.g. inputs.parameters['my-param']
or steps['my-step'].outputs.result
🤔 workflow.parameters.json
All input parameters to the workflow as a JSON string
- 워크플로우에 대한 모든 input parameter를 JSON string으로 사용한다.
- workflow variable 중 Global 변수에 해당
workflow.parameters.json
에서 제공되는 JSON은 parameter values 값에서 quotes를 이스케이프 처리하지 않고 잘못된 JSON을 생성할 수 있다고 한다.
기여자는 workflow.parameters.json이 항상 유효한 JSON 문자열을 제공하기 위해 workflow input parameter 안의 "
가 이스케이프될 것으로 예상했다.
workflow는 error가 발생하고 argument-1
's value의 "
를 제거하면 에러가 사라진다고 한다.
에러가 발생하는 코드는 다음과 같다.
kind: Workflow
metadata:
generateName: json-test-
spec:
entrypoint: params-dumper
arguments:
parameters:
- name: argument-1
value: with " quote
templates:
- name: params-dumper
container:
image: python
command:
- python
- -c
args:
- |
from json import loads
from json.decoder import JSONDecodeError
try:
loads("""{{workflow.parameters.json}}""")
except JSONDecodeError as e:
print(f"not ok: {e}")
raise e
else:
print("ok")
loads()
는 json 문자열을 python 객체로 변환하기 위한 함수 """{value}"""
를 활용(?)json: [{"name":"argument-1","value":"with " quote"}] <<< 이렇게 json string이 생성
-> 해당 파라미터 값 중 value의 with " quote
부분에서 "
가 escape 안 됨
What does it mean to escape a string?
quote 안에서 ambiguity(모호성)을 줄이기 위한 문자열"Hello World" "Hello "World""
따라서
"
를 escape하기 위해"Hello \"World\""
해당 코드를 작성해보고 실행한 결과 python 환경에서도 비슷한 에러가 발생함을 확인하였고 Argo workflows와 무관하다 판단되어 다른 이슈를 탐색하기로 함