Gitlab CI实现合并feature到master时自动更新CHANGELOG及防循环方案
借助conventional-changelog/standard-version在Gitlab CI自动更新CHANGELOG的实现方案
是否可行?
完全可行。Gitlab CI支持在分支合并事件触发流水线执行自定义脚本,结合standard-version的自动化版本管理能力,能实现CHANGELOG.md自动更新、版本标签生成及代码推送的全流程自动化。
具体实现步骤
1. 配置项目依赖
- 确保项目已安装
standard-version,若未安装,本地执行npm install --save-dev standard-version,并提交更新后的package.json和package-lock.json到仓库。 - 在
package.json的scripts字段中添加版本更新命令:"scripts": { "release": "standard-version" }
2. 编写Gitlab CI配置文件
在项目根目录创建.gitlab-ci.yml,配置仅在master分支合并时触发的流水线任务:
release: stage: deploy only: - master except: - tags # 排除标签触发的流水线,避免循环 before_script: - npm install # 安装项目依赖 script: # 配置CI提交代码的身份信息 - git config --global user.name "Gitlab CI Bot" - git config --global user.email "ci-bot@your-domain.com" - npm run release # 执行版本更新、CHANGELOG生成 # 使用PAT推送代码和标签(需提前配置CI变量) - git push https://${GITLAB_TOKEN}@gitlab.com/your-username/your-project.git master --follow-tags
3. 配置CI推送权限
- 登录Gitlab,进入项目
Settings -> CI/CD -> Variables,添加名为GITLAB_TOKEN的变量,值为拥有仓库写入权限的个人访问令牌(PAT),权限勾选write_repository。 - 若使用Gitlab内置的
CI_JOB_TOKEN,需在Settings -> Repository -> Protected branches中设置master分支允许CI推送。
避免流水线无限循环的方法
- 排除标签触发:在CI配置中添加
except: - tags,standard-version会生成版本标签,推送标签后若不排除会重复触发流水线。 - 提交信息加跳过标记:修改
standard-version的提交模板,让CI生成的版本提交带上[skip ci],Gitlab会自动跳过该提交的流水线触发。项目根目录创建或修改.versionrc:{ "commitMessageFormat": "chore(release): v{{currentTag}} [skip ci]" } - 双重触发限制:结合
only: master和提交信息的[skip ci],从触发条件和提交标记两层避免循环。
内容的提问来源于stack exchange,提问作者fudo
相关产品推荐
相关产品推荐

