Jenkins Workflow Checkout Accessing BRANCH_NAME and GIT_COMMIT

前端 未结 3 1655
余生分开走
余生分开走 2020-12-08 16:02

I cannot seem to extract $GIT_COMMIT and $BRANCH_NAME from a Jenkins Workflow Checkout step.

I would like to be able to send this information through to my Gradle sc

相关标签:
3条回答
  • 2020-12-08 16:08

    If you want to access the BRANCH_NAME from Jenkins environment variable as a shell script, use the below snippet.

    sh 'echo Branch Name: $BRANCH_NAME'

    The response should be as below:

    Branch Name: the_checkedout_branch

    0 讨论(0)
  • 2020-12-08 16:11

    I have two Jenkins instances.

    In both instances, GIT_COMMIT and BRANCH_NAME environment variables are not defined.

    When I try to get them from the return value of checkout() call, each instance behaves differently.

    Jenkins Instance 1

    Jenkins version: 2.46.1

    "Pipeline: SCM Step" plugin version: 2.5

    Trying to access the environment variable as explained in the checkout documentation fails.

    def scmVars = checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
        userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-
        49842a984201', url: 'ssh://git@corporate.com:repo.git']]])
    def commitHash = scmVars.GIT_COMMIT
    

    scmVars returns NULL, and accessing scmVars.GIT_BRANCH fails with exception java.lang.NullPointerException: Cannot get property 'GIT_BRANCH' on null object.

    So I had to do the following in order to get the branch:

    sh 'git name-rev --name-only HEAD > GIT_BRANCH'
    sh 'cat GIT_BRANCH'
    git_branch = readFile('GIT_BRANCH').trim()
    env.GIT_BRANCH = git_branch
    

    Jenkins Instance 2

    Jenkins version: 2.60.2

    "Pipeline: SCM Step" plugin version: 2.6

    In this instance, I could do the following with success:

    def scmVars = checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
        userRemoteConfigs: [[credentialsId: '2b74a351-67d5-4d00-abd3-
        49842a984201', url: 'ssh://git@corporate.com:repo.git']]])
    env.GIT_COMMIT = scmVars.GIT_COMMIT
    env.GIT_BRANCH = scmVars.GIT_BRANCH
    

    So please check which approach works for your Jenkins instance and use it.

    0 讨论(0)
  • 2020-12-08 16:23

    First of all,

    def branch = ${BRANCH_NAME}
    

    is not valid Groovy, or at least not doing what you think. Perhaps you meant

    def branch = "${BRANCH_NAME}"
    

    which would just be a silly way of writing

    def branch = BRANCH_NAME
    

    Anyway environment variables are not currently accessible directly as Groovy variables in Pipeline (there is a proposal to allow it); you need to use the env global variable:

    def branch = env.BRANCH_NAME
    

    From within an external process, such as a sh step, it is an actual environment variable, so

    sh 'echo $BRANCH_NAME'
    

    works (note that ' means Groovy is not interpolating the variable).

    Now, JENKINS-30252 was referring to multibranch projects. If you created a standalone Pipeline job, this variable will not be set.

    Anyway in your case your checkout step is always checking out the master branch. If you actually have a multibranch project, then your Jenkinsfile should be using

    checkout scm
    

    which will check out a commit on the correct branch (always matching the revision of Jenkinsfile itself).

    As to the commit hash, pending JENKINS-26100 this is not available automatically, but you can use something like

    sh 'git rev-parse HEAD > commit'
    def commit = readFile('commit').trim()
    

    to access it.

    0 讨论(0)
自定义标题
段落格式
字体
字号
代码语言
提交回复
热议问题