Windows 환경에서 적용 불가 에러 해결
야심차게 Pre-commit을 잘 적용했고 동료들이 잘 썼지만 변수가 하나 있었습니다. 바로 Windows PC를 사용하는 환경에서는 pre-commit을 제대로 수행 할 수 없었습니다. 원인은 Python PATH 문제 였으며, 해결 방법으로 아래 처럼 pytest 수행 시 entry: 부분에 python path를 직접 넣는 방법이 있었습니다.
...
- id: pytest
name: pytest
entry: C:\\Users\\sobor\\anaconda3\\envs\\venv\\python.exe -m pytest -s
...
하지만 이것은 아니라는 생각이 들었습니다. 각자 local 환경의 python PATH 를 위와 같이 입력하고, .pre-commit-config.yaml 파일을 .gitignore에 추가하고 각자 관리하자는 의견이 있었지만 사람 보다 시스템을 믿기에 수용하지 않았습니다. 대신에 아래와 같은 방법으로 직접 해결했습니다.
발생하는 문제는 다음과 같았습니다. pytest 를 실행하고 싶지만, 그냥 pytest 만 입력 할 경우 python PATH 문제로 ModuleNotFoundError: No module named 'pytest' 가 발생하는 것이었습니다. 뿐만 아니라, Project Root 를 찾지 못한다던가 python 내장 모듈 등 다수의 에러가 발생했습니다.
그리하여 pre-commit 실행 시 바라보는 python PATH와 무관하게 실행 가능하도록 project에 적용 중인 requirements.txt 를 설치 후, pytest가 실행되도록 아래 runpytest 파일을 .pre-commit-config와 같은 위치에 작성했습니다.
#!/bin/sh
set -o errexit
cd "$(dirname $0)"
pip install -r requirements.txt
python -m pytest -s -v
그런 다음 .pre-commit-config.yaml 파일의 entry 에서 위 스크립트를 실행하도록 아래와 같이 작성했습니다.
...
entry: sh ./run_pytest
...
######### 전체 .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: flake8
additional_dependencies: [ flake8==6.0.0 ]
name: PEP8 Check (flake8)
entry: flake8
args:
- "--max-line-length=120"
language: python
types: [ python ]
require_serial: true
- id: unit test
name: unit test
entry: sh ./run_pytest
language: system
types: [ python ]
향후 추진
위에서 진행한 모든 과정 덕분에 Windows, Mac, Ubuntu 환경에서 모두 사용 가능한 pre-commit을 적용했습니다. 하지만, 적용 후 'pytest 실행을 위해 local에서 매번 requirements.txt 를 실행시키는 것은 또 비효율이 아닌가?' 라는 생각을 하게되었습니다. 그리하여, 향후에는 pre-commit으로는 flake8, mypy와 같이 PyLint 관련 검사만 진행하고 pytest 는 GitLab에서 merge request 시, 수행하는 방향으로 수정하려 합니다. 해당 적용기 또한, 블로그에 업로드 하겠습니다.
'Backend' 카테고리의 다른 글
python pre-commit Git Hook / flake8 / pytest / PEP8, python pre-commit python path error (0) | 2023.02.15 |
---|---|
Docker 환경에서 postgreSQL 설치, backup, restore 하기 (0) | 2023.02.15 |