Jenkins中使用checkout scm能否不检出仓库就获取Git提交信息?
Jenkins无需checkout大仓库获取Git提交信息方案
方案1:直接读取Jenkins内置元数据(优先推荐,无任何仓库拉取开销)
Jenkins Git插件在触发构建时已经提前拉取了本次构建关联的所有提交元数据,不需要执行checkout scm就可以直接通过内置变量取值,脚本式流水线示例如下:
node { // 直接读取scm对象的预加载提交属性 def commitId = scm.lastBuiltRevision.getSha1String() def fullCommitMsg = scm.lastBuiltRevision.getCommit().getFullMessage() def shortCommitMsg = scm.lastBuiltRevision.getCommit().getShortMessage() def authorName = scm.lastBuiltRevision.getCommit().getAuthorName() def authorEmail = scm.lastBuiltRevision.getCommit().getAuthorEmail() def commitTimestamp = scm.lastBuiltRevision.getCommit().getTime() // 如需获取本次构建的文件变更列表,读取currentBuild内置属性即可 def changedFiles = [] currentBuild.changeSets.each { cs -> cs.items.each { entry -> changedFiles.add("${entry.editType.name}: ${entry.path}") } } echo "提交ID: ${commitId}" echo "提交信息: ${fullCommitMsg}" echo "提交人: ${authorName} <${authorEmail}>" echo "变更文件列表: ${changedFiles.join('\n')}" }
该方案完全不依赖Git客户端,也不会产生任何仓库拉取流量,大仓库场景下执行效率最高。
方案2:浅拉取提交元数据(适用于需要自定义Git查询的场景)
如果内置元数据无法满足你的需求(比如需要查询提交diff、和历史版本的比对信息等),可以通过只拉取目标提交的元数据、不检出完整文件的方式实现,开销极低:
node { // 创建临时目录操作,避免污染工作区 dir('git-temp') { sh 'git init -q' sh 'git remote add origin 你的Git仓库地址' // 仅拉取本次触发构建的提交,深度为1,不拉取其他历史 sh "git fetch --depth 1 origin ${env.GIT_COMMIT}" // 自定义查询提交信息 def commitMsg = sh(script: 'git log --pretty=format:"%B" FETCH_HEAD -1', returnStdout: true).trim() def diffContent = sh(script: 'git show FETCH_HEAD', returnStdout: true).trim() echo "提交信息: ${commitMsg}" echo "提交diff: ${diffContent}" } // 操作完成后清理临时目录 deleteDir() }
注:
env.GIT_COMMIT是Jenkins触发Git构建时自动注入的环境变量,无需手动赋值即可直接使用。
内容的提问来源于stack exchange,提问作者RyanMeany
相关产品推荐
相关产品推荐

