如何从Jenkins Pipeline获取pull request id

25

我正在尝试使用Jenkins流水线通过Sonar分析我的源代码。为了请求Sonar将结果通知给GitHub,我需要指定拉取请求ID。

我该如何从Jenkins流水线中获取此Pull Request ID?

我们正在使用 GitHub组织文件夹插件 来构建拉取请求,而不是 GitHub拉取请求构建器插件 。这就是为什么 $ghprbPullId 对我不起作用的原因。有任何想法以不同的方式获取拉取请求ID吗?


无法在Github组织项目中使用Github拉取请求构建器插件吗? - sirineBEJI
3个回答

24

Jenkins公开了一个名为CHANGE_ID的全局变量:

对于相应于某种更改请求的多分支项目,它将被设置为更改ID,例如拉取请求编号。

此变量仅适用于拉取请求构建,因此您必须在分支来源的管道配置中禁用分支构建并启用PR构建:

enter image description here

我的管道步骤如下:

def PULL_REQUEST = env.CHANGE_ID

stage('Analysis') {
        withCredentials([[$class: 'StringBinding', credentialsId: '***', variable: 'GITHUB_ACCESS_TOKEN']]) {
            withSonarQubeEnv('Sonar') {
                withMaven(maven: 'M3') {
                    sh "mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.2:sonar " +
                            "-Dsonar.analysis.mode=preview " +
                            "-Dsonar.github.pullRequest=${PULL_REQUEST} " +
                            "-Dsonar.github.oauth=${GITHUB_ACCESS_TOKEN}"
                }
            }
        }
    }

谢谢,那很有帮助。你知道“与基础分支合并”和“未合并的头部”之间的区别吗? - Aliaksandr Kavalevich
如果您想在构建之前将基础分支合并到您的PR中,请选择前者。这有助于检测冲突。请参阅https://go.cloudbees.com/docs/cloudbees-documentation/cje-user-guide/index.html#github-branch-source。 - Thomas
这个答案是否存在问题,因为它会发现拉取请求而不是分支,所以分支名称以 pr- 开头? - dimwittedanimal

4
如果Thomas的回答对你无效或不适用,你也可以(可能)使用分支名称通过查询Github REST API来获取拉取请求号码。你只需要一个API令牌和分支名称,按照更新日期降序查找拉取请求,并找到与你的分支名称匹配的第一个PR。那将有拉取请求号码。
这仅在每个拉取请求都有唯一的分支名称(例如JIRA问题票号)时才有效。

4
您可以通过例如env.BRANCH_NAME获取PR编号。
if (env.BRANCH_NAME.startsWith('PR-')) {
    def prNum = env.BRANCH_NAME.replace(/^PR-/, '')
    ...
}

8
谢谢您的回复,但很遗憾它不能适用于我的情况。在我的案例中,BRANCH_NAME与PR Id没有任何关系。例如,我们通常将分支名称设置为“feature/JIRA-34”,而PR id不一定是34,它可以是任何数字。 - Aliaksandr Kavalevich
1
只是一个小注释,在我的情况下,替换表达式是:prNumber = env.BRANCH_NAME.replace('PR-', '') - Dzmitry Hubin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接