Install Snyk in Jenkins "Global Tool Configuration" using groovy

532 views Asked by At

I'm trying to add a Snyk installation to Jenkins using groovy. The plugin is installed and I can see the installation option in Global Tool Configuration:

enter image description here

The problem is the Descriptor is not available until I manually add the installer and click Save. If I don't do this task manually, which I want to prevent, it causes my code to fail with the following error message "Cannot invoke method setInstallations() on null object"

My code:

import hudson.model.*
import jenkins.model.*
import hudson.tools.*
import hudson.tasks.*
import io.snyk.jenkins.tools.SnykInstaller
import io.snyk.jenkins.tools.SnykInstallation

def snyk_name = "Snyk"
def snyk_home = ""
def snyk_installer = new SnykInstaller("", "latest", 24)
def snyk_properties = new InstallSourceProperty([snyk_installer])
def instance = Jenkins.getInstance()

println("[init.groovy.d] START Configuring Snyk Installation...")
// Get the GlobalConfiguration descriptor of Snyk plugin.
def snyk_conf = instance.getDescriptor("io.snyk.jenkins.SnykStepBuilder.SnykStepBuilderDescriptor")

def snyk_inst = new SnykInstallation(
    snyk_name,
    snyk_home,
    [snyk_properties]
)

// Only add the new Snyk setting if it does not exist - do not overwrite existing config
def snyk_installations = snyk_conf.getInstallations()

def snyk_inst_exists = false
snyk_installations.each {
    installation = (SnykInstallation) it
    if (snyk_inst.getName() == installation.getName()) {
        snyk_inst_exists = true
        println("Found existing installation: " + installation.getName())
    }
}
if (!snyk_inst_exists) {
    snyk_installations += snyk_inst
    snyk_conf.setInstallations((SnykInstallation[]) snyk_installations)
    snyk_conf.save()
}


// Save the state
instance.save()

println("[init.groovy.d] END")

Is there any way to do what I want programmatically?

1

There are 1 answers

1
BazBot On

After testing your groovy on my local Jenkins (v 2.263.1) I came up with the below which then worked for me:

import hudson.model.*
import jenkins.model.*
import hudson.tools.*
import hudson.tasks.*
import io.snyk.jenkins.tools.*

def instance = Jenkins.getInstance()
def snyk_name = "SnykLatest"
def snyk_home = ""
def snyk_installer = new SnykInstaller("", "latest", 24L, null)
def snyk_properties = new InstallSourceProperty([snyk_installer])

println("[init.groovy.d] START Configuring Snyk Installation...")
// Get the GlobalConfiguration descriptor of Snyk plugin.
def snyk_conf = instance.getDescriptor("io.snyk.jenkins.tools.SnykInstallation")

def snyk_inst = new SnykInstallation(
    snyk_name,
    snyk_home,
    [snyk_properties]
)

// Only add the new Snyk setting if it does not exist - do not overwrite existing config
def snyk_installations = snyk_conf.getInstallations()

def snyk_inst_exists = false
snyk_installations.each {
    installation = (SnykInstallation) it
    if (snyk_inst.getName() == installation.getName()) {
        snyk_inst_exists = true
        println("Found existing installation: " + installation.getName())
    }
}
if (!snyk_inst_exists) {
    snyk_installations += snyk_inst
    snyk_conf.setInstallations((SnykInstallation[]) snyk_installations)
    snyk_conf.save()
}


// Save the state
instance.save()

println("[init.groovy.d] END")

In basic Terms the SnykInstaller was expecting 4 values not 3. Groovy also took the 3rd value as an Integer when it was expecting a Long Value.

References: