Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use Jenkins Sidebar Link Plugin in pipeline step?

I'm working on this plugin https://plugins.jenkins.io/sidebar-link/ to add a link in jenkins side bar. This plugin works with jenkins project configuration. Now I'm trying to add a pipeline step to call this plugin.

I already try lines of code below but it's not working

sidebarLinks {
            link("my_url", "the title", 'image path')
        }

I already read thread on this but no accepted responses found. I think that jenkins plugin are not well documented.

Does anybody know how can I use it with pipeline?

Updated

I'm using a shared library written in Groovy. This library holds all pipeline methods.

@Library('[email protected]') _
pipeline {
   stages {
      ...
      stage('Add side link') {
            steps {
                addLink()
            }
        }
   }
}

Shared library side, I've an addLink.groovy file.

def call(){

    properties {
        sidebarLinks {
            link("url", 'Title', 'icon_path')
        }
    }
}

I've got error below :

ERROR: <- : java.lang.IllegalArgumentException: Could not instantiate {properties=org.jenkinsci.plugins.workflow.cps.CpsClosure2@6b5322b} for JobPropertyStep

like image 721
13KZ Avatar asked Jul 03 '20 14:07

13KZ


People also ask

What is sidebar link in Jenkins?

This simple plugin adds an Additional Sidebar Links section in the main Jenkins configuration page, with settings for link URLs, texts and icons. These links will be shown in the top-level Jenkins pages (main page, user list, build history, My Projects and other project view tabs).

What is sidebar link?

Sidebar backlinks are just what they sound like—backlinks located within a website's sidebar. Sidebar backlinks are considered a type of sitewide backlink. This is what Google thinks about sitewide backlinks: Google Search Central.


Video Answer


2 Answers

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'
            }
        }
    }
}
like image 179
Joep Weijers Avatar answered Oct 12 '22 04:10

Joep Weijers


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(...)
                }
            }
        }
    }
}
like image 1
Noam Helmer Avatar answered Oct 12 '22 02:10

Noam Helmer