Skip to main content

NPM Packages Versioning

How it works

The version is released automatically using the semantic-release utility at CI runtime. @semantic-release/commit-analyzer analyzes the commit structure and associates it with the release number <major>.<minor>.<patch>.

The commit header must contain the type: <type>: commit header

Format:

major

  • BREAKING CHANGE: breacking changes

minor

  • feat: a new feature

patch

  • build: changes that affect the build system or external dependencies
  • ci: changes to our CI configuration files and scripts
  • docs: documentation changes
  • fix: a bug fix
  • perf: a performance fix
  • refactor: a code base improvement
  • test: a fix tests or adding missing tests

@semantic-release/git changes version property package.json and commits release assets:

{
"version": "<major>.<minor>.<patch>"
}

Then the tag is set with a new version number.

Multiple commits

If there are multiple commits that match one or more rules, the one with the highest release type will determine the global release type. For example:

Previous global version: 1.2.0

Two commits:

[12:32] feat: new feature
[12:40] fix: fix bug

Next global version: 1.3.0 (minor release)

Two commits:

[12:45] fix: fix bug #2
[12:50] fix: fix bug #3

Next global version: 1.3.1 (patch release)

Config

CI

The CI pipeline trigger of the publish task should not bind to the tag, because the tag is set in this pipeline.

Release version:

publish:
stage: release
script:
- npm run build
- npm run semantic-release
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

package.json

{
"scripts": {
"semantic-release": "semantic-release"
},
"devDependencies": {
"@semantic-release/git": "10.0.1",
"semantic-release": "19.0.2"
}
}

.releaserc.json

@semantic-release/gitlab -> assets - list of files for npm package release.

{
"branches": ["master"],
"plugins": [
["@semantic-release/commit-analyzer", {
"preset": "angular",
"releaseRules": [
{"breaking": true, "release": "major"},
{"type": "feat", "release": "minor"},
{"type": "fix", "release": "patch"},
{"type": "docs", "release": "patch"},
{"type": "refactor", "release": "patch"},
{"type": "style", "release": "patch"},
{"type": "build", "release": "patch"},
{"type": "ci", "release": "patch"},
{"type": "test", "release": "patch"},
{"type": "perf", "release": "patch"}
],
"parserOpts": {
"noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"]
}
}],
"@semantic-release/npm",
[
"@semantic-release/git",
{
"assets": ["package.json"],
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
]
]
}

What else

https://github.com/commitizen/cz-cli and/or https://github.com/conventional-changelog/commitlint tools can be used for easy commits preparation.