argo workflow onexit and hooks

# argo workflow 에서 워크플로우의 종료시 보통 Spec.OnExit 를 사용한다.
# 사용예시 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

comments:

댓글 쓰기