You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:39:46