首次编写Jenkins Pipeline脚本求助:多分支合并后触发构建
完整Jenkins Pipeline脚本实现你的分支合并+自动构建需求
嘿,我帮你把这个Pipeline脚本补全并优化,完美适配你说的两个团队分支合并到main再构建的需求!先给你完整的脚本,再一步步拆解说明:
pipeline { agent any environment { // 这里定义你的两个团队分支名称,根据实际情况修改 TEAM_A_BRANCH = 'teamA-feature' TEAM_BRANCH = 'teamB-feature' MAIN_BRANCH = 'main' // 仓库URL,也可以从checkout步骤里直接引用 REPO_URL = 'git@your-repo-url.git' } triggers { // 每隔5分钟检查一次分支提交,有更新就触发Pipeline pollSCM('H/5 * * * *') // 如果用GitHub/GitLab,也可以换成webhook触发,比如githubPush() } stages { stage('Initialize: Pull Latest Code') { steps { script { // 拉取main和两个团队分支的最新代码 checkout([$class: 'GitSCM', branches: [[name: '*/main'], [name: "*/${TEAM_A_BRANCH}"], [name: "*/${TEAM_BRANCH}"]], userRemoteConfigs: [[url: REPO_URL]], changelog: true, poll: true ]) } } } stage('Pre-Merge Check: Verify Branch Status') { steps { script { // 检查两个团队分支是否都有比main新的提交(可选,确保两边都完成开发) def teamACommits = sh(script: "git log --oneline ${MAIN_BRANCH}..${TEAM_A_BRANCH} | wc -l", returnStdout: true).trim() def teamBCommits = sh(script: "git log --oneline ${MAIN_BRANCH}..${TEAM_BRANCH} | wc -l", returnStdout: true).trim() if (teamACommits == '0' || teamBCommits == '0') { error("⚠️ 团队分支没有新提交:Team A分支新增提交数${teamACommits},Team B分支新增提交数${teamBCommits},请确认两个分支都完成开发后再触发!") } echo "✅ 两个团队分支都有新提交,可以开始合并流程" } } } stage('Merge Team Branches to Main') { steps { script { // 切换到main分支并拉取最新代码 sh "git checkout ${MAIN_BRANCH}" sh "git pull origin ${MAIN_BRANCH}" // 合并Team A分支到main,冲突时终止流程(避免自动处理出问题) try { sh "git merge --no-ff ${TEAM_A_BRANCH} -m 'Merge Team A feature branch to main'" } catch (Exception e) { error("❌ 合并Team A分支到main时出现冲突,请手动解决冲突后重新触发Pipeline!") } // 合并Team B分支到main try { sh "git merge --no-ff ${TEAM_BRANCH} -m 'Merge Team B feature branch to main'" } catch (Exception e) { error("❌ 合并Team B分支到main时出现冲突,请手动解决冲突后重新触发Pipeline!") } // 推送合并后的main分支回远程仓库 sh "git push origin ${MAIN_BRANCH}" echo "✅ 两个团队分支已成功合并到main分支并推送" } } } stage('Build After Merge') { steps { script { // 替换成你的实际构建命令,比如maven、npm、docker build等 echo "🚀 开始构建main分支..." // 示例:Maven构建 // sh "mvn clean package -DskipTests" // 示例:Node.js构建 // sh "npm install && npm run build" echo "✅ 构建完成!" } } } } post { success { echo "🎉 整个Pipeline流程执行成功!" } failure { echo "❌ Pipeline执行失败,请查看日志排查问题" } } }
关键细节说明
- 触发方式:我用了
pollSCM做定时检查,如果你用GitHub/GitLab,换成对应的webhook触发器(比如githubPush())能更实时触发Pipeline。 - 分支自定义:你可以在
environment块里修改团队分支的名称,完全匹配你们的分支命名规则。 - 冲突处理:脚本遇到合并冲突会直接终止,这是因为自动处理冲突容易引发代码问题,建议手动解决后再重新触发。如果有固定冲突解决策略,也可以改成
git merge --no-ff -X theirs ${TEAM_A_BRANCH}(强制用分支代码覆盖),但不推荐随意使用。 - 权限注意:确保Jenkins运行用户有仓库的读写权限(比如配置SSH密钥),不然拉取和推送代码会失败。
- 预合并检查:
Pre-Merge Check是可选阶段,用来避免其中一个团队分支还没开发完就合并的情况,不需要的话可以直接删掉这个stage。
内容的提问来源于stack exchange,提问作者Free23
相关产品推荐
相关产品推荐

