Introduction
Still continuing the series of Gitlab CIs & Automations,
The current article will describe how to automate versions
& Releases publishing with semantic-release.
The workflow I decided for my workflow is adapted from a basic Git
workflow like:
Summary
I create my Issue on my Gitlab project, open to branch from the issue, correct inside the branch,
push to dev, the CI/CD deploy onto the dev platform, It fail because "LIFE", I correct inside the branch,
push to dev, version correctly functionnal on dev, merge from dev to master, deploy onto prod, THE END.
So I wanted to be able to automatically publish version & release.
Why ? Because I'm lazy. A computer guy is often lazy.
I want to code and not have to trouble myself to search the last version
number, tag the commit on dev and "et cetera" on master.
It's here that semantic-release software seemed like a good idea,
for a description, here's their Github: https://github.com/semantic-release/semantic-release
How it will works
I will use Angular syntax when publishing my commit,
a CI/CD to launch semantic release with will then detect the commit and create
the tag & release with all the previous commits.
In details
.releaserc.json
{
"plugins": [
["@semantic-release/commit-analyzer", {
"preset": "angular",
"releaseRules": [
{"type": "docs", "scope":"README", "release": "patch"},
{"type": "feat", "scope":"progress", "release": "patch"},
{"type": "feat", "scope":"validated", "release": "minor"}
],
"parserOpts": {
"noteKeywords": ["BREAKING CHANGE", "BREAKING CHANGES"]
}
}],
"@semantic-release/release-notes-generator",
["@semantic-release/changelog", {
"changelogFile": "CHANGELOG.md"
}],
["@semantic-release/git", {
"assets": ["CHANGELOG.md"],
"message": "chore(release): ${nextRelease.version}nn${nextRelease.notes}"
}],
"@semantic-release/gitlab"
],
"branches": [
"master",
"+([0-9])?(.{+([0-9]),x}).x",
{ "name": "dev", "prerelease": "dev"}
]
}
/! Start Warning
The part with semantic-release/changelog & semantic-release/git allows me to update automatically the
CHANGELOG.md and push it to my git repo.
I also noted it generate conflict due to using pre-release branch, so I do not advise to use the CHANGELOG at the same times
that the pre-release option.
Please note that I had to redefine the "message" because semantic-release/git use by default "[skip-ci]" in the message,
Which, alas, blocked my deploy CI/CD. I'm currently asking if there is a better way to do this in https://github.com/semantic-release/git/issues/201
let's see if I can improve it again 🙂
/! End Warning
I redefined the releaseRules because i'm still not fluent with Angular default rules.
I'll update it based on my daily needs, I advise you to start with standard (remove releaseRules)
and adapt to your needs.
.release-ci.yml
release:
image: node:12
stage: release
only:
refs:
- master
- dev
# This matches maintenance branches
- /^(([0-9]+).)?([0-9]+).x/
# This matches pre-releases
- /^([0-9]+).([0-9]+).([0-9]+)(?:-([0-9A-Za-z-]+(?:.[0-9A-Za-z-]+)*))?(?:+[0-9A-Za-z-]+)?$/
script:
- npm install @semantic-release/gitlab
- npm install @semantic-release/git
- npm install @semantic-release/changelog
- npx semantic-release --debug
The CI/CD will automatically install all the deps and work only on main branches.
I needed to fix the node version to node:12 due to it not working on node:12.
.gitlab-ci.yml
And then the Gitlab CI.
include:
- local: '.release-ci.yml'
stages:
- release
Commit linting
In order to use correct commit syntax I also defined a commit linting hook like the following.
.pre-commit-config.yaml
- repo: https://github.com/jorisroovers/gitlint
rev: v0.13.1
hooks:
- id: gitlint
stages: [commit-msg]
It's installed to interact on commit, following the official documentation, you will need to install it like:
pre-commit install --hook-type commit-msg
Please note that I used specifically gitlint because it's in Python, so you can search for the
equivalent in your project language, maybe it exist, example: Node => commitlint.
Don't forget to add the dependence in your requirements-dev.txt
and here you go.