Jenkins Git插件未拉取子模块提交,子模块变更未显示在构建变更日志
结论
原生Jenkins GitSCM插件不支持直接将子模块内部的提交记录纳入构建变更日志。你当前配置中开启的recursiveSubmodules、trackingSubmodules参数仅控制子模块的拉取更新逻辑,不涉及子模块内部提交的变更日志抓取。
可行替代解决方案
- 方案1:自定义脚本抓取子模块变更追加到构建展示位
在checkout步骤完成后,新增Groovy脚本对比本次构建与上一次成功构建的子模块commit差异,手动抓取子模块提交记录,追加到构建描述或自定义变更日志展示区域,参考实现代码:// checkout步骤执行完成后运行该段逻辑 def job = Jenkins.instance.getItemByFullName(env.JOB_NAME) def lastSuccessBuild = job.getLastSuccessfulBuild() if (lastSuccessBuild) { // 读取上一次构建保存的子模块commit哈希映射 def prevSubmoduleCommits = lastSuccessBuild.buildVariables.getOrDefault('SUBMODULE_COMMIT_MAP', [:]) def currSubmoduleCommits = [:] // 读取当前所有子模块的名称和对应commit哈希 sh 'git submodule foreach --quiet \'echo "$name $sha1"\' > .submodule_commits.tmp' def submoduleLines = readFile('.submodule_commits.tmp').trim().split('\n') submoduleLines.each { line -> def (submoduleName, currSha) = line.split() currSubmoduleCommits[submoduleName] = currSha // 对比两次构建的子模块commit,有差异则抓取提交日志 if (prevSubmoduleCommits[submoduleName] != currSha) { def subChangeLog = sh( script: "cd ${submoduleName} && git log --pretty=format:'%h | %s | 提交人:%an' ${prevSubmoduleCommits[submoduleName]}..${currSha}", returnStdout: true ).trim() if (subChangeLog) { // 将子模块变更追加到构建描述中展示 currentBuild.description += """ <br> <b>子模块【${submoduleName}】变更记录:</b><br> ${subChangeLog.replace('\n', '<br>')} <br> """ } } } // 保存本次子模块commit映射到环境变量,供下次构建对比使用 env.SUBMODULE_COMMIT_MAP = currSubmoduleCommits.toString() } - 方案2:使用Multiple SCMs插件统一收集变更
安装Jenkins的Multiple SCMs插件,将父仓库和所有子模块都作为独立的Git仓库配置到SCM列表中,每个子模块配置对应的仓库地址、拉取到本地的相对路径,插件会自动合并所有配置仓库的变更记录到构建的官方变更日志中。该方案适合子模块数量少且变动不频繁的场景,需要为每个子模块单独配置访问凭证。
内容的提问来源于stack exchange,提问作者MiltonTS
相关产品推荐
相关产品推荐

