Upgrade to Pro — share decks privately, control downloads, hide ads and more …

commitizen-tools: What can we gain from crafting a git message convention? @ Tainan.py June

3e049ed33195d00a8b745b16c63dce6e?s=47 Lee Wei
August 27, 2020

commitizen-tools: What can we gain from crafting a git message convention? @ Tainan.py June

3e049ed33195d00a8b745b16c63dce6e?s=128

Lee Wei

August 27, 2020
Tweet

Transcript

  1. @clleew commitizen-tools What can we gain from crafting a git

    message convention?
  2. @clleew 2019/10/24 - Taipei.py

  3. @clleew 2019/10/24 - Taipei.py

  4. @clleew

  5. @clleew Slide

  6. @clleew __name__ = 李唯 / Wei Lee __position__ = [

    Software Engineer @ Rakuten Slice, Volunteer @ PyCon Taiwan, "Maintainer of commitizen-tools, ] __twitter__ = @clleew __github__ = Lee-W __blog__ = http://lee-w.github.io $ cat speaker.py
  7. @clleew File "speaker.py", line 1 __name__ = 李唯 / Wei

    Lee ^ SyntaxError: invalid syntax $ python speaker.py
  8. @clleew Who have ever used git?

  9. @clleew Who have ever commit like this? git commit -m

    "update"
  10. @clleew

  11. @clleew

  12. @clleew Why not use "update" as a commit message? •

    Hard to find the right commit to rollback • Hard to know the trace of this change during code review • Tend to make a lot of changes in a single commit
 (because you don't know how to describe these changes)
  13. @clleew Why should we write good commit message? • Guide

    teams on how code changes should be made • Save reviewers' time to know the intention of changes • Give newcomer a clear view of the evolvement of projects
  14. @clleew How to write good commit messages? 1. Separate subject

    from body with a blank line 2. Limit the subject line to 50 characters 3. Capitalize the subject line 4. Do not end the subject line with a period 5. Use the imperative mood in the subject line 6. Wrap the body at 72 characters 7. Use the body to explain what and why vs. how
  15. @clleew But... It's easy to forget all the guidelines when

    you enter "git commit"
  16. @clleew commitizen-tools

  17. @clleew

  18. @clleew The command line tool for creating committing rules

  19. @clleew GitHub Action that runs commitizen

  20. @clleew cookiecutter template for creating customized rule

  21. @clleew Commitizen

  22. @clleew Install Commitizen

  23. @clleew Initialize commitizen configuration

  24. @clleew Initialize commitizen configuration

  25. @clleew Initialize commitizen configuration

  26. @clleew Initialize commitizen configuration

  27. @clleew Initialize commitizen configuration

  28. @clleew Initialize commitizen configuration

  29. @clleew Initialize commitizen configuration We'll discuss more about it later.

  30. @clleew [tool.commitizen] name = "cz_conventional_commits" version = "0.0.1" tag_format =

    "$version" Commtizen configuration pyproject.toml
  31. @clleew cz commit type of this change A hint for

    users to break down multiple changes into separate commits
  32. @clleew $ cz commit scope of this change

  33. @clleew $ cz commit
 a short description

  34. @clleew $ cz commit
 detail description of this change

  35. @clleew $ cz commit
 whether it's a breaking change

  36. @clleew $ cz commit
 footer reference to the ticket or

    issue related to this change
  37. @clleew How does the commit look like? feat(tainan.py): awesome meetup

    hope everyone enjoys this talk https://www.meetup.com/Tainan-py-Python-Tainan-User-Group/events/ 272270687/
  38. @clleew $ cz commit

  39. @clleew $ cz commit

  40. @clleew $ cz commit

  41. @clleew Standardized git commits

  42. @clleew What if I forget to use "cz commit" to

    do git commit?
  43. @clleew Enforce commit check through pre-commit 1.Create .pre-commit-config.yaml
 
 


    
 
 2.Install pre-commit hook repos: - hooks: - id: commitizen stages: - commit-msg repo: https://github.com/commitizen-tools/commitizen rev: v2.1.0
  44. @clleew It looks familiar

  45. @clleew It looks familiar We already initialize it when running

    "cz init".
  46. @clleew git will block it if your commit does not

    follow the rule.
  47. @clleew git will block it if your commit does not

    follow the rule.
  48. @clleew git will block it if your commit does not

    follow the rule.
  49. @clleew How can we utilize these standardize commit messages? •

    Auto versioning • Auto generate changelog
  50. @clleew Semantic Versioning x.y.z MAJOR Minor Patch

  51. @clleew • MAJOR: incompatible API changes • MINOR: add backwards

    compatible functionality • PATCH: make backwards compatible bug fixes Semantic Versioning
  52. @clleew Bump Version • MAJOR: breaking change • MINOR: feat

    • PATCH: fix, refactor, perf
  53. @clleew Bump Version • MAJOR: breaking change • MINOR: feat

    • PATCH: fix, refactor, perf
  54. @clleew Bump Version $ cz bump

  55. @clleew The commit with the highest version to bump is

    feat (The original version of the sample project is 1.2.0.) Bump Version $ cz bump
  56. @clleew message tag to create: 1.3.0 increment detected: MINOR The

    commit with the highest version to bump is feat (The original version of the sample project is 1.2.0.) Bump Version $ cz bump
  57. @clleew Bump Version in Source File [tool.commitizen] name = "cz_conventional_commits"

    version = "0.0.1" tag_format = "$version" version_files = [ "my_project/__init__.py" ]
  58. @clleew Keep a changelog

  59. @clleew Auto generate changelog

  60. @clleew Auto generate changelog # CHANGELOG ## Unreleased ### feat

    - add cov task to check test coverage - make scripts a package - add pylint task - add mypy, flake8 style check - add reformat task to reformat code through black
  61. @clleew Auto generate changelog

  62. @clleew Cutsomization 1. Use "cz-customize" in configuration file • No

    Python Knowledge needed • Suitable for basic rules 2. Creating a customized python package • Suitable for advance usage
 (e.g., customize changelog parser and hook)
  63. @clleew Back to our config file [tool.commitizen] name = "cz_conventional_commits"

    version = "0.0.1" tag_format = "$version"
  64. @clleew cz_customize [tool.commitizen] name = "cz_customize"

  65. @clleew cz_customize [tool.commitizen] name = "cz_customize" [tool.commitizen.customize] message_template = "{{change_type}}:

    {{message}}" bump_pattern = "^(break|new|hotfix)" bump_map = {"break" = "MAJOR", "new" = "MINOR", "hotfix" = "PATCH"} [tool.commitizen] name = "cz_customize"
  66. @clleew cz_customize [tool.commitizen] name = "cz_customize" [tool.commitizen.customize] message_template = "{{change_type}}:

    {{message}}" bump_pattern = "^(break|new|hotfix)" bump_map = {"break" = "MAJOR", "new" = "MINOR", "hotfix" = "PATCH"} [[tool.commitizen.customize.questions]] type = "list" name = "change_type" choices = [ {value = "feature", name = "feature: A new feature."}, {value = "hotfix", name = "bug fix: A bug fix."} ] message = "Select the type of change you are committing" [[tool.commitizen.customize.questions]] type = "input" name = "message" message = "Body." [tool.commitizen] name = "cz_customize" [tool.commitizen.customize] message_template = "{{change_type}}: {{message}}" bump_pattern = "^(break|new|hotfix)" bump_map = {"break" = "MAJOR", "new" = "MINOR", "hotfix" = "PATCH"} [tool.commitizen] name = "cz_customize"
  67. @clleew Customize through python package from commitizen.cz.base import BaseCommitizen class

    JiraCz(BaseCommitizen): def questions(self) -> list: """Questions regarding the commit message.""" questions = [ {"type": "input", "name": "title", "message": "Commit title"}, {"type": "input", "name": "issue", "message": "Jira Issue number:"}, ] return questions def message(self, answers: dict) -> str: """Generate the message with the given answers.""" return f"{answers['title']} (#{answers['issue']})" discover_this = JiraCz # used by the plug-in system
  68. @clleew commitizen-tools/commitizen_cz_template

  69. @clleew Join us and make commitizen-tools better ⭐

  70. @clleew Reference • commitizen-tools • Conventional Commits • Semantic Versioning

    • Keep a changelog • How to Write a Git Commit Message