How can I use Jenkins Sidebar Link Plugin in pipeline step?
To find out how to do something in Declarative Pipeline, you can use the Directive Generator at http://JENKINS_URL/directive-generator/. This provides a user interface similar to the Job Configuration. However upon selecting "options" -> "Add" -> "sidebarLinks" -> fill in fields -> "Generate", nothing will be generated due to an internal server error.
The following Declarative Pipeline syntax works for a single job:
pipeline { agent any options { sidebarLinks([ [displayName: 'Side Bar Example', iconFileName: '', urlName: 'http://example.com'] ]) } stages { stage('Hello') { steps { echo 'Hello World' } } }}
However, you mentioned that you want to reuse these links in different jobs through use of a Shared Pipeline Library. Unfortunately, Shared Pipeline Libraries can not modify the options
section of a Declarative Pipeline, with the exception of generating your entire pipeline { }
in a single def call()
.
Fortunately, Scripted Pipeline can override that part of a configuration. Using the Snippet Generator at http://JENKINS_URL/pipeline-syntax/, you can generate the following bit of code that you can put in a Shared Pipeline Library, e.g. in var/mySidebar.groovy
:
def call() { properties([ sidebarLinks([[ displayName: 'My fancy sidebar url', iconFileName: '', urlName: 'https://example.com' ]]) ])}
You can then use that in either a scripted pipeline:
library('my-sidebar')mySidebar()node() { stage('Hello') { sh 'echo "Hello World!"' }}
Or a script
block of a Declarative Pipeline:
library('my-sidebar')script { mySidebarScripted()}pipeline { agent any stages { stage('Hello') { steps { echo 'Hello World' } } }}
Another available option is to use the classLoader to load the plugin and add a new link as an Action to the build or project level.
In your shared library file you can have something like this:
def addSideBarLink(String url, String displayName, String relativeIconPath, Boolean linkToBuild = true) { assert url : "The URL parameter cannot be empty" assert displayName : "The Display Name parameter cannot be empty" def linkActionClass = this.class.classLoader.loadClass("hudson.plugins.sidebar_link.LinkAction") def run = linkToBuild ? currentBuild.rawBuild : currentBuild.rawBuild.getParent() def action = linkActionClass.newInstance(url, displayName, relativeIconPath) println "Adding sidebar link to '${url}' at the ${linkToBuild ? 'build' : 'job'} level" run.getActions().add(action)}
Than call it from a scripted pipeline or a script block in a declarative pipeline as follows:
pipeline { agent any stages { stage('Hello') { steps { script { // assuming functions resides inside utils.groovy utils.addSideBarLink(...) } } } }}
Have you wrap it in properties
?
job("Sidebar Link Job 2") { description() keepDependencies(false) disabled(false) concurrentBuild(false) properties { sidebarLinks { link('https://google.com/', 'Google', 'userContent/favicon.ico') } }}
For references you can look at this https://jenkinsci.github.io/job-dsl-plugin/#path/freeStyleJob-properties-sidebarLinks
I've tried it myself and it is successfully generated the sidebarlinks
see google link in my sidebar