Convenção de commits para

versionamento semântico

e lançamentos automatizados

Conteúdo

  • Versionamento semântico
     
  • Commits convencionais
     
  • Automatização de lançamentos

Convenções

Ferramentas

SemVer

Versionamento Semântico

Convenção

Dado um número de versão MAJOR.MINOR.PATCH, incremente a:
 

  1. MAJOR (versão maior):
    quando fizer mudanças incompatíveis na API;

     
  2. MINOR (versão menor):
    quando adicionar funcionalidades mantendo compatibilidade;

     
  3. PATCH (versão de correção):
    quando corrigir falhas mantendo compatibilidade.

Pré-lançamento (pre-release) e metadados de construção (build) são extensões ao formato MAJOR. MINOR . PATCH.

Convenção

0

0

0

.0.

0

0

Convenção

MAJOR

Incompatibilidade na API pública

Convenção

MINOR

Novidade mantendo a compatibilidade

Convenção

PATCH

Correção mantendo a compatibilidade

Convenção

mas...

versões não são para humanos

Conventional Commits

Especificação para dar significado legível às mensagens de commit para humanos e máquinas

Convenção que:

  • Define um conjunto de regras
     
  • Cria um histórico explícito
     
  • Segue o padrão SemVer
     
  • Facilita automatizações

Convenção

Estrutura para mensagem de commit

<tipo>[escopo opcional]: <descrição>

[corpo opcional]

[rodapé(s) opcional(is)]

Convenção

Estrutura para mensagem de commit

  1. fix: soluciona um problema na base de código.
    Se relaciona com PATCH do SemVer.

     
  2. feat: inclui um novo recurso na base de código.
    Se relaciona com MINOR do SemVer.

     
  3. BREAKING CHANGE: quebra a compatibilidade da API.
    Se relaciona com MAJOR do SemVer.

Convenção

0

0

0

.0.

0

0

Convenção

0

0

0

.0.

0

0

Convenção

0

0

0

.0.

0

0

0

0

0

.0.

0

0

Convenção

Exemplo de mensagem de commit

docs: ortografia correta de CHANGELOG

Mensagem de commit sem corpo

0.0.0

Exemplo de mensagem de commit

fix: corrige pequenos erros de digitação no código

veja o ticket para detalhes sobre os erros de digitação corrigidos

Revisado por: Daniel Nass
Refs #133

Mensagem de commit sem escopo, com descrição e referência no rodapé

0.0.0

0.0.1

Exemplo de mensagem de commit

feat: permitir que o objeto de configuração fornecido estenda outras configurações

BREAKING CHANGE: a chave `extends`, no arquivo de configuração, agora é utilizada para estender outro arquivo de configuração

Mensagem de commit com descrição e modificação que quebra a compatibilidade no rodapé

0.0.1

0.1.0

Exemplo de mensagem de commit

feat(lang): adiciona tradução para português brasileiro

Mensagem de commit com escopo

0.1.0

0.2.0

Exemplo de mensagem de commit

feat!: envia email para o cliente quando o produto é enviado

Mensagem de commit com ! para chamar a atenção para quebra a compatibilidade

0.2.0

1.0.0

Exemplo de mensagem de commit

feat(api)!: envia email para o cliente quando o produto é enviado

Mensagem de commit com escopo e ! para chamar a atenção para quebra a compatibilidade

1.0.0

2.0.0

Exemplo de mensagem de commit

chore!: remove suporte para Node 6

BREAKING CHANGE: refatorar para usar recursos JavaScript não disponíveis no Node 6.

Mensagem de commit sem escopo com !  e BREAKING CHANGE no rodapé

2.0.0

3.0.0

feat

feat

fix

feat

feat!

👉

👉

Preciso decorar isso?!

Seria muito bom! Mas não precisa...

Seria muito bom! Mas não precisa...

Nós vamos chegar lá...

tools

Commits

  • commitizen
  • commitlint
  • cz-customizable
  • cz-git | czg

Escrevendo mensagens de commit

npm install -D cz-git
bash

Escrevendo mensagens de commit

{
  "scripts": {

  },
  "config": {
    "commitizen": {
      "path": "node_modules/cz-git"
    }
  }
}
package.json

Escrevendo mensagens de commit

module.exports = {
  messages: {
    type: 'Select the type of change that you\'re committing:',
    scope: 'Denote the SCOPE of this change (optional):',
    customScope: 'Denote the SCOPE of this change:',
    subject: 'Write a SHORT, IMPERATIVE tense description of the change:\n',
    body: 'Provide a LONGER description of the change (optional). Use ...',
    breaking: 'List any BREAKING CHANGES (optional). Use "|" to break ...',
    footerPrefixesSelect: 'Select the ISSUES type of changeList by ...',
    customFooterPrefix: 'Input ISSUES prefix:',
    footer: 'List any ISSUES by this change. E.g.: #31, #34:\n',
    confirmCommit: 'Are you sure you want to proceed with the commit above?'
  },
  types: [
    
  ],
}
cz.config.js

Escrevendo mensagens de commit

module.exports = {
  messages: {
    
  },
  types: [
    { value: 'feat',  name: 'feat:     A new feature' },
    { value: 'fix',   name: 'fix:      A bug fix' },
    { value: 'docs',  name: 'docs:     Documentation only changes' },
    { value: 'style', name: 'style:    Changes that do not affect the...' },
    { value: 'refactor', name: 'refactor: A code change that neither...' },
    { value: 'test',  name: 'test:     Adding missing tests or...' },
    { value: 'build', name: 'build:    Changes that affect the build...' },
    { value: 'ci',    name: 'ci:       Changes to our CI configuration..' },
    { value: 'chore', name: 'chore:    Other changes that don\'t...' },
  ],
}
cz.config.js

Escrevendo mensagens de commit

const { readdirSync } = require('fs');
const { resolve } = require('path');

const packages = readdirSync(resolve(__dirname, 'packages'));

module.exports = {
  messages: {
    
  },
  types: [

  ],
  scopes: [...packages],
}
cz.config.js

Escrevendo mensagens de commit

{
  "scripts": {
    "commit": "git-cz"
  },
  "config": {
    "commitizen": {
      "path": "node_modules/cz-git",
      "czConfig": "./cz.config.js"
    }
  }
}
package.json

Releases

  • semantic-release
  • standard-version
  • release-please
  • nx release

Releases

nx release
bash

Releases

nx release [specifier]
bash

Releases

nx release version [specifier]
bash

Releases

nx release changelog [version]
bash

Releases

nx release publish
bash

Releases

{
  "release": {
    "projects": ["packages/*"]
  }
}
nx.json

Releases

nx release --first-release --dry-run
bash

Releases

{
  "release": {
    "releaseTagPattern": "release/{version}",
    "git": {
      "commitMessage": "chore(release): {version}"
    }
  }
}
nx.json

Releases

{
  "release": {
    "projectsRelationship": "independent"
  }
}
nx.json

Releases

{
  "release": {
    "releaseTagPattern": "release/{projectName}/{version}"
  }
}
nx.json

Releases

{
  "release": {
    "changelog": {
      "projectChangelogs": true
    }
  }
}
nx.json

Releases

{
  "release": {
    "version": {
      "conventionalCommits": true
    }
  }
}
nx.json

Releases



import { releaseChangelog, releasePublish, releaseVersion } from 'nx/release';
import * as yargs from 'yargs';

(async () => {
  const options = await yargs
    .version(false) // don't use the default meaning of version in yargs
    .option('version', {
      description:
        'Explicit version specifier to use, if overriding conventional commits',
      type: 'string',
    })
    .option('dryRun', {
      alias: 'd',
      description:
        'Whether or not to perform a dry-run of the release process, defaults to true',
      type: 'boolean',
      default: true,
    })
    .option('verbose', {
      description:
        'Whether or not to enable verbose logging, defaults to false',
      type: 'boolean',
      default: false,
    })
    .parseAsync();

  const { workspaceVersion, projectsVersionData } = await releaseVersion({
    specifier: options.version,
    dryRun: options.dryRun,
    verbose: options.verbose,
  });

  await releaseChangelog({
    versionData: projectsVersionData,
    version: workspaceVersion,
    dryRun: options.dryRun,
    verbose: options.verbose,
  });

  // The returned number value from releasePublish will be zero if all projects are published successfully, non-zero if not
  const publishStatus = await releasePublish({
    dryRun: options.dryRun,
    verbose: options.verbose,
  });
  process.exit(publishStatus);
})();
nx.json

Git Flow

Trunk Based

Convenção de commits para versionamento semântico e lançamentos automatizados

By Guilherme Siquinelli

Convenção de commits para versionamento semântico e lançamentos automatizados

  • 220