如何在Bitbucket Pipeline中最优实现自动版本号管理
流水线语义化版本号自动管理方案
完全可以实现基于分支识别、提交标签规则的语义化版本号自动递增,适配你们团队在用的1.0.0格式规范,具体实现逻辑和修改后的脚本如下:
前置约定(需先和团队统一)
先确定版本递增规则和提交/分支标记规范:
- 主版本号(MAJOR,第一位):提交信息包含
BREAKING CHANGE、或提交前缀带!、或源分支为major/开头时递增,原有次版本、修订号归零 - 次版本号(MINOR,第二位):提交信息带
feat:前缀、或源分支为feature/开头时递增,原有修订号归零 - 修订号(PATCH,第三位):提交信息带
fix:/perf:前缀、或源分支为hotfix/开头时递增
修改后的自动版本号Shell脚本
git pull --rebase origin dev npm install -g json # 提取当前package.json的现有版本号,拆分出MAJOR/MINOR/PATCH currentVersion=$(json -f package.json version) IFS='.' read -r MAJOR MINOR PATCH <<< "$currentVersion" # 识别合并源分支(如果是PR合并场景,多数CI工具会自带源分支环境变量,比如GitLab的CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,GitHub的GITHUB_HEAD_REF,此处写通用提取逻辑示例) sourceBranch=$(git reflog | grep -o 'merge [^ ]*' | head -n 1 | awk '{print $2}') # 提取上次版本提交到当前HEAD的所有提交信息 lastVersionCommit=$(git log --grep="\[skip ci\]" --pretty=format:"%h" -n 1) commitLogs=$(git log "$lastVersionCommit"..HEAD --pretty=format:"%s") # 按优先级判断要递增的版本位 bumpLevel="" # 先判断提交信息的最高优先级标记 if echo "$commitLogs" | grep -q "BREAKING CHANGE\|^.*!:"; then bumpLevel="major" elif echo "$commitLogs" | grep -q "^feat:"; then bumpLevel="minor" elif echo "$commitLogs" | grep -q "^fix:\|^perf:"; then bumpLevel="patch" # 提交信息没匹配到标记的话,再用分支名规则判断 elif echo "$sourceBranch" | grep -q "^major/"; then bumpLevel="major" elif echo "$sourceBranch" | grep -q "^feature/"; then bumpLevel="minor" elif echo "$sourceBranch" | grep -q "^hotfix/"; then bumpLevel="patch" # 都没匹配到默认递增修订号,也可以根据团队需求调整为不更新直接退出 else bumpLevel="patch" fi # 执行版本递增 if [ "$bumpLevel" = "major" ]; then MAJOR=$((MAJOR + 1)) MINOR=0 PATCH=0 elif [ "$bumpLevel" = "minor" ]; then MINOR=$((MINOR + 1)) PATCH=0 elif [ "$bumpLevel" = "patch" ]; then PATCH=$((PATCH + 1)) fi newVersion="$MAJOR.$MINOR.$PATCH" json -I -f package.json -e "this.version=\"$newVersion\"" git add package.json git commit -m "[skip ci] bump version to $newVersion" git push origin dev
注意事项
- 如果你用的是标准CI工具(GitLab CI/GitHub Action等),可以直接用平台自带的环境变量获取合并源分支,不需要自己用reflog提取,准确性更高
- 建议把版本更新逻辑只配置在合并请求合入的触发事件中,避免开发分支直接push时误更新版本
- 提交前缀规则可以参考通用的提交规范,和团队统一即可,不需要完全照搬上面的示例
内容的提问来源于stack exchange,提问作者Tchiteu Abloh
相关产品推荐
相关产品推荐

