Till startsidan

Conventional commits

En "conventional commit" är ett enkel regelverk för att alla inom teamet ska följa samma åtagande vid en commit. Detta gemensamma regelverk gör det möjligt att bygga automatiska "change logs", möjlighet att hämta ut statistik baserat på TYPE eller SCOPE och skapar förutsättningar för standardiseringar.

Grundförståelse

Vi utgår i grunden från Conventional Commits Länk till annan webbplats. men med lite modifikationer.

En "conventional commit" består av fyra komponenter.

  • TYPE = Använd endast någon av nedan definierade typer av commits
  • SCOPE = Ange den funktion/komponent som ingår i commiten
  • DESCRIPTION = Skriv på engelska i imperfekt
  • BODY = Skriv på svenska i imperfekt
  • FOOTER = Innehåller info om breaking changes och / eller hänvisningar till issues (eller work items i ex. DevOps) med #ID (exempelvis #10000)

Typer av commits

Nedan listas de typer vi använder plus en kort förklaring.

feat = Ny funktionalitet för användare

fix = Åtgärd av bugg för användare

perf = Åtgärd för prestanda

revert = Tillbaka till en föregående commit

docs = Uppdaterad dokumentation

style = Formatering av kod

chore = Nödvändiga ändringar i projektet

refactor = Ombyggnad av befintlig kod

test = Lägga till eller justera tester

build = Justeringar i byggprocessen, dependencies m.m.

ci = Justeringar i Continuous Integration processen

Standard commit

En standard commit innehåller de fyra komponenterna i denna ordning.

TYPE(SCOPE): DESCRIPTION

BODY

FOOTER

OBS! Längden på DESCRIPTION bör inte vara mer än 50 tecken och längden på BODY bör inte överstiga 120 tecken.

Commit för release

En commit som taggas för release ser ut som följande och bör i möjligaste mån göras per automatik, vi använder oss av semantic-release (se mer under Tooling)

chore(release): SEMVER [skip ci]

OBS! SEMVER ska ersättas av aktuellt versionsnummer, ex 3.2.1

Pusha en commit

För VsCode finns ett plugin som fungerar som hjälpmedel för att få med sig type, scope, description, body och footer: Conventional Commits Länk till annan webbplats.. Detta gör det också möjligt att dela scopes i ett repo i en VsCode workspace-fil. Notera att för att emojis ska fungera på bl.a. DevOps krävs inställningen "Emoji Format" att vara inställd till "emoji".

Pushar man via terminal kan man använda nedan git-kommando:

git commit -m "TYPE(SCOPE): DESCRIPTION" -m "BODY" -m "FOOTER"

Skrivregler

Både type och scope skrivs på engelska med gemener.

Description och body skrivs på svenska med initial versal och i övrigt gemener.

Referera issues

För att hänvisa en issue (eller work item i ex. DevOps) skriver man ett hash-tecken följt av dess nummer i footern, exempelvis #10000

Exempel på korrekt skriven commit

Nedan följer ett konkret exempel på en commit som följer vårt gemensamma regelverk

Inline terminalkommando (varje uppdelad -m blir en egen rad):

git commit -m "fix(footer): Fixed non-working mailto link" -m "Länken för mailto hade ett kommatecken för mycket och kunde inte öppnas i mejlklienten" -m "#10000"

Som fulltext (i exempelvis vi / nano, notera radbrytningarna. En tom rad används för att bryta de olika segmenten):

fix(footer): Fixed non-working mailto link

Länken för mailto hade ett kommatecken för mycket och kunde inte öppnas i mejlklienten

\#10000

Notera backslashet i footern för att escape:a hashet så det inte blir en kommentar.

Breaking changes

Om en commit innehåller breaking changes, dvs att andra projekt som är beroende också behöver uppdateras så ska det finnas en "BREAKING CHANGE: " text i FOOTERN.

Exempelvis:

feat(api): renamed field 'name' to 'title'

API-svaret returnerar nu 'title' istället för 'name'

BREAKING CHANGE: I och med ändringen av fältet 'name' till 'title' måste man parera denna ändring i frontend.

Automatiska releaser

En av de främsta fördelarna med att använda sig av Conventional Commits är att det ger förutsättningar för automation. Med verktyg som semantic-release Länk till annan webbplats. kan hela hanteringen av versionering skötas automatiskt.

Automatiska changelogs

Utöver releaser så kan man också få helt automatiska changelogs baserat på githistoriken, och det är därför vi är så pass detaljerade i våra commits med tydliga body-texter.

Tooling

Nedan följer vår rekommenderade setup för våra repos.

semantic-release

I våra repos använder vi semantic-release Länk till annan webbplats. för att automatiskt hantera taggning för releaser.

Detta kombineras med @semantic-release/changelog Länk till annan webbplats. (och semantic-releases inbyggda release-notes-generator) för att automatiskt generera ändringsloggar. Eftersom vi har som mål att erbjuda ändringsloggar som är läsbara för organisationen och inte bara utvecklare har vi även en egen preset för detta: conventional-changelog-regionhalland Länk till annan webbplats.. Denna preset använder commit-body istället för subject i loggen, där vi skriver en mer utförlig beskrivning (se "Exempel på korrekt skriven commit").

Finns ingen commit-body används description som fallback.

För att använda vår preset installerar man den och sedan ställer man in sin semantic-release config med följande parameter för release-notes-generator.

.releaserc:

"@semantic-release/release-notes-generator",

{

"preset": "regionhalland"

}

Vi rekommenderar också Googles plugin till semantic release, @google/semantic-release-replace-plugin Länk till annan webbplats., för att kunna bumpa versionsnummer i samband med semantic-release körningen. På så vis slipper man manuellt uppdatera versionssträngar i projektet, utan de sätts med regex till nästa version, som bestämt av semantic-release.

commitlint

Vi använder oss av commitlint Länk till annan webbplats. för att säkra oss att vi förhåller oss till conventional commits-tänket. Detta kombineras med @commitlint/config-conventional Länk till annan webbplats.

"commitlint": {

"extends": [

"@commitlint/config-conventional"

]

}

husky

Vi använder oss av husky Länk till annan webbplats. i våra repos för att installera en commit-msg hook som automatiskt exekverar commitlint efter man skrivit sin commit.

package.json:

"husky": {

"hooks": {

"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"

}

}

Senast ändrad: