Skip to content
Snippets Groups Projects
Commit 5a02f5d2 authored by Daniel Dehennin's avatar Daniel Dehennin
Browse files

feat(semantic-release): don't build changelog on prerelease branches

By default, `semantic-release` build changelog even for prerelease
branches which looks like duplicated entries to users.

Use a workaround to avoid changelog generation for prerelease branches
by building the configuration in several steps instead of a direct
`module.exports` at the top.

There are no effect on this project since the `branches` configuration
attribute only contains `stable` but can be used for other project
with the only change to declare prerelease `branches`.

* release.config.js: rework the configuration file to conditionnally
  execute `@semantic-release/changelog` and add its assets to the git
  plugin.
parent a444ad26
No related branches found
No related tags found
3 merge requests!25Publish a new release,!24Prepare a new release,!19feat(semantic-release): don't build changelog on prerelease branches
Pipeline #7992 passed
module.exports = { // Build the configuration depending of the environnement
// When using prerelease branches, we don't want changelog to be generated
// See https://github.com/semantic-release/changelog/issues/51#issuecomment-682609394
// Gitlab reference name
const branch = process.env.CI_COMMIT_REF_NAME
const git_assets = []
const config = {
// It must match the name of your repository
branches: 'stable', branches: 'stable',
tagFormat: 'release/${version}', tagFormat: 'release/${version}',
plugins: [ plugins: [
['@semantic-release/commit-analyzer', { ['@semantic-release/commit-analyzer', {
preset: 'angular', preset: 'angular',
releaseRules: './release-rules.js', releaseRules: './release-rules.js',
}], }],
'@semantic-release/release-notes-generator', '@semantic-release/release-notes-generator',
['@semantic-release/changelog', {
changelogFile: 'docs/CHANGELOG.md',
changelogTitle: '# Changelog',
}],
['@semantic-release/git', {
assets: ['docs'],
message: 'chore(release): ${nextRelease.version}\n\n${nextRelease.notes}'
}],
'@semantic-release/gitlab',
], ],
generateNotes: { }
preset: 'angular',
writerOpts: {
// Required due to upstream bug preventing all types being displayed.
// Bug: https://github.com/conventional-changelog/conventional-changelog/issues/317
// Fix: https://github.com/conventional-changelog/conventional-changelog/pull/410
transform: (commit, context) => {
const issues = []
commit.notes.forEach(note => { // Make sure the changelog is generated for release branch
note.title = `BREAKING CHANGES` // exclude any prerelease branches
}) if (!Array.isArray(config.branches)
|| config.branches.some(it => it === branch || (it.name === branch && !it.prerelease))) {
config.plugins.push(
['@semantic-release/changelog', {
changelogFile: 'docs/CHANGELOG.md',
changelogTitle: '# Changelog',
}])
git_assets.push('docs/CHANGELOG.md')
}
config.plugins.push(
['@semantic-release/git', {
assets: git_assets,
message: 'chore(release): ${nextRelease.version}\n\n${nextRelease.notes}'
}],
'@semantic-release/gitlab',
)
// NOTE: Any changes here must be reflected in `CONTRIBUTING.md`. config.generateNotes = {
if (commit.type === `feat`) { preset: 'angular',
commit.type = `Features` writerOpts: {
} else if (commit.type === `fix`) { // Required due to upstream bug preventing all types being displayed.
commit.type = `Bug Fixes` // Bug: https://github.com/conventional-changelog/conventional-changelog/issues/317
} else if (commit.type === `perf`) { // Fix: https://github.com/conventional-changelog/conventional-changelog/pull/410
commit.type = `Performance Improvements` transform: (commit, context) => {
} else if (commit.type === `revert`) { const issues = []
commit.type = `Reverts`
} else if (commit.type === `docs`) {
commit.type = `Documentation`
} else if (commit.type === `style`) {
commit.type = `Styles`
} else if (commit.type === `refactor`) {
commit.type = `Code Refactoring`
} else if (commit.type === `test`) {
commit.type = `Tests`
} else if (commit.type === `build`) {
commit.type = `Build System`
// } else if (commit.type === `chore`) {
// commit.type = `Maintenance`
} else if (commit.type === `ci`) {
commit.type = `Continuous Integration`
} else {
return
}
if (commit.scope === `*`) { commit.notes.forEach(note => {
commit.scope = `` note.title = `BREAKING CHANGES`
} })
if (typeof commit.hash === `string`) { // NOTE: Any changes here must be reflected in `CONTRIBUTING.md`.
commit.shortHash = commit.hash.substring(0, 7) if (commit.type === `feat`) {
} commit.type = `Features`
} else if (commit.type === `fix`) {
commit.type = `Bug Fixes`
} else if (commit.type === `perf`) {
commit.type = `Performance Improvements`
} else if (commit.type === `revert`) {
commit.type = `Reverts`
} else if (commit.type === `docs`) {
commit.type = `Documentation`
} else if (commit.type === `style`) {
commit.type = `Styles`
} else if (commit.type === `refactor`) {
commit.type = `Code Refactoring`
} else if (commit.type === `test`) {
commit.type = `Tests`
} else if (commit.type === `build`) {
commit.type = `Build System`
// } else if (commit.type === `chore`) {
// commit.type = `Maintenance`
} else if (commit.type === `ci`) {
commit.type = `Continuous Integration`
} else {
return
}
if (typeof commit.subject === `string`) { if (commit.scope === `*`) {
let url = context.repository commit.scope = ``
? `${context.host}/${context.owner}/${context.repository}` }
: context.repoUrl
if (url) {
url = `${url}/issues/`
// Issue URLs.
commit.subject = commit.subject.replace(/#([0-9]+)/g, (_, issue) => {
issues.push(issue)
return `[#${issue}](${url}${issue})`
})
}
if (context.host) {
// User URLs.
commit.subject = commit.subject.replace(/\B@([a-z0-9](?:-?[a-z0-9/]){0,38})/g, (_, username) => {
if (username.includes('/')) {
return `@${username}`
}
return `[@${username}](${context.host}/${username})` if (typeof commit.hash === `string`) {
}) commit.shortHash = commit.hash.substring(0, 7)
} }
}
// remove references that already appear in the subject if (typeof commit.subject === `string`) {
commit.references = commit.references.filter(reference => { let url = context.repository
if (issues.indexOf(reference.issue) === -1) { ? `${context.host}/${context.owner}/${context.repository}`
return true : context.repoUrl
} if (url) {
url = `${url}/issues/`
// Issue URLs.
commit.subject = commit.subject.replace(/#([0-9]+)/g, (_, issue) => {
issues.push(issue)
return `[#${issue}](${url}${issue})`
})
}
if (context.host) {
// User URLs.
commit.subject = commit.subject.replace(/\B@([a-z0-9](?:-?[a-z0-9/]){0,38})/g, (_, username) => {
if (username.includes('/')) {
return `@${username}`
}
return false return `[@${username}](${context.host}/${username})`
}) })
}
}
// remove references that already appear in the subject
commit.references = commit.references.filter(reference => {
if (issues.indexOf(reference.issue) === -1) {
return true
}
return commit return false
}, })
return commit
}, },
}, },
}; }
module.exports = config
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment