Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

INTERNAL: Force to use python version 2 that is 2.6 or higher in build.sh #64

Merged
merged 1 commit into from
Feb 6, 2024

Conversation

uhm0311
Copy link
Collaborator

@uhm0311 uhm0311 commented Jan 26, 2024

build.sh에서 python 2.7을 찾을 수 없으면 스크립트를 종료하도록 했습니다.

Binary 파일 탐색

local python_bin=$(which python2.7 2>/dev/null || which python2 2>/dev/null || which python 2>/dev/null)

위 코드는 which 명령어로 python 2.7 -> python2 -> python 순서대로 python 바이너리 파일을 찾는 것입니다.
which 명령어가 실패하면 에러 메세지는 출력이 되지 않도록 2>/dev/null를 넣었습니다.
2>/dev/null가 중복이 되기 때문에 변수로 만들어서 사용하려고 했는데, 원인은 파악하지 못했지만 변수로 사용하면 다음과 같은 문제가 있어서 하드 코딩 했습니다.

  • 2>/dev/null를 변수로 사용하지 않는 경우
    1. python2.7을 찾으면 python2.7의 경로를 저장(set)하고 이 아래는 스킵
    2. python2를 찾으면 python2의 경로를 저장(set)하고 이 아래는 스킵
    3. python을 찾으면 python의 경로를 저장(set)
  • 2>/dev/null를 변수로 두고 사용하는 경우
    •  local stderr_to_null="2>/dev/null"
       local python_bin=$(which python2.7 "$stderr_to_null" || which python2 "$stderr_to_null" || which python "$stderr_to_null")
    1. python2.7을 찾으면 python2.7의 경로를 저장(set)하고 아래의 로직을 계속 수행
    2. python2를 찾으면 python2의 경로를 끝에 덧붙이고(append) 아래의 로직을 계속 수행
    3. python을 찾으면 python의 경로를 끝에 덧붙임(append)

Python 버전 검사

local pythonmajorversion=$("$python_bin" -c 'import sys; print(sys.version_info[0])')
local pythonminorversion=$("$python_bin" -c 'import sys; print(sys.version_info[1])')
if [ "$pythonmajorversion" != "2" ] || [ "$pythonminorversion" != "7" ]; then
  echo "No python 2.7 found. Other version of python is NOT supported yet."
  exit 1
fi

sys.version_info는 python 바이너리의 버전을 담고 있는 Array 입니다.
[0]에는 Major 버전, [1]에는 Minor 버전, [2]에는 Build 버전이 들어갑니다.
예를 들어 python 2.7.3인 경우 [0] = 2, [1] = 7, [2] = 3 입니다.
python의 2.x.x 버전은 2.7.x 버전이 최신이므로 2.7.x 버전인지 아닌지 검사하는 것입니다.

추가 논의 사항

Python 버전 검사 관련

README에는 python 2.6 이상이 필요하다고 되어 있어서 README를 수정할지, 아니면 build 스크립트에서 Python 2.6도 허용할지 정해야 합니다.

Python 버전에 따른 분기 관련

if [ "$pythonmajorversion" == "3" ]; then
  ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future $python_bin -m pip install --upgrade -t $pythonpath -i $pythonsimpleindex pycryptodome==3.9.7 1>> $arcus_directory/scripts/build.log 2>&1
  $python_bin -m pip install --upgrade -t $pythonpath -i $pythonsimpleindex fabric==2.5.0 1>> $arcus_directory/scripts/build.log 2>&1
else
  # FIXME pycrypto-2.6 is really really slow.. So let's downgrade it.
  ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future $python_bin -m pip install --upgrade -t $pythonpath -i $pythonsimpleindex pycrypto==2.4.1 1>> $arcus_directory/scripts/build.log 2>&1
  $python_bin -m pip install --upgrade -t $pythonpath -i $pythonsimpleindex fabric==1.8.3 1>> $arcus_directory/scripts/build.log 2>&1
fi

기존 빌드 스크립트에서는 Python이 3.x.x 버전인지 아닌지에 따라 분기를 하도록 되어 있습니다.
Python 3 버전으로도 build 스크립트는 잘 구동됩니다.

그러나 이미 알려진 이슈로, #43 Python 3를 통해 arcus.sh 스크립트를 사용하면 아래와 같은 에러 메세지가 출력됩니다.

$ ./arcus.sh deploy conf/test.json
/root/arcus/lib/python/site-packages/paramiko/transport.py:32: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography will remove support for Python 3.6.
  from cryptography.hazmat.backends import default_backend
Traceback (most recent call last):
  File "/root/arcus/scripts/fab", line 8, in <module>
    sys.exit(program.run())
  File "/root/arcus/lib/python/site-packages/invoke/program.py", line 373, in run
    self.parse_collection()
  File "/root/arcus/lib/python/site-packages/invoke/program.py", line 465, in parse_collection
    self.load_collection()
  File "/root/arcus/lib/python/site-packages/fabric/main.py", line 87, in load_collection
    super(Fab, self).load_collection()
  File "/root/arcus/lib/python/site-packages/invoke/program.py", line 699, in load_collection
    module, parent = loader.load(coll_name)
  File "/root/arcus/lib/python/site-packages/invoke/loader.py", line 76, in load
    module = imp.load_module(name, fd, path, desc)
  File "/usr/lib64/python3.6/imp.py", line 235, in load_module
    return load_source(name, filename, file)
  File "/usr/lib64/python3.6/imp.py", line 172, in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>", line 684, in _load
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 674, in exec_module
  File "<frozen importlib._bootstrap_external>", line 781, in get_code
  File "<frozen importlib._bootstrap_external>", line 741, in source_to_code
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/root/arcus/scripts/fabfile.py", line 135
    print destination, os.path.isfile(destination)
                    ^
SyntaxError: invalid syntax

즉, build 스크립트에서 Python 버전이 3인지 아닌지는 고려할 대상이 아닙니다.
3이라면 arcus.sh 스크립트를 사용할 수 없기 때문입니다.

그러나 향후에는 Python 3 버전에 대한 지원이 가능해질 수도 있기 때문에 아래의 선택지 중 하나를 고를 수 있습니다.

  1. 코드 보존을 위해 실제로는 소용이 없더라도 Python 3 버전에 대한 분기를 존치 (현재 PR)
  2. 코드 보존은 하되 주석 처리
  3. Python 3 버전에 대한 분기 자체를 제거

@uhm0311 uhm0311 requested review from jhpark816 and namsic January 26, 2024 05:20
Copy link
Collaborator

@namsic namsic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

README에는 python 2.6 이상이 필요하다고 되어 있어서 README를 수정할지, 아니면 build 스크립트에서 Python 2.6도 허용할지 정해야 합니다.

별도로 README나 build.sh를 수정하지 않아도 괜찮을 것으로 생각합니다.
python 2.6이 설치되어 있으면 python2 명령으로 분기될 것이기 때문입니다.

그러나 향후에는 Python 3 버전에 대한 지원이 가능해질 수도 있기 때문에 아래의 선택지 중 하나를 고를 수 있습니다.

Python3 지원 시에는 build.sh이나 arcus.sh이 아닌 다른 방법으로 지원하게 될 확률이 높아서, 현재 시점에서는 PR과 같은 변경이면 충분하다고 생각합니다.

@uhm0311
Copy link
Collaborator Author

uhm0311 commented Jan 26, 2024

별도로 README나 build.sh를 수정하지 않아도 괜찮을 것으로 생각합니다.
python 2.6이 설치되어 있으면 python2 명령으로 분기될 것이기 때문입니다.

첫번째 코멘트의 Python 버전 검사 단락과 연계되는 내용입니다. 다시 검토해주세요.

@namsic
Copy link
Collaborator

namsic commented Jan 31, 2024

README에는 python 2.6 이상이 필요하다고 되어 있어서 README를 수정할지, 아니면 build 스크립트에서 Python 2.6도 허용할지 정해야 합니다.

두 방법 모두 크게 문제 없을 것 같고, README 수정하는 것이 더 간단해 보입니다.

@uhm0311 uhm0311 force-pushed the uhm0311/develop branch 2 times, most recently from cd23a22 to a652ecb Compare January 31, 2024 02:17
@uhm0311
Copy link
Collaborator Author

uhm0311 commented Jan 31, 2024

@namsic

Python 2.6 이상이 필요하다고 명시되어 있는 문서를 2.7이 필요하다고 변경했습니다.
zookeeper 문서에도 같은 서술이 있긴 하지만 저희가 관리하는 문서는 아니므로 변경하지 않았습니다.
해당하는 zk 문서는 arcus/zookeeper/zookeeper-contrib/zookeeper-contrib-zkpython/README 경로에 있습니다.

@jhpark816
Copy link
Contributor

@uhm0311 @namsic
수고 했습니다.
offline 논의 후에 PR 처리하겠습니다.

@jhpark816
Copy link
Contributor

@uhm0311 본 PR과 관련된 이슈 링크를 올려주세요.

@uhm0311
Copy link
Collaborator Author

uhm0311 commented Feb 5, 2024

@jhpark816

#43
위 이슈입니다.

@namsic
Copy link
Collaborator

namsic commented Feb 5, 2024

  • jam2in/arcus-install#10

@jhpark816
Copy link
Contributor

@uhm0311
기존 python 2.6 사용하던 것을 python 2.7로 변경하는 이유는 무엇인가요?

@uhm0311
Copy link
Collaborator Author

uhm0311 commented Feb 5, 2024

@jhpark816

첫 코멘트의 Python 버전 검사 단락을 포함한 그 아래 내용과 아래 코멘트를 참고해주세요.

@uhm0311 uhm0311 force-pushed the uhm0311/develop branch 2 times, most recently from 3c2010d to 5310015 Compare February 5, 2024 09:07
@uhm0311 uhm0311 changed the title INTERNAL: Force to use python2.7 in build script. INTERNAL: Force to use python >= 2.6 in build.sh Feb 5, 2024
@uhm0311
Copy link
Collaborator Author

uhm0311 commented Feb 5, 2024

@jhpark816

오프라인 리뷰 반영하여 python 2.6 이상의 버전을 사용할 수 있도록 했습니다.

@jhpark816
Copy link
Contributor

jhpark816 commented Feb 5, 2024

아래의 commit message로 변경합시다.

INTERNAL: Force to use only python version 2 that is 2.6 or higher in build.sh.

@jhpark816
Copy link
Contributor

추가 사항으로,
기존에 (python >= 2.6) 표현도 수정이 되어야 할 것 같습니다.
기존 표현은 version 3도 포함하므로,
2.6 이상이지만 2 버전의 python을 사용해야 하는 것으로 표현해야 할 것 같습니다.

@uhm0311
Copy link
Collaborator Author

uhm0311 commented Feb 5, 2024

@jhpark816

https://stackoverflow.com/questions/22343224/whats-the-difference-between-tilde-and-caret-in-package-json

패키지 관리자에서 흔히 표현하는 방식을 사용하도록 했습니다.
^2.6.0>= 2.6.0 && < 3.0.0을 의미합니다.

@jhpark816
Copy link
Contributor

^2.6.0 의미를 알고 있을 확률이 아주 낮습니다.
적당한 표현이 없다면 풀어서 적도록 하시죠.

python version 2 that is 2.6 or higher

@uhm0311
Copy link
Collaborator Author

uhm0311 commented Feb 6, 2024

@jhpark816

^2.6.0라고 표현된 부분을 풀어서 표현했습니다.

@jhpark816
Copy link
Contributor

@uhm0311
commit message도 수정 바랍니다.

@uhm0311 uhm0311 changed the title INTERNAL: Force to use python >= 2.6 in build.sh INTERNAL: Force to use python version 2 that is 2.6 or higher in build.sh Feb 6, 2024
@uhm0311
Copy link
Collaborator Author

uhm0311 commented Feb 6, 2024

@jhpark816

수정했습니다.

@jhpark816 jhpark816 merged commit fd97d25 into naver:master Feb 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants