Reputation: 2966
I want to automate the CHANGELOG.md update using nodejs conventional-changelog/standard-version.
I followed this article and from my cli it work as expected, now I want to automate it using GItlab CI pipeline and run the necessary commands when a feature branch is succesfully merged onto the master branch.
Is it possible? If yes, how do I do that? How do I prevent the triggering of an infinite loop of pipelines (since the required commands commit/push onto the master branch)?
Upvotes: 0
Views: 123
Reputation: 51
packages.json
packages.json
:{
"name": "{{ project_key }}",
"version": "{{ project_version }}",
"scripts": {
"release:dry": "semantic-release --dry-run",
"release": "semantic-release"
},
"devDependencies": {
"@commitlint/config-conventional": "^19.5.0",
"@commitlint/prompt-cli": "^19.5.0",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/commit-analyzer": "^13.0.0",
"@semantic-release/git": "^10.0.1",
"@semantic-release/gitlab": "^13.2.1",
"@semantic-release/npm": "^12.0.1",
"@semantic-release/release-notes-generator": "^14.0.1",
"semantic-release": "^24.1.1"
},
"overrides": {
"conventional-changelog-conventionalcommits": ">= 8.0.0"
},
"private": true,
"release": {
"plugins": [
"@semantic-release/changelog",
"@semantic-release/gitlab",
"@semantic-release/npm",
[
"@semantic-release/commit-analyzer",
{
"releaseRules": [
{
"type": "refactor",
"release": "patch"
},
{
"type": "docs",
"release": "patch"
},
{
"type": "test",
"release": "patch"
},
{
"type": "style",
"release": "patch"
},
{
"type": "ci",
"release": "patch"
},
{
"type": "build",
"release": "patch"
},
{
"type": "revert",
"release": "patch"
},
{
"type": "chore",
"release": "patch"
},
{
"type": "sonar",
"release": "patch"
}
]
}
],
[
"@semantic-release/release-notes-generator",
{
"presetConfig": {
"types": [
{
"type": "sonar",
"section": ":mortar_board: Fixed SonarQube issues",
"hidden": false
},
{
"type": "feat",
"section": ":sparkles: Features",
"hidden": false
},
{
"type": "fix",
"section": ":fire: Bug Fixing",
"hidden": false
},
{
"type": "refactor",
"section": ":zap: Refactoring of code",
"hidden": false
},
{
"type": "perf",
"section": ":gift: Performance Improvements",
"hidden": false
},
{
"type": "revert",
"section": ":cyclone: Reverting of code",
"hidden": false
},
{
"type": "ci",
"section": ":tada: CI/CD",
"hidden": false
},
{
"type": "style",
"section": ":rocket: Style",
"hidden": false
},
{
"type": "test",
"section": ":computer: Tests",
"hidden": false
},
{
"type": "docs",
"section": ":book: Documentation",
"hidden": false
},
{
"type": "chore",
"hidden": true
}
]
}
}
],
[
"@semantic-release/git",
{
"assets": [
"package.json",
"CHANGELOG.md"
],
"message": "chore(Release): ${nextRelease.version} \n\n${nextRelease.notes}"
}
]
],
"branches": [
"main",
{
"name": "dev",
"prerelease": true
}
],
"preset": "conventionalcommits"
}
}
And CI Job
.base_release:
image: node:${NODE_VERSION}
before_script:
- git config --global user.email "${GITLAB_TOKEN_USER}@git.example.com"
- git config --global user.name "${GITLAB_TOKEN_USER}"
- |
{
echo "@${CI_PROJECT_ROOT_NAMESPACE}:registry=${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/npm/"
echo "${CI_API_V4_URL#https?}/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=\${CI_JOB_TOKEN}"
} | tee -a .npmrc
- npm i
release:
extends: .base_release
stage: release
needs:
- job: npm build
optional: true
script:
- git tag -l | xargs git tag -d && git fetch --tags
- npm run release
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $GITLAB_USER_LOGIN != $GITLAB_TOKEN_USER
- if: $CI_COMMIT_BRANCH == 'dev' && $GITLAB_USER_LOGIN != $GITLAB_TOKEN_USER
Upvotes: 0
Reputation: 1417
To prevent pipeline from running on the commits/push use skip ci
eg: chore(release): 1.1.2 [skip ci]
I would suggest you to check out semantic release. This package helps with versioning according to conventional commits, creating/updating changelog and handles the skipping pipeline part as well.
Upvotes: 0