Breeze 개발 모드에서 airflow UI에 접속되지 않는 문제가 발생하고 있습니다

3일 전부터 Airflow에 기여하기 위해 breeze를 개발 모드로 실행하면
Airflow UI에 접속할 수 없는 문제가 발생했습니다.

아래와 같이 UI가 정상적으로 로드되지 않았습니다.

제가 파악해본 바로는, breeze 개발 모드에서 두 번째로 실행되어야 하는 Vite 서버
(Simple Auth Manager UI) 가 시작되지 않는다는 것을 확인할 수 있었습니다.

이 문제가 처음 발생된지는 좀 되었는데 이미 몇 차례 수정과 롤백이 있었던 이슈였습니다.

실제로 Ephraim 님께서 첫 번째 수정을 하고,

이후 다른 문제가 추가로 생겨 Pierre 님께서 revert하시고 해결이 안되고 있었습니다.

원인을 파악해보자..!

breeze를 개발 모드로 실행하면
scripts/ci/prek/compile_ui_assets_dev.py에서 두 개의 Vite dev server를 실행합니다.

  1. Airflow UI
  2. Simple Auth Manager UI

문제는 첫 번째 pnpm devsubprocess.run으로 실행되어 블로킹되고 있다는 점이었습니다.

기존 코드

subprocess.run(
    ["pnpm", "dev"],
    cwd=os.fspath(UI_DIRECTORY),
    check=True,
    ...
)

# 여기까지 도달하지 못함 (위에서 블로킹됨)
subprocess.Popen(
    ["pnpm", "dev"],
    cwd=os.fspath(SIMPLE_AUTH_MANAGER_UI_DIRECTORY),
    ...
)
                                                                                                                

pnpm dev는 watch 모드로 실행되어 종료되지 않기 때문에,
subprocess.run은 영원히 대기 상태에 빠지고 그 결과 두 번째 Vite 서버는 절대 시작되지 않습니다.

수정 내용

첫 번째 pnpm devsubprocess.Popen으로 변경하여 비블로킹 방식으로 실행되도록 수정했습니다.

수정된 코드

subprocess.Popen(
    ["pnpm", "dev"],
    cwd=os.fspath(UI_DIRECTORY),
    ...
)

subprocess.Popen(
    ["pnpm", "dev"],
    cwd=os.fspath(SIMPLE_AUTH_MANAGER_UI_DIRECTORY),
    ...
)

signal.pause()

이렇게 수정하면 아래와 같이 두 개의 Vite 서버 모두 잘 시작되는 것을 확인할 수 있습니다.

추가 이슈: prek 0.3.0 출력 문제

이 변경 이후, prek 0.3.0 환경에서 "Compile ui assets in dev mode (manual)" 메시지가 터미널을 계속 덮어쓰는 문제가 발생했습니다. (prek 0.2.x 버전을 사용하고 계시다면 해당되지 않습니다.)

이는 signal.pause()로 인해 hook이 종료되지 않으면서, prek의 progress indicator가 지속적으로 업데이트되기 때문입니다.

이를 해결하기 위해 run_utils.py에서 dev 모드에서도 prek 출력을 파일로 리다이렉트하도록 수정했습니다.

stdout이 TTY가 아닐 경우, prek는 progress indicator를 표시하지 않기 때문에 터미널 출력 flooding을 방지하면서도 디버깅을 위한 로그는 파일로 유지할 수 있었습니다.

마치며

아직 PR이 병합되지는 않았지만,
최근 많은 한국인 기여자분들께서 Airflow 기여에 참여하고 계신 만큼 breeze 환경에서 갑자기 문제가 발생해 당황하실까 봐 정리해서 남겨봅니다 :slightly_smiling_face:

저도 갑자기 UI가 뜨지 않아 꽤 당황했거든요 ㅋㅋㅋㅋㅋ

1개의 좋아요