# 사용예시 https://github.com/argoproj/argo-workflows/blob/main/examples/exit-handlers.yaml
spec:
entrypoint: intentional-fail
onExit: exit-handler
# OnExit 핸들러는 workflow.status 로 성공,실패 여부를 판단한다.
# 참고로 steps 에서 - 에 개수에 따른 차이
# - - 는 이전 단계 이후에 순차적으로 실행
# - 는 이전 단계와 동시에 실행(argo workflow 그래프로 보면 스텝(노드)들이 동시에 수행되는 것으로 표시된다.)
- name: exit-handler
steps:
- - name: notify
template: send-email
- name: celebrate
template: celebrate
when: "{{workflow.status}} == Succeeded"
# 그런데 steps.OnExit 로 설정하면 workflow.Status 가 "Running" 로 나온다.
spec:
template:
steps:
- - name: aaa
onExit: exit-handler
# 주석을 자세히 보니
# spec.onExit 에서는 primary workflow 의 workflow.status(global변수) 가(success, failure, error) 인지를 알 수 있다.
# step.onExit 은 아직 워크플로우가 진행중이니 running 상태가 되는것으로 보인다.
# 아래 코드를 보면 step.OnExit 는 LifecycleHook 형태가 된다.
# 참고로 workflow.status 에 다음과 같은 phase 값이 올 수 있다.
(Unknown)
Pending
Running
Succeeded
Failed
Error
# hooks 는 workflow level, template 에서 사용할 수 있다.
# hooks.exit 는 onExit 와 같은 역할을 한다.
# 사용예시
spec:
entrypoint: main
templates:
- name: main
steps:
- - name: aaa
hooks:
running:
expression: steps.aaa.status == "Running"
template: http
success:
expression: steps.aaa.status == "Succeeded"
template: http
failed:
expression: steps.aaa.status == "Failed"
template: http
template: echo
#####
# hook 은 현재 단계의 template 시작에 한번만 트리거돼 스텝별 시작/종료 상태를 파악하기 힘들다.
# 현재 단계에 시작/종료시 상태 파악을 위해 별도 template 을 앞뒤로 넣어준다.
specs:
entrypoint: main
templates:
- name: main
steps:
- name: start-main
template: update-status
arguments:
parameters:
- name: task
value: "start-main"
- name: status
value: "running"
- name: main
template: echo
- name: finish-main
template: update-status
arguments:
parameters:
- name: task
value: "finish-main"
- name: status
value: "{{steps.main.status}}"
# 상태 처리를 위해 호출될 템플릿
- name: update-status
inputs:
parameters:
- name: task
value: ""
- name: status
value: ""
steps:
- - name: running-status
when: "{{inputs.parameters.status}} == running"
template: write-status
- name: success-status
when: "{{inputs.parameters.status}} == Succeeded"
template: write-status
- name: fail-status
when: "{{inputs.parameters.status}} == Failed"
template: write-status
#####
# 참고
# golang template 에서 사용한다면 다음같이 backtick 으로 감싸줘야 한다.
"{{ `{{inputs.parameters.status}}` }}"
# 팁
# vim 등에서 argo workflow yaml 에 대한 lint 가 없어 편집시 불편하다.
# workflow yaml 작성시 다음과 같이 hwatch(watch 대체 커맨드)와 argo lint 로 확인하면서 편집하자.
hwatch -n 1 argo lint workflow.yaml