GitHub Branch name from which the Pull Request is raised
Asked Answered
M

5

24

I'm using Multibranch Pipeline Job in Jenkins.

How do I find the branch name from which the Pull Request is raised in GitHub?

I'm using /github-webhook/ & also tried with /ghprbhook/ and tried with the following environment variables: GIT_LOCAL_BRANCH, GIT_BRANCH, ghprbSourceBranch, but I didn't get any result.

If there are any suggestions, I would love to try them.

Monafo answered 12/12, 2017 at 14:24 Comment(0)
P
37

CHANGE_BRANCH gives the correct name of the source branch of the PR.

CHANGE_TARGET gives the target name of the PR merge

Paranymph answered 16/3, 2019 at 6:20 Comment(3)
Interesting, while this is not mentioned in the multibranch pipeline documentation, the code in branch-api plugin mentions those.Elisabeth
What about non-PR builds? I'd like to have a single Jenkinsfile for my builds. Do I then have to detect if CHANGE_BRANCH exists, and then assume it isn't a PR build?Koa
@Koa Yes, if CHANGE_BRANCH exists, it means it's a PR build. Otherwise CHANGE_BRANCH doesn't exist.Olney
P
5

The environment variable CHANGE_BRANCH should give you the source branch name and CHANGE_TARGET the target branch name. For PR from forks, the CHANGE_FORK gives you the repository name of the fork. For PR from origin, CHANGE_FORK is not set.

To see the description of the environment variables, navigate to a branch job then Pipeline Syntax > Global Variable Reference > env. It should display the description of those variables.

Pour answered 3/5, 2021 at 23:35 Comment(1)
Nice one mentioning about the Jenkins link describing all available env variables.Erichericha
B
4

There are a few different parameters and it can be difficult to find the correct one depending on the context.

BRANCH_NAME

For a multibranch project, this will be set to the name of the branch being built, for example in case you wish to deploy to production from master but not from feature branches; if corresponding to some kind of change request, the name is generally arbitrary (refer to CHANGE_ID and CHANGE_TARGET).

This can either be the branch name (like in branch builds) or some other identifier (like the pull request Id). The documentation is clear that it can be either, but it is surprising behavior if you haven't read the full documentation.

The other answer by MZ2010 shows a way that will probably work as the checkout. It may depend on plugin versions and is probably affected by the same issue as above.

def scmVars = checkout scm
def branchName = scmVars.GIT_BRANCH

The way that that you can get it is if you use the GitHub Branch Source Plugin which supports the CHANGE_BRANCH environment variable. This was added in JENKINS-43418 and you should be able to reference it if you are using env.CHANGE_BRANCH. It may not be available in Multibranch jobs, though.

Bushranger answered 13/12, 2017 at 16:22 Comment(0)
E
1

According to the documentation, the pull request ID is exposed as CHANGE_ID variable.

Btw. environment variables can be accessed in pipeline's groovy code via env, such as env.CHANGE_ID.

Elisabeth answered 12/12, 2017 at 16:53 Comment(0)
P
1

For multibranch pipelines, use:

env.BRANCH_NAME

for accessing the branch name.

Edit: If you need to debug env variables or git variables you can try:

  1. access GIT variables

    def scmVars = checkout scm
    def branchName = scmVars.GIT_BRANCH
    
  2. Print ENV variables

    sh("printenv")
    
Phonotypy answered 13/12, 2017 at 8:55 Comment(3)
Thanks for your reply. If I raise a PR and use this command, we are getting PR number as the branch name.Monafo
that is strange. Maybe you can try printing all env vars and git vars to see if the branch name is stored in another variable?Phonotypy
This doesn't work. Jenkins make a branch like PR-XXX where XXX is the PR number, and that is what shows up in env.BRANCH_NAME. Wish it put the PR's original branch name in there!Koa

© 2022 - 2024 — McMap. All rights reserved.