Workaround to handle semantic-release-monorepo
multipublishing
This project provided invaluable experience in understanding how lerna and semantic-release work. Along with this came the realization that the approach needed to be changed. Here's the short note on the evolution of these ideas. Thus, today we suggest using multi-semantic-release as the best alternative:
- Much more robust and predictable.
- Maintainable and maintained.
- Compatible with the latest versions of semrel and its plugins.
- Supports parallel release flow (faster).
- Brings an automatic update of cross-packages dependencies.
- Project is used and supported as part of QIWI in-house development infrastructure (not sure if this is a positive point :-).
Further development of this project seems futile. Anyway, we will regularly apply vulnerability patches for as long as possible. Thank you all for your feedback, PRs, downloads and stars.
- semantic-release does not support
lerna
-based repos akamonorepos
out of box. - semantic-release-monorepo can not release several packages at once: after the first sub-release it appends a new git version tag, so any next run finds no changes.
[Semantic release]: Found 0 commits for package *** since last release
npm i -D semantic-release
npm i -D semantic-release-monorepo
npm i -D semantic-release-monorepo-hooks
and plugins:
{
"devDependencies": {
"@semantic-release/changelog": "^3.0.1",
"@semantic-release/commit-analyzer": "^6.1.0",
"@semantic-release/git": "7.0.5",
"@semantic-release/github": "5.2.1",
"@semantic-release/npm": "5.0.5",
"@semantic-release/release-notes-generator": "7.1.2",
"lerna": "^3.4.3",
"semantic-release": "15.10.6",
"semantic-release-monorepo": "6.1.1",
"semantic-release-monorepo-hooks": "2.6.2",
"semantic-release-plugin-decorators": "^2.0.0"
}
}
const hooks = require('semantic-release-monorepo-hooks')
const output = hooks()
module.exports = {
branch: 'master',
tagFormat: 'v${version}',
prepare: [
'@semantic-release/changelog',
'@semantic-release/npm',
{
'path': '@semantic-release/git',
'message': 'chore(' + output.package + '): release ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}'
}
],
publish: [
'@semantic-release/npm'
],
verifyConditions: [
'@semantic-release/npm',
'@semantic-release/git'
],
monorepo: {
analyzeCommits: [
'@semantic-release/commit-analyzer'
],
generateNotes: [
'@semantic-release/release-notes-generator'
]
}
};
deploy:
provider: script
skip_cleanup: true
script:
- yarn lerna exec --concurrency 1 "npx --no-install semantic-release -e semantic-release-monorepo" && node -e "require('semantic-release-monorepo-hooks').hookAfterAll()"
GH_TOKEN
and GH_USER
must be declared for git push
. See drop_last_tag.sh for details.
Hooks reverts some effects of previous semantic-release
run and returns info map as a result:
{
isModified: true,
isLastModified: false,
isLastRun: false,
total: 5,
processed: 1,
modified: 2,
modifiedPacks: [ '@qiwi/pijma-core', '@qiwi/pijma-desktop' ],
package: '@qiwi/pijma-core',
tag: 'v1.5.0\n',
run: 1
}
Take a look at multi-semantic-release. With --execasync
flag it produces the same effect but in a different way.