semantic-release / commit-analyzer

:bulb: semantic-release plugin to analyze commits with conventional-changelog
MIT License
381 stars 74 forks source link

How do I add a releaseRule that also respects the `!` for a breaking change? (conventionalcommits preset) #413

Open natesilva opened 1 year ago

natesilva commented 1 year ago

We’re using the conventionalcommits preset. In this preset, adding an exclamation after the type triggers a breaking change/major version bump.

Using the default releaseRules this works. feat!:, fix!: and perf!: are recognized as major/breaking changes.

In fact, anything with an exclamation triggers a major/breaking change, such as docs!: or even allGloryToTheHypnoToad!:

Now we want to add refactor as a type.

plugins: [
    [
      '@semantic-release/commit-analyzer',
      {
        preset: 'conventionalcommits'
        releaseRules: [{ type: 'refactor', release: 'patch' }]
      }
    ],

After adding this, refactor: triggers a patch change, as expected.

But refactor!: no longer triggers a major version bump.

How do we get this to work?

Edit to add version info: semantic-release 19.0.5, @semantic-release/commit-analyzer 9.0.2, Node 16.19.0

RaphaelNeumann commented 1 year ago

I had the same issue like you.

But I found a solution by adding {breaking: true, release: 'major'} on my releaseRules

{
  preset: 'conventionalcommits',
  releaseRules: [
    { breaking: true, release: 'major' },
    { type: 'feat', release: 'minor' },
    { type: 'feature', release: 'minor' },
    { type: 'fix', release: 'patch' },
    { type: 'style', release: 'patch' },
    { type: 'refactor', release: 'patch' },
    { type: 'perf', release: 'patch' },
    { type: 'build', release: 'patch' },
    { type: 'chore', release: 'patch' },
    { type: 'revert', release: 'patch' }
  ]
}
tomavic commented 1 year ago

I also had the same issue when I tried to commit a perf commit with BREAKING CHANGE: in the body, I was expecting a major release but instead it triggers the patch.

      "@semantic-release/commit-analyzer",
      {
        "preset": "conventionalcommits",
        "parserOpts": {
          "noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES", "BREAKING"]
        },
        "releaseRules": [
          { "type": "docs", "release": "patch" },
          { "type": "refactor", "release": "patch" },
          { "type": "style", "release": "patch" },
          { "type": "test", "release": "patch" },
          { "type": "ci", "release": "patch" },
          { "type": "chore", "release": "patch" },
          { "type": "perf", "release": "patch" }
        ]
      }

Is there is any way to add multiple types with multiple release? Or something to override the rules if it found the BREAKING CHANGE: word in the body of the commit message?

I had the same issue like you.

But I found a solution by adding {breaking: true, release: 'major'} on my releaseRules

{
  preset: 'conventionalcommits',
  releaseRules: [
    { breaking: true, release: 'major' },
    { type: 'feat', release: 'minor' },
    { type: 'feature', release: 'minor' },
    { type: 'fix', release: 'patch' },
    { type: 'style', release: 'patch' },
    { type: 'refactor', release: 'patch' },
    { type: 'perf', release: 'patch' },
    { type: 'build', release: 'patch' },
    { type: 'chore', release: 'patch' },
    { type: 'revert', release: 'patch' }
  ]
}
ajcerezo commented 4 weeks ago

Hello,

I have the same problem, with this solution I solved it.

thank you

tomavic commented 3 weeks ago

@ajcerezo which solution do you mean?

ajcerezo commented 3 weeks ago

This solution of @RaphaelNeumann

I had the same issue like you.

But I found a solution by adding {breaking: true, release: 'major'} on my releaseRules

{
  preset: 'conventionalcommits',
  releaseRules: [
    { breaking: true, release: 'major' },
    { type: 'feat', release: 'minor' },
    { type: 'feature', release: 'minor' },
    { type: 'fix', release: 'patch' },
    { type: 'style', release: 'patch' },
    { type: 'refactor', release: 'patch' },
    { type: 'perf', release: 'patch' },
    { type: 'build', release: 'patch' },
    { type: 'chore', release: 'patch' },
    { type: 'revert', release: 'patch' }
  ]
}