如何创建Master+PR分支并执行测试?Jenkins新手流水线构建需求
嘿,作为Jenkins老玩家,我来一步步帮你搞定这个需求——刚好我之前也给团队配置过类似的流水线,新手也能跟着一步步走~
实现PR批准后的自动测试与合并流水线
一、先搞懂:如何创建Master+PR的临时分支(两种方式选其一)
其实没必要手动提前创建,流水线里就能自动搞定,分两种场景:
- 本地合并(推荐):直接在Jenkins的工作空间里拉取Master和PR分支,把PR代码合并到Master的本地副本,直接在这个合并后的代码上跑测试,不用推到远程,省资源还高效
- 远程临时分支:如果需要留存这个合并后的分支供后续排查问题,可以推一个带PR编号的临时分支到远程,比如
temp-master-pr-${PR_NUMBER}
本地合并的命令(流水线里会自动执行)
# 拉取最新的Master分支 git checkout master git pull origin master # 拉取PR对应的分支(用PR编号直接拉取,不用手动找分支名) git fetch origin pull/${PR_NUMBER}/head:pr-branch # 切换回本地Master,合并PR分支(--no-ff保留合并记录) git checkout master git merge --no-ff pr-branch
推远程临时分支的命令(可选)
如果需要远程留存,合并后加这两步:
# 创建临时分支 git checkout -b temp-master-pr-${PR_NUMBER} # 推送到远程仓库 git push origin temp-master-pr-${PR_NUMBER}
二、Jenkins新手友好的流水线配置步骤
1. 先装必备插件
打开Jenkins的「插件管理」,搜索安装以下插件(都是官方维护的,靠谱):
- Pipeline:核心流水线插件,支持用Jenkinsfile定义流程
- GitHub Integration Plugin(用GitLab的话换GitLab Plugin):让Jenkins能和代码平台交互,获取PR信息、触发流水线
- Credentials Binding Plugin:安全存储代码仓库的账号/SSH密钥,避免明文暴露
- Email Extension Plugin(可选):测试失败或合并成功后发邮件通知开发者
2. 代码平台配置(以GitHub为例)
- 给你的GitHub仓库加Webhook:地址填
http://你的Jenkins地址/github-webhook/,触发事件选「Pull Request」相关的(比如打开、同步、评审) - 在Jenkins里加GitHub凭证:用个人访问令牌(要有仓库读写权限),给凭证起个ID,后续流水线会用到
3. 核心流水线代码(Jenkinsfile)
把这个文件放到你的代码仓库根目录,然后在Jenkins里创建「流水线」类型的任务,选择「从SCM拉取Jenkinsfile」,填好仓库地址和刚才的凭证ID就行。
pipeline { agent any // 用任意可用的Jenkins节点,也可以指定特定节点 environment { // 替换成你的仓库地址和Jenkins里的凭证ID REPO_URL = 'git@github.com:你的用户名/你的仓库.git' CRED_ID = 'github-ssh-凭证ID' PR_NUMBER = "${env.CHANGE_ID}" // GitHub插件自动注入的PR编号变量 } triggers { // 触发条件:PR有评审动作(比如有人批准) githubPullRequest() } stages { stage('检查PR是否有LGTM批准') { steps { script { // 获取PR的评审记录,筛选出有效的批准(排除作者自己批的) def pullRequest = githubPr.getPullRequest() def validApprovals = pullRequest.reviews.findAll { review -> review.state == 'APPROVED' && review.user.login != pullRequest.user.login } if (validApprovals.size() < 1) { error "PR还没拿到至少1个有效的LGTM批准,终止流水线~" } echo "搞定!PR已获得${validApprovals.size()}个LGTM批准,继续下一步" } } } stage('拉取代码并合并PR到Master') { steps { script { // 克隆仓库的Master分支 git url: REPO_URL, credentialsId: CRED_ID, branch: 'master' // 拉取PR对应的分支到本地 sh "git fetch origin pull/${PR_NUMBER}/head:pr-branch" // 合并PR到本地Master sh "git merge --no-ff pr-branch" } } } stage('执行冒烟测试') { steps { // 替换成你自己的冒烟测试命令,比如npm run smoke、mvn test -Dtest=Smoke* sh "./run-smoke-tests.sh" } post { failure { // 测试失败给PR作者发邮件(可选) emailext subject: "PR #${PR_NUMBER} 冒烟测试挂了!", body: "PR链接:${env.CHANGE_URL}\n快去Jenkins看日志排查问题~", to: "${env.CHANGE_AUTHOR_EMAIL}" } } } stage('合并PR到正式Master') { when { // 只有冒烟测试成功才执行这一步 success() } steps { script { // 推荐用GitHub API合并(保留PR合并记录),替换成你的仓库信息 // sh "curl -X PUT -H 'Authorization: token ${GITHUB_TOKEN}' https://api.github.com/repos/你的用户名/你的仓库/pulls/${PR_NUMBER}/merge -d '{\"commit_title\":\"Merge PR #${PR_NUMBER}: ${env.CHANGE_TITLE}\"}'" // 简单版:直接推送合并后的本地Master到远程(不会留PR合并记录,不推荐) sh "git push origin master" } } post { success { // 合并成功通知作者 emailext subject: "PR #${PR_NUMBER} 已成功合并到Master!", body: "PR链接:${env.CHANGE_URL}\n冒烟测试通过,已经合并到正式分支啦~", to: "${env.CHANGE_AUTHOR_EMAIL}" } } } } post { always { // 清理工作空间,避免影响下次构建 deleteDir() } } }
4. 关键细节提醒
- 批准有效性:代码里排除了PR作者自己的批准,避免自批自合,如果你不需要这个限制,删掉
review.user.login != pullRequest.user.login就行 - 合并方式:强烈推荐用GitHub API合并(注释里的方式),直接push的话不会在GitHub上留下PR的合并记录,API合并能保留PR的所有信息,方便后续追溯
- 测试命令:一定要把
./run-smoke-tests.sh换成你项目实际的冒烟测试命令,别直接用示例 - 权限问题:第一次跑如果报错,先检查Jenkins的凭证有没有仓库读写权限,Webhook有没有配置成功(GitHub的Webhook页面能看最近的请求状态)
三、新手踩坑指南
- 合并冲突:如果PR和Master有冲突,流水线会在合并阶段失败,需要开发者先在本地解决冲突再重新提交PR
- 测试环境:如果冒烟测试需要特定环境,可以给Jenkins配置专门的测试节点,或者用Docker容器隔离环境,避免影响其他构建
- Webhook触发失败:检查Jenkins地址是否能被GitHub访问到,如果是本地Jenkins,可能需要用内网穿透工具
内容的提问来源于stack exchange,提问作者mtess
相关产品推荐
相关产品推荐

