Git Hook을 사용한 Python의 시맨틱 버전 관리

46843 단어 python100daysofpython
AWS, Kubernetes, Python, JavaScript 등에 대한 콘텐츠를 작성합니다. 최신 콘텐츠를 모두 보려면 visit my blog 내 뉴스레터를 구독하십시오. .

This is Day 22 of the #100DaysOfPython challenge.



이 게시물은 pre-commit commitizen 패키지를 사용하여 커밋을 기반으로 Python용 시맨틱 버전 관리를 자동화합니다.

게시물은 게시물"Your First Pip Package With Python"에서 수행한 작업을 기반으로 합니다.

최종 코드는 here 에서 찾을 수 있습니다.

전제 조건


  • Pipenv . Pipenv에 대한 내 게시물은 here을 참조하십시오.

  • 시작하기



    okeeffed/your-first-pip-package-in-python 저장소에서 복제 및 작업을 수행하고 필요한 패키지를 설치합니다.

    $ git clone https://github.com/okeeffed/your-first-pip-package-in-python semantic-versioning-in-python-with-git-hooks
    $ cd semantic-versioning-in-python-with-git-hooks
    
    # Init the virtual environment
    $ pipenv install --dev pre-commit Commitizen toml
    
    # Create some required files
    $ touch .pre-commit-config.yaml
    


    이 단계에서 사전 커밋 후크를 구성할 준비가 되었습니다.

    사전 커밋 구성


    .pre-commit-config.yaml에 다음을 추가해야 합니다.

    ---
    repos:
      - repo: https://github.com/commitizen-tools/commitizen
        rev: master
        hooks:
          - id: commitizen
            stages: [commit-msg]
    


    완료되면 Commitizen 구성을 설정할 수 있습니다.

    커밋 설정



    다음을 실행하여 설정할 수 있습니다. pipenv run cz init:

    $ pipenv run cz init
    ? Please choose a supported config file: (default: pyproject.toml) pyproject.toml
    ? Please choose a cz (commit rule): (default: cz_conventional_commits) cz_conventional_commits
    No Existing Tag. Set tag to v0.0.1
    ? Please enter the correct version format: (default: "$version")
    ? Do you want to install pre-commit hook? Yes
    commitizen already in pre-commit config
    commitizen pre-commit hook is now installed in your '.git'
    
    You can bump the version and create changelog running:
    
    cz bump --changelog
    The configuration are all set.
    


    이제 커밋이 버전 관리에 영향을 줄 수 있는 단계에 있습니다! 파일이 생성됩니다pyproject.toml.

    [tool]
    [tool.commitizen]
    name = "cz_conventional_commits"
    version = "0.0.1"
    tag_format = "$version"
    


    여기에는 Commitizen이 우리를 위해 유지 관리하는 버전 정보가 포함됩니다.

    직장에서 자동화된 시맨틱 버전 관리



    먼저 버전0.0.1에 대한 태그를 생성해야 합니다.

    $ git tag -a 0.0.1 -m "Init version"
    


    커밋에 부여한 이름에 따라 버전이 변경됩니다. 설치된 Git 후크는 커밋이 Conventional Commits 명명 규칙을 따르도록 합니다.

    실제로 이것을 봅시다. 먼저 파일에 새 함수를 추가해 보겠습니다demo_pip_math/math.py.

    def divide(x: int, y: int) -> float:
        """divide one number by another
    
        Args:
                        x (int): first number in the division
                        y (int): second number in the division
    
        Returns:
                        int: division of x and y
        """
        return x / y
    


    이 코드를 추가하고 커밋하려고 합니다. 잘못된 버전을 설정하면 어떻게 되는지 살펴보겠습니다.

    $ git add demo_pip_math/math.py
    $ git commit -m "added new feature division"
    commitizen check.........................................................Failed
    - hook id: commitizen
    - exit code: 14
    
    commit validation: failed!
    please enter a commit message in the commitizen format.
    commit "": "not a valid commit name"
    pattern: (build|ci|docs|feat|fix|perf|refactor|style|test|chore|revert|bump)(\(\S+\))?!?:(\s.*)
    


    이것은 우리가 예상한 패턴과 일치하지 않았다는 것을 알려줍니다.

    새로운 기능을 추가한다고 가정하고 feat: 접두사를 사용해 보겠습니다.

    $ git commit -m "feat: added new divide functionality"
    commitizen check.........................................................Passed
    [main 333d291] feat: added new divide functionality
     1 file changed, 13 insertions(+)
    


    우리는 통과했다!

    이제 변경을 수행했으므로 Commitizen를 사용하여 버전을 업데이트하고 변경 로그를 만들고 버전을 업데이트할 수 있습니다.

    $ pipenv run cz bump
    bump: version 0.0.1  0.1.0
    tag to create: 0.1.0
    increment detected: MINOR
    
    Done!
    


    이제 pyproject.toml 를 확인하면 해당 변경 사항이 반영된 것을 볼 수 있습니다.

    [tool]
    [tool.commitizen]
    name = "cz_conventional_commits"
    version = "0.1.0"
    tag_format = "$version"
    


    변경 로그 생성



    변경 로그를 생성하려면 pipenv run cz changelog를 실행하십시오.

    $ pipenv run cz changelog
    # ... no output
    


    이렇게 하면 프로젝트 루트 디렉터리에 CHANGELOG.md 파일이 생성되며 이제 다음 정보가 포함됩니다.

    ## 0.1.0 (2021-08-10)
    
    ### Feat
    
    - added new divide functionality
    
    ## 0.0.1 (2021-08-10)
    
    ### Feat
    
    - add in division function
    - init commit
    


    성공!

    setup.py 동기화 유지



    마지막으로 setup.pypyproject.toml 에 반영된 것과 동기화되었는지 확인하려고 합니다.
    toml 패키지로 이것을 할 수 있습니다.
    setup.py 내부에서 파일을 다음과 같이 변경합니다.

    import setuptools
    import toml
    from os.path import join, dirname, abspath
    
    pyproject_path = join(dirname(abspath("__file__")),
                          '../pyproject.toml')
    file = open(pyproject_path, "r")
    toml_str = file.read()
    
    parsed_toml = toml.loads(toml_str)
    
    with open("README.md", "r") as fh:
        long_description = fh.read()
    
    setuptools.setup(
        name="demo_pip_math",
        version=parsed_toml['tool']['commitizen']['version'],
        author="Dennis O'Keeffe",
        author_email="[email protected]",
        description="Demo your first Pip package.",
        long_description=long_description,
        long_description_content_type="text/markdown",
        url="https://github.com/okeeffed/your-first-pip-package-in-python",
        packages=setuptools.find_packages(),
        classifiers=[
            "Programming Language :: Python :: 3",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
        ],
        python_requires='>=3.6',
        keywords='pip-demo math',
        project_urls={
            'Homepage': 'https://github.com/okeeffed/your-first-pip-package-in-python',
        },
    
    )
    


    TOML을 읽고 현재 버전에 대한 참조를 찾고 있습니다.

    리포지토리에 이미 추가된 build 스크립트를 사용하여 이것이 여전히 예상대로 작동하는지 확인할 수 있습니다.

    $ pipenv run build
    running sdist
    running egg_info
    creating demo_pip_math.egg-info
    writing demo_pip_math.egg-info/PKG-INFO
    writing dependency_links to demo_pip_math.egg-info/dependency_links.txt
    writing top-level names to demo_pip_math.egg-info/top_level.txt
    writing manifest file 'demo_pip_math.egg-info/SOURCES.txt'
    reading manifest file 'demo_pip_math.egg-info/SOURCES.txt'
    reading manifest template 'MANIFEST.in'
    adding license file 'LICENSE'
    writing manifest file 'demo_pip_math.egg-info/SOURCES.txt'
    running check
    creating demo_pip_math-0.1.0
    creating demo_pip_math-0.1.0/demo_pip_math
    creating demo_pip_math-0.1.0/demo_pip_math.egg-info
    creating demo_pip_math-0.1.0/tests
    copying files to demo_pip_math-0.1.0...
    copying LICENSE -> demo_pip_math-0.1.0
    copying MANIFEST.in -> demo_pip_math-0.1.0
    copying README.md -> demo_pip_math-0.1.0
    copying pyproject.toml -> demo_pip_math-0.1.0
    copying setup.py -> demo_pip_math-0.1.0
    copying demo_pip_math/__init__.py -> demo_pip_math-0.1.0/demo_pip_math
    copying demo_pip_math/math.py -> demo_pip_math-0.1.0/demo_pip_math
    copying demo_pip_math.egg-info/PKG-INFO -> demo_pip_math-0.1.0/demo_pip_math.egg-info
    copying demo_pip_math.egg-info/SOURCES.txt -> demo_pip_math-0.1.0/demo_pip_math.egg-info
    copying demo_pip_math.egg-info/dependency_links.txt -> demo_pip_math-0.1.0/demo_pip_math.egg-info
    copying demo_pip_math.egg-info/top_level.txt -> demo_pip_math-0.1.0/demo_pip_math.egg-info
    copying tests/__init__.py -> demo_pip_math-0.1.0/tests
    copying tests/test_math.py -> demo_pip_math-0.1.0/tests
    Writing demo_pip_math-0.1.0/setup.cfg
    creating dist
    Creating tar archive
    removing 'demo_pip_math-0.1.0' (and everything under it)
    running bdist_wheel
    running build
    running build_py
    creating build
    creating build/lib
    creating build/lib/demo_pip_math
    copying demo_pip_math/__init__.py -> build/lib/demo_pip_math
    copying demo_pip_math/math.py -> build/lib/demo_pip_math
    creating build/lib/tests
    copying tests/__init__.py -> build/lib/tests
    copying tests/test_math.py -> build/lib/tests
    warning: build_py: byte-compiling is disabled, skipping.
    
    installing to build/bdist.macosx-11-x86_64/wheel
    running install
    running install_lib
    creating build/bdist.macosx-11-x86_64
    creating build/bdist.macosx-11-x86_64/wheel
    creating build/bdist.macosx-11-x86_64/wheel/demo_pip_math
    copying build/lib/demo_pip_math/__init__.py -> build/bdist.macosx-11-x86_64/wheel/demo_pip_math
    copying build/lib/demo_pip_math/math.py -> build/bdist.macosx-11-x86_64/wheel/demo_pip_math
    creating build/bdist.macosx-11-x86_64/wheel/tests
    copying build/lib/tests/__init__.py -> build/bdist.macosx-11-x86_64/wheel/tests
    copying build/lib/tests/test_math.py -> build/bdist.macosx-11-x86_64/wheel/tests
    warning: install_lib: byte-compiling is disabled, skipping.
    
    running install_egg_info
    Copying demo_pip_math.egg-info to build/bdist.macosx-11-x86_64/wheel/demo_pip_math-0.1.0-py3.9.egg-info
    running install_scripts
    adding license file "LICENSE" (matched pattern "LICEN[CS]E*")
    creating build/bdist.macosx-11-x86_64/wheel/demo_pip_math-0.1.0.dist-info/WHEEL
    creating 'dist/demo_pip_math-0.1.0-py3-none-any.whl' and adding 'build/bdist.macosx-11-x86_64/wheel' to it
    adding 'demo_pip_math/__init__.py'
    adding 'demo_pip_math/math.py'
    adding 'tests/__init__.py'
    adding 'tests/test_math.py'
    adding 'demo_pip_math-0.1.0.dist-info/LICENSE'
    adding 'demo_pip_math-0.1.0.dist-info/METADATA'
    adding 'demo_pip_math-0.1.0.dist-info/WHEEL'
    adding 'demo_pip_math-0.1.0.dist-info/top_level.txt'
    adding 'demo_pip_math-0.1.0.dist-info/RECORD'
    removing build/bdist.macosx-11-x86_64/wheel
    


    이 빌드에서 버전0.1.0이 사용되었음을 알 수 있습니다.

    요약



    오늘의 게시물은 commitizen , pre-committoml 패키지를 사용하여 기존 커밋을 기반으로 하는 버전 관리 프로세스를 자동화하는 방법을 보여주었습니다.

    이는 대규모 팀이 작업에 약간의 노력을 추가하면서 패키지를 의미론적으로 올바르게 유지하는 데 도움이 됩니다.

    리소스 및 추가 읽을거리


  • The ABCs of Pipenv
  • Project code
  • pre-commit
  • commitizen
  • Your First Pip Package With Python

  • 사진 제공: snapsbyclark

    원래 내blog에 게시되었습니다. 새 게시물을 지체 없이 보려면 거기에 있는 게시물을 읽고 내 뉴스레터를 구독하십시오.

    좋은 웹페이지 즐겨찾기