Jenkins分支无新提交时复用旧构建的实现需求
实现Jenkins流水线无新提交时跳过构建复用结果
以下是针对你的需求修改后的流水线配置,核心思路是对比当前分支最新提交与上一次成功构建的提交哈希,一致则跳过构建并复用历史产物,不一致则执行完整构建:
pipeline { agent { label 'jenkins-agent' } stages { stage('Initialize') { steps { script { def mvn = tool name: 'Maven' def jdk = tool name: 'openjdk-11' env.JAVA_HOME = "${jdk}/amazon-corretto-11.0.18.10.1-linux-x64" env.PATH = "${env.JAVA_HOME}/bin:${mvn}/bin:${env.PATH}" sh 'java -version && mvn -version && printenv' } } } stage('Checkout & Verify Changes') { steps { script { // 尝试拉取目标分支,失败则回退到master try { echo "Check out source code \"${BRANCH}\"" git url: DEFAULT_REPO, branch: BRANCH, credentialsId: gitCredentialsID env.CURRENT_BRANCH = BRANCH } catch (Exception e) { echo 'Check out source code master' git url: DEFAULT_REPO, branch: 'master', credentialsId: gitCredentialsID env.CURRENT_BRANCH = 'master' } // 获取当前分支最新提交哈希 env.LATEST_COMMIT = sh( script: 'git rev-parse HEAD', returnStdout: true ).trim() // 获取上一次成功构建的提交哈希(首次构建则设为空) if (currentBuild.previousSuccessfulBuild) { env.LAST_SUCCESS_COMMIT = currentBuild.previousSuccessfulBuild.buildVariables.get('LATEST_COMMIT', '') } else { env.LAST_SUCCESS_COMMIT = '' } echo "当前分支最新提交: ${env.LATEST_COMMIT}" echo "上一次成功构建提交: ${env.LAST_SUCCESS_COMMIT}" } } } stage('Build') { when { // 当首次构建,或提交哈希不一致时执行构建 anyOf { expression { env.LAST_SUCCESS_COMMIT == '' } expression { env.LATEST_COMMIT != env.LAST_SUCCESS_COMMIT } } } steps { sh 'mvn clean install -pl MyProject -am --fail-never -DskipTests=true' } post { success { // 构建成功后归档产物,供后续复用 archiveArtifacts artifacts: 'MyProject/target/*.jar', fingerprint: true } } } stage('Reuse Previous Build Artifacts') { when { // 提交哈希一致时执行复用逻辑 expression { env.LAST_SUCCESS_COMMIT != '' && env.LATEST_COMMIT == env.LAST_SUCCESS_COMMIT } } steps { echo "当前分支无新提交,复用${currentBuild.previousSuccessfulBuild.number}号构建的产物" // 复制上一次成功构建的归档产物到当前工作目录 copyArtifacts( projectName: currentBuild.projectName, selector: specific("${currentBuild.previousSuccessfulBuild.number}"), filter: 'MyProject/target/*.jar', target: 'MyProject/target/' ) } } } }
关键逻辑说明
- 提交哈希对比:在
Checkout & Verify Changes阶段,通过git rev-parse HEAD获取当前分支最新提交,同时从历史成功构建中读取上次的提交哈希。 - 构建条件判断:
Build阶段通过when条件控制,仅在首次构建或有新提交时执行。 - 产物复用:当无新提交时,进入
Reuse Previous Build Artifacts阶段,使用copyArtifacts插件复制上一次成功构建的归档产物到当前工作目录。 - 产物归档:构建成功后通过
archiveArtifacts归档产物,确保后续复用时有可获取的资源。
注意事项
- 确保Jenkins已安装
Copy Artifact插件(默认可能已安装,若未安装需在插件管理中添加)。 - 首次构建时会执行完整构建并归档产物,后续无新提交的触发会自动复用。
- 若分支切换或有新提交,流水线会自动执行新的构建并更新归档产物。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

