#conventional-commits #semver #git-commit #commit #conventional #semantic #versioning

app conventional_commits_next_version

一个基于从先前的版本以来常规提交计算下一个语义版本的、不依赖于工具和语言的实用工具。支持单仓库。

21个稳定版本 (5个主要版本)

6.0.1 2023年11月17日
6.0.0 2022年2月13日
5.0.0 2022年2月13日
4.0.0 2021年7月11日
1.1.0 2020年6月15日

225解析器实现

每月下载 39

AGPL-3.0

135KB
2K SLoC

Rust 1.5K SLoC // 0.0% comments Gherkin (Cucumber) 401 SLoC Python 181 SLoC // 0.1% comments

常规提交下一个版本

crates.io Pipeline Status Conventional Commits License

一个基于从先前的版本以来常规提交计算下一个语义版本的、不依赖于工具和语言的实用工具。支持单仓库。

为什么使用常规提交下一个版本?

  • 工具和语言无关 - 对于输入命令行参数是利用的,没有内置的功能仅解析工具或特定语言的文件。
  • 无依赖 - 提供了二进制下载,消除了对下载工具或解释性语言的依赖。
  • 单仓库支持 - 支持单仓库的使用,只使用更改指定目录的提交。
  • 非代码检查器 - 对于常规提交规范的小偏差,仍然接受为有效输入,因为这不是代码检查器(但我们建议您使用 常规提交代码检查器)。
  • 灵活 - 当遇到非常规提交时,会忽略它们,并继续计算。

内容

用法

常规提交下一个版本可以操作存储库历史中的Git提交范围,或者通过标准输入提供的提交消息。要由标准输入提供提交消息,简单添加标志 --from-stdin,并将从标准输入读取。否则,要指定提交范围,可以添加 --from-commit-hash <commit-hash>--from-reference <reference> 参数。提交范围从指定的提交开始,到包含 HEAD 为止。

符合 Conventional Commits v1.0.0 规范的任何提交都将用于计算下一个语义版本,基于通过命令行参数 --from-version <版本> 提供的初始语义版本。

唯一必需的参数是 --from-version <版本> 以及以下参数之一:--from-stdin--from-commit-hash <提交哈希>--from-reference <引用>

下一个语义版本可以使用多种计算模式进行计算。目前有两种模式:连续模式和批量模式。

用法 - 连续模式

在连续模式下,根据时间顺序,将 Conventional Commits 规范中的每个 Git 提交应用于语义版本计算。

连续模式是默认模式,因此不需要提供额外的标志或配置。

例如:

git clone https://github.com/yargs/yargs.git
cd yargs
git checkout 6014e39bca3a1e8445aa0fb2a435f6181e344c45
RUST_LOG=trace conventional_commits_next_version --from-commit-hash c36c571e4e15dfe26be1d919e4991fb6ab6ed9fd --from-version 15.2.0

使用环境变量 RUST_LOG 可以启用更详细的日志记录,这样我们就可以看到连续模式的逻辑。

DEBUG conventional_commits_next_version_lib::commits::commit > "fix: address ambiguity between nargs of 1 and requiresArg (#1572)\n\n" matches a patch Semantic Versioning increment commit message.

从日志中我们可以看到提交 a5edc328ecb3f90d1ba09cfe70a0040f68adf50a 具有类型为 fix 的 Conventional Commits。修复类型将导致通过 --from-version 提供的初始语义版本从 15.2.0 增加到 15.2.1

DEBUG conventional_commits_next_version_lib::commits::commit > "feat(yargs-parser): introduce single-digit boolean aliases (#1576)\n\n" matches a minor Semantic Versioning increment commit message.

从日志中我们可以看到提交 3af7f04cdbfcbd4b3f432aca5144d43f21958c39 具有类型为 feat 的 Conventional Commits。遇到的 feat 类型将导致从 15.2.1 增加到 15.3.0 的次版本号。

DEBUG conventional_commits_next_version_lib::commits::commit > "feat: add usage for single-digit boolean aliases (#1580)\n\n" matches a minor Semantic Versioning increment commit message.

从日志中我们可以看到提交 6014e39bca3a1e8445aa0fb2a435f6181e344c451 具有类型为 feat 的 Conventional Commits。feat 类型将次版本号从 15.3.0 增加到 15.4.0

没有更多的 Conventional Commits 会增加语义版本,因此计算的语义版本将打印到标准输出。

15.4.0

用法 - 批量模式

在批量模式下,由所有提交中的 Conventional Commits 类型确定的最大的语义版本增量是唯一应用的增量。

可以通过 --calculation-mode "批量" 参数选择批量模式。

例如:

git clone https://github.com/yargs/yargs.git
cd yargs
git checkout 6014e39bca3a1e8445aa0fb2a435f6181e344c45
RUST_LOG=trace conventional_commits_next_version --calculation-mode "Batch" --from-commit-hash c36c571e4e15dfe26be1d919e4991fb6ab6ed9fd --from-version 15.2.0

使用环境变量 RUST_LOG 可以看到更详细的日志,以了解批量模式如何不同。

DEBUG conventional_commits_next_version_lib::commits::commit > "feat(yargs-parser): introduce single-digit boolean aliases (#1576)\n\n" matches a minor Semantic Versioning increment commit message.
DEBUG conventional_commits_next_version_lib::commits::commit > "feat: add usage for single-digit boolean aliases (#1580)\n\n" matches a minor Semantic Versioning increment commit message.

最大的增量是一个次版本号的语义版本增量,因为有两个提交 3af7f04cdbfcbd4b3f432aca5144d43f21958c396014e39bca3a1e8445aa0fb2a435f6181e344c45 的 Conventional Commits 类型为 feat。次版本号的语义版本增量将初始语义版本从 15.2.0 增加到 15.3.0,然后打印到标准输出。

15.3.0

用法 - 额外参数

可以通过传递额外的命令行标志来更改下一个语义版本的计算内容和方式。

标志
--monorepo 下一个语义版本仅从修改与提供的正则表达式匹配的文件的提交中计算,使您能够在单仓库中使用。
--git-history-mode 遍历Git提交历史时使用的模式,以收集用于计算下一个语义版本的Git提交信息。
--calculation-mode 用于计算下一个语义版本的提交范围的计算模式。
--current-version 断言此语义版本等于或大于计算出的语义版本。计算出的语义版本不会打印到标准输出。如果断言不成立,则程序将退出并返回非零退出代码。

用法 - Git环境变量

在查找仓库时,会尊重Git环境变量。当设置${GIT_DIR}时,它具有优先级,并且常规提交下一个版本开始在该目录中查找仓库。如果没有设置${GIT_DIR},常规提交下一个版本从当前目录开始查找仓库。

用法 - 日志记录

使用crate pretty_env_loggerlog 提供日志记录。可以使用环境变量 RUST_LOG 来设置日志级别。有关更详细的文档,请参阅 https://crates.io/crates/pretty_env_logger

CICD 示例

GitLab CI Rust 项目示例

通过 Cargo

有关通过Cargo安装的更多详细信息,请参阅 通过Cargo编译

注意 - 此示例下载了最新的 6.* 版本。

conventional-commits-next-version-checking:
    stage: conventional-commits-next-version-checking
    image: rust
    before_script:
        - cargo install conventional_commits_next_version --version ^6
    script:
        # Get current version.
        - current_version=$(grep "^version = \"[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*\"$" "Cargo.toml" | cut -d '"' -f 2)
        # Get latest tag.
        - latest_tag=$(git tag --sort=committerdate | tail -1)
        # Check current vs expected.
        - /usr/local/cargo/bin/conventional_commits_next_version --calculation-mode "Batch" --from-reference "${latest_tag}" --from-version "${latest_tag}" --current-version "${current_version}"
    rules:
        - if: $CI_MERGE_REQUEST_ID

通过二进制下载

有关二进制下载的更多详细信息,请参阅 下载二进制文件

注意 - 此示例下载了版本 6.0.0

conventional-commits-next-version-checking:
    stage: conventional-commits-next-version-checking
    image: rust
    before_script:
        - wget -q -O tmp.zip "https://gitlab.com/DeveloperC/conventional_commits_next_version/-/jobs/artifacts/bin-6.0.0/download?job=release-binary-compiling-x86_64-linux-musl" && unzip tmp.zip && rm tmp.zip
    script:
        # Get current version.
        - current_version=$(grep "^version = \"[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*\"$" "Cargo.toml" | cut -d '"' -f 2)
        # Get latest tag.
        - latest_tag=$(git tag --sort=committerdate | tail -1)
        # Check current vs expected.
        - ./conventional_commits_next_version --calculation-mode "Batch" --from-reference "${latest_tag}" --from-version "${latest_tag}" --current-version "${current_version}"
    rules:
        - if: $CI_MERGE_REQUEST_ID

Git Hooks Rust 项目示例

一个示例 commit-msg Git钩子,用于检查由于提交消息而是否需要增加Rust项目的语义版本。

#!/usr/bin/env bash

set -o errexit
set -o pipefail

commit_message=$(cat "${1}")

# Get current version in the commit to be made.
current_version=$(grep "^version = \"[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*\"$" "Cargo.toml" | cut -d '"' -f 2)
# Get latest version on the remote HEAD.
head_version=$(git show remotes/origin/HEAD:Cargo.toml | grep "^version = \"[0-9][0-9]*.[0-9][0-9]*.[0-9][0-9]*\"$" "Cargo.toml" | cut -d '"' -f 2)

# Check current commits version vs expected because of the new commit's message.
echo "${commit_message}" | "${HOME}/.cargo/bin/conventional_commits_next_version" --from-stdin --from-version "${head_version}" --current-version "${current_version}"

下载二进制文件

提供可下载的静态链接编译的二进制文件。访问https://gitlab.com/DeveloperC/conventional_commits_next_version/-/releases上的发行页面,以查看所有发行版,发行说明中包含各种架构的二进制文件下载链接。

如果您不相信提供的二进制文件,另一种选择是自行编译并在远程下载它,这样您的CICD等就可以下载它。

通过本地仓库编译

在本地检出代码仓库,切换到仓库目录,然后通过Cargo构建。使用--release标志可以生成优化的二进制文件,但编译时间更长。

git clone [email protected]:DeveloperC/conventional_commits_next_version.git
cd conventional_commits_next_version/
cargo build --release

编译的二进制文件位于target/release/conventional_commits_next_version

通过 Cargo 编译

Cargo是Rust包管理器,install子命令从crates.io获取,然后在本地编译二进制文件,将编译的二进制文件放置在${HOME}/.cargo/bin/conventional_commits_next_version

cargo install conventional_commits_next_version

默认情况下,在执行时安装最新版本。您可以使用--version参数指定要安装的特定版本。对于CICD等某些环境,您可能想锁定版本。

例如:

cargo install conventional_commits_next_version --version 6.0.0

与其锁定到特定版本,您还可以指定主版本或次要版本。

例如:

cargo install conventional_commits_next_version --version ^6

将下载最新的6.*版本,无论它是6.0.2还是6.2.0

单元测试

单元测试套件有几个参数化测试,用于测试Conventional Commits v1.0.0格式的解析。使用Cargo设置和运行所有单元测试。

cargo test

端到端测试

由于存在各种进程外依赖项,为了确保正确性,项目使用Behave框架(https://github.com/behave/behave)的端到端行为驱动测试套件。

要运行测试套件,您需要

  • 编译Conventional Commits Next Version二进制文件。
  • 安装Python3。
  • 安装Behave。
  • 执行Behave。

注意 - 您不能使用--release,因为测试套件使用target/debug/conventional_commits_next_version

cargo build
cd conventional_commits_next_version/end-to-end-tests/
virtualenv -p python3 .venv
source .venv/bin/activate
pip3 install -r requirements.txt
behave

问题/功能请求

要报告问题或请求新功能,请使用https://gitlab.com/DeveloperC/conventional_commits_next_version/-/issues

依赖项

~15MB
~341K SLoC