Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the SCM URL inside a Jenkins Pipeline or Multibranch Pipeline?

Tags:

I am trying to get a prebuild merge to work inside a multibranch pipeline and I would like to avoid having to hardcode the git url in my pipeline script.

It seems like scm step must store the url somehow, but I cannot figure out how to access it.

like image 433
Isaac Stefanek Avatar asked Jul 07 '16 20:07

Isaac Stefanek


People also ask

What is the difference between pipeline and Multibranch pipeline in Jenkins?

Jenkins Pipeline Vs. Multibranch Pipeline. A multibranch pipeline is meant for building multiple branches from a repository and deploy to multiple environments if required. A pipeline job supports both pipeline steps to be added in Jenkins configuration and form SCM.

How does Jenkins use Multibranch pipeline?

Head over to your Jenkins instance and create a new item. Enter a name for the job, and select the “Multibranch Pipeline” option at the end of the screen. Then, click on the OK button. In the next screen, go to the “Branch sources” tab, click on the “Add source” button, and choose “Git” from the dropdown menu.


2 Answers

You are correct, the scm object does have the information you need.

When using git as the source control in a Pipeline project (or Multibranch Pipeline project), the scm global variable will be an instance of GitSCM. That means that `scm.getUserRemoteConfigs()' will return a list of UserRemoteConfig instances. Those instances have the git remote's name, url, and refspec. You can iterate over that list to find a matching remote, or just take the first one if your sure you only have one url.

def scmUrl = scm.getUserRemoteConfigs()[0].getUrl() 

NOTES

  • RejectedAccessException - The getUserRemoteConfigs and getUrl methods will both throw org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException until you manually approve them, under "Manage Jenkins -> In-process Script Approval". The only way I've found to do this is to try running the script, have it throw an access exception, approve the one method that caused the exception, and repeat for each method until no more access exceptions are thrown. Happily the setting is server-wide, so you only have to do this once per jenkins controller, not for each pipeline job.

  • GitHub - While testing with a GitHub-sourced multibranch pipeline, getUserRemoteConfigs returned two UserRemoteConfig instances, one for regular branches and another for pull requests. These had the same url so no big deal, but something to keep in mind. For example, in a project using an HTTPS-based connection:

    echo scm.getUserRemoteConfigs()  "[     +refs/heads/*:refs/remotes/origin/* => https://github.com/bitwiseman/project.git (origin),     +refs/pull/*/head:refs/remotes/origin/pr/* => https://github.com/bitwiseman/project.git (origin) ]" 
like image 177
BitwiseMan Avatar answered Sep 20 '22 03:09

BitwiseMan


Inspired by a comment in answer by @BitwiseMan, I have found a (hacky) way to get the URL without RejectedAccessException:

checkout scm def url = sh(returnStdout: true, script: 'git config remote.origin.url').trim() 

Please note that it must be done after checkout scm. Basically, you must be in a checked out git repository (i.e. has .git/config file in it)

like image 44
akhy Avatar answered Sep 18 '22 03:09

akhy