Commit Messages¶
Context and Problem Statement¶
Based on the decision to use Semantic Versioning, we have to decide how to identify breaking changes and how to determine the version for a component ?
Decision Drivers¶
- Usability for the developers.
- Ability to easily identify commits containing new features and breaking changes.
- Ability to generate a changelog of the changes and the associated version.
- Availability of GitLab CI Pipeline templates within Siemens.
- Availability of syntax checks.
Considered Options¶
- Follow the Conventional Commits Specification
- Follow the Angular Commit Message convention
- Depend on Git tags and the conventions from GitVersion
Decision Outcome¶
Chosen option: "Angular Commit Message convention" because,
- This option was chosen because it provides the best usability for the developers combined with a broad tool support.
- In addition, changelogs can be generated automatically when following these rules.
Pros and Cons of the Options¶
Angular Commit Message convention¶
Positive:
- CHANGELOGs can be generated automatically
- semantic version bumps can be determined automatically based on the types of commits landed
- the nature of changes can be communicated to teammates, the public, and other stakeholders
- build and publish processes can be triggered
- the commit history is more structured and easier to explore
- deprecations can be communicated easier
Negative:
- strict rules have to be followed
- tool to check these rules must be selected
More Information¶
Rules to follow¶
- Commits MUST be prefixed with a type, which consists of a noun, feat, fix, etc., followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space.
- The type feat MUST be used when a commit adds a new feature to your application or library.
- The type fix MUST be used when a commit represents a bug fix for your application.
- A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., fix(parser):
- A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., fix: array parsing issue when multiple spaces were contained in string.
- A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.
- A commit body is free-form and MAY consist of any number of newline separated paragraphs.
- One or more footers MAY be provided one blank line after the body. Each footer MUST consist of a word token, followed by either a :
or # separator, followed by a string value (this is inspired by the git trailer convention). - A footer’s token MUST use - in place of whitespace characters, e.g., Acked-by (this helps differentiate the footer section from a multi-paragraph body). An exception is made for BREAKING CHANGE, which MAY also be used as a token.
- A footer’s value MAY contain spaces and newlines, and parsing MUST terminate when the next valid footer token/separator pair is observed.
- Breaking changes MUST be indicated in the type/scope prefix of a commit, or as an entry in the footer.
- If included as a footer, a breaking change MUST consist of the uppercase text BREAKING CHANGE, followed by a colon, space, and description, e.g., BREAKING CHANGE: environment variables now take precedence over config files.
- If included in the type/scope prefix, breaking changes MUST be indicated by a ! immediately before the :. If ! is used, BREAKING CHANGE: MAY be omitted from the footer section, and the commit description SHALL be used to describe the breaking change.
- Types other than feat and fix MAY be used in your commit messages, e.g., docs: update ref docs.
- The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase.
- BREAKING-CHANGE MUST be synonymous with BREAKING CHANGE, when used as a token in a footer.
Type: MUST be one of the following: - build: Changes that affect the build system - chore: A code change that external user won't see (e.g., dev dependencies updated by Renovate Bot or a change to .gitignore file) - ci: Changes to our CI configuration files and scripts - docs: Documentation only changes - feat: A new feature - fix: A bug fix - perf: A code change that improves performance - refactor: A code change that neither fixes a bug nor adds a feature - revert: A revert of a commit - style: A code that is related to styling - test: Adding missing test or correcting existing tests
Scope: To update dependencies, the scope deps SHALL be used (e.g., Renovate Bot).
If additional scopes are used, they MUST be defined in the CONTRIBUTING.md file of the git repository.