Inko.js 파이썬 버전 변환 개발기

JackCme·2020년 4월 29일
2
post-thumbnail

프롤로그

일을 하다보면 어느 곳에 내용을 입력할 때, 한/영 전환을 까먹어서 한글로 영어를 친 뒤 뒤늦게 한글로 쳤다는 걸 인식하고 다 지우고 다시 영타로 입력해야 하는 일은 누구에게나 한번쯤은 있었을겁니다.
그게 귀찮아서 자동으로 변환해주는 코드가 어디 없나 하고 구글신에게 물어보니, Inko.js 라는 아주 멋진 양방향 한영변환 소스를 발견했습니다.
사용법과 코드를 둘러보던 중 이슈에 help wanted 라벨로 파이썬버전 변환 도움을 요청하는 이슈를 발견했습니다.
이 비루한 개발인생을 시작하게 해준 언어가 파이썬이었기에 옛날 생각도 할 겸 변환작업을 시작했습니다.

모듈제작 및 업로드

요구사항

  • 파이썬 버전 3이 미리 설치되어있어야 합니다.
  • 콘솔창에서 python 또는 python3 명령어 사용이 가능해야 합니다.

프로젝트 구조

자바스크립트에는 Node Package Manager(NPM)이 있다면 파이썬에는 Python Package Index(PyPI)가 있습니다. 내가 작성한 파이썬 모듈을 다른사람이 사용할 수 있도록 하기 위해선 패키지 관리자에 배포하여 다운받을 수 있도록 해야합니다.

파이썬 모듈을 작성하는 건 처음이었기에 프로젝트 구조를 잡는건 PyPA 공식문서의 튜토리얼을 참고하여 구성했습니다:

inko.py(root directory)
├──inko/            
│ └─ __init__.py
├──tests/
│ └─ test_inko.py
├──.gitignore
├──LICENSE
├──README.md
└──setup.py
  • inko/__init__.py 에서 __init__.py 는 추후에 모듈을 불러올 때 폴더명을(여기선 inko) 모듈명으로 사용할 수 있게 해줍니다. 단순히 빈 파일이어도 되고 그 안에 코드를 작성해도 됩니다.
  • setup.py 는 파이썬 모듈 setuptools 가 사용할 빌드 스크립트 입니다.

setup.py의 내용

import setuptools

with open("README.md", "r", encoding='utf-8') as fh:
    long_description = fh.read()

setuptools.setup(
    name="inko-py", #배포 패키지명
    version="1.0.0",
    author="JackCme",
    author_email="pitou_106@naver.com",
    description="Python pip module of Inko.js",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/JackCme/inko.py",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

setup() 함수의 파라미터값 설명은 여기서 찾아볼 수 있습니다.

배포파일 생성

다음은 해당 패키지의 배포패키지를 생성할 차례입니다:

주의
앞으로 나오는 모든 명령어는 패키지의 최상위 디렉토리에서 실행해야 합니다.

  • 패키지 생성에 필요한 모듈을 설치합니다
    $ python3 -m pip install --user --upgrade setuptools wheel

  • setup.py 파일이 위치한 디렉토리에서 다음 명령어를 실행합니다:
    $ python3 setup.py sdist bdist_wheel
    해당 명령어 실행 시 dist/ 폴더가 생성되면서 하위에 배포 패키지 파일을 생성해줍니다.

배포파일 업로드

다음은 생성된 배포패키지를 PyPI에 업로드 할 차례입니다.
PyPI는 배포패키지를 실제로 배포하기 전에 테스트로 업로드 해볼 수 있도록 테스트 플랫폼과 실 플랫폼으로 나누어져 있습니다. 테스트 플랫폼과 실플랫폼은 완전히 단독적으로 분리되어 있어 테스트 플랫폼에서 언제든지 자유롭게 업로드 테스트를 할 수 있습니다.

먼저 테스트 플랫폼에 테스트로 배포패키지를 업로드 해보겠습니다:

  1. https://test.pypi.org/account/register/ 에서 먼저 계정을 생성후 이메일 인증을 완료합니다.

  2. 계정 생성을 완료했다면 https://test.pypi.org/manage/account/#api-tokens 해당 링크로 이동하여 API 토큰을 생성해줍니다.

    Token name은 해당 토큰의 용도를 알아볼 수 있도록 작성하고 Scope는 기존에 생성한 프로젝트가 없다면 entire account(all projects)로 선택합니다.

  3. 토큰 생성을 완료하였다면 다음 페이지에서 프로젝트 토큰이 보일텐데, 해당 페이지는 일회성으로 보여지며 해당 페이지를 벗어나면 다시는 해당 토큰값을 볼 수 없으니 안전한 곳에다가 토큰값을 보관해주세요.

  4. 계정과 토큰모두 생성이 되었다면 이제 패키지를 실제로 업로드 해볼 차례입니다. 여기서는 twine 파이썬 모듈을 사용하여 배포패키지를 업로드 할것이기에 해당 모듈을 설치해줍니다
    $ python3 -m pip install --user --upgrade twine

  5. Twine 설치가 완료되면 이전에 생성한 dist/폴더 밑에 있는 모든 파일을 업로드 해줍니다.
    $ python3 -m twine upload --repository testpypi dist/*
    해당 명령을 실행하면 다음과 같이 계정정보를 요구합니다:

    Enter your username:
    Enter your password:

    PyPI 가입당시 설정한 계정정보로도 업로드가 가능하고, 이전에 생성한 토큰으로 업로드를 하고 싶다면 username__token__으로 입력 후 password는 토큰값으로 입력합니다.

    ⚠ 여기서 잠깐!
    업로드 대상 중에 이미 이전에 업로드한 파일과 동일한 이름의 파일이 존재한다면 업로드가 실패하니, 업로드시 dist/ 폴더 내의 이전에 업로드를 성공한 파일은 삭제해주어야 합니다.

  6. 업로드가 성공한다면 https://test.pypi.org/project/[setup.py 에서 설정한 패키지명] 에서 배포된 패키지를 볼 수 있을겁니다. 🎉

테스트 플랫폼에 배포된 모듈 설치하기

패키지 관리자에 업로드를 성공했다면 실제로 다른 사람이 설치하여 사용할 수 있는지도 확인을 해봐야겠죠? 그럼 테스트 플랫폼에 올라가있는 패키지를 내 컴퓨터에 설치를 해봅시다!

  1. 먼저 파이썬의 가상환경을 사용하여 타 모듈과 충돌이 없도록 venv 또는 virtualenv 모듈을 사용하여 가상환경을 만든 후 해당 가상환경으로 진입하여 작업을 합니다.

  2. 가상환경 진입이 완료됬다면 다음 명령어를 통해 테스트 플랫폼에 올라가있는 모듈을 설치해줍니다:
    $ python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps 패키지명

    여기서 --index-url 옵션으로 어느 파이썬 인덱스에서 다운받을것인지 명시해주었고, 현재 제 프로젝트는 의존하는 모듈이 없기 때문에 추가적으로 --no-deps 옵션을 사용하여 의존성 모듈설치를 제외했습니다. 테스트 PyPI는 실플랫폼과 동일하게 패키지를 유지하지 않기 때문에 의존성 모듈 설치를 시도한다면 의존모듈을 찾지 못하여 실패하거나 원치않는 전혀 다른 패키지를 설치 할 수 있기 때문에 의존성 모듈설치를 제외합니다.

  3. 이제 실제로 모듈을 사용하는 것과 동일하게 python cli 에서 import 구문으로 모듈이 잘 불러와진다면 테스트 모듈 배포에 성공한 것입니다! 🎉🎉

실 플랫폼에 모듈 배포하기

테스트 플랫폼에 배포하여 설치 후 모든 개발이 끝났다면 이제 많은 사람들이 사용해보고 유지보수 인원을 늘릴 차례 내 노력의 결실을 다른사람에게 나누어줄 차례입니다. (오픈소스의 최대장점)

실 플랫폼에 배포하는것은 테스트 플랫폼에 배포하는것과 크게 다르지는 않습니다.
위에 다루었던 배포과정을 동일하게 실행하되 다음과 같이 변경하여 실행하면 됩니다:

  1. 계정 및 토큰 생성시 https://test.pypi.org 가 아닌 https://pypi.org 에서 진행합니다.

  2. Twine 업로드 명령어의 --repository testpypi 옵션을 제거 합니다.
    $ python3 -m twine upload dist/*

  3. 업로드가 완료된 패키지는 이제 $python 3 -m pip install 패키지명 을 통해 어디서든지 설치 및 사용이 가능합니다.

CI/CD 붙이기

매번 이렇게 빌드해서 수동으로 업로드 해야하나...

개발자의 덕목은 개발만 주구장창 하는거지 왜 배포까지 신경써야 하나!!!!🤬급발진 해서 Github의 Action을 통해 master 브랜치에 푸시가 들어오면 자동으로 TestPyPI 와 PyPI에 업로드 해주는 Action workflow 를 붙였습니다. 파이썬 가이드에 아주 상세히 잘 나와있더군요..

Github에 토큰 저장하기

  1. 프로젝트 깃헙 레포지토리의 Settings 탭으로 이동합니다.

  2. 좌측 Secrets탭 진입 후 에서 Add new secret을 클릭하여 이전에 소중히 보관했던 TestPyPI 와 PyPI 계정의 토큰을 꺼내어 알아볼 수 있는 이름과 함께 입력 후 저장합니다.

Workflow 정의 생성하기

프로젝트 최상위 디렉토리에 .github/workflows/ 디렉토리를 생성후 하위에 원하는이름.yml 확장자로 YAML 설정파일을 생성해줍니다.

현재 제 프로젝트의 Github action workflow 파일의 내용은 다음과 같습니다:

name: Publish Python 🐍 distributions 📦 to PyPI and TestPyPI  # Workflow 명칭

on: push  # 푸시 커밋이 들어오면 하위 명시된 jobs 를 수행하라

jobs:
  build-n-publish:
    name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI  # 작업명칭
    runs-on: ubuntu-18.04  # 작업을 수행할 운영체제
    steps:
      - uses: actions/checkout@master  # 마스터 브랜치의 소스를 checkout 합니다
      
      - name: Set up Python 3.7	# 파이썬 3.7버전을 설치하는 과정
        uses: actions/setup-python@v1
        with:
          python-version: 3.7
          
      - name: Install modules  # 패키지 배포에 사용될 모듈 설치
        run: >-
          python -m
          pip install
          --user
          --upgrade
          setuptools wheel
          
      - name: Build a binary wheel and a source tarball  # 배포패키지 빌드
        run: >-
          python setup.py sdist bdist_wheel
          
      - name: Publish distribution 📦 to Test PyPI  # TestPyPI에 배포패키지 업로드
        uses: pypa/gh-action-pypi-publish@master # pypa에서 제작한 github action용 패키지 업로더 모듈 사용
        with:
          password: ${{ secrets.test_pypi_password }}
          repository_url: https://test.pypi.org/legacy/
          
      - name: Publish distribution 📦 to PyPI  # 실 PyPI에 배포패키지 업로드
        if: startsWith(github.event.ref, 'refs/tags')  # 무분별한 업로드 방지위해 태그가 달린 커밋이 푸시될때만 수행
        uses: pypa/gh-action-pypi-publish@master
        with:
          password: ${{ secrets.pypi_password }}

이제 해당 깃헙 레포지토리의 master 브랜치에 푸시 커밋이 들어온다면 해당 workflow 가 수행될 것 입니다.
테스트 플랫폼에는 푸시가 들어온다면 무조건 업로드 하도록 제약을 걸지 않았지만,
실 플랫폼에는 무분별한 업로드 방지를 위해 커밋에 태그를 붙여서 태그푸시가 들어올 시에만 배포되도록 제약을 걸었습니다.

해당 글에 사용된 소스는 제 레포주소인 https://github.com/JackCme/inko.py 여기서 확인이 가능합니다.
실제로 업로드된 모듈은 https://pypi.org/project/inko-py/ 여기서 확인이 가능합니다.

좋은 소스를 제공해주신 738(Junwoo Ji)님께 감사드립니다.

profile
구글을 네 몸과 같이 사랑하라 - 구글복음 10장 6절

0개의 댓글