Igor Rabkin
Igor Rabkin

Reputation: 95

Automatically configure the docker cloud in Jenkins using groovy script

I'm setting up Jenkins Docker Plugin using groovy script code from plugin website: https://wiki.jenkins.io/display/JENKINS/Docker+Plugin Everything working as desired, however the script deigned to create single docker cloud with single docker template. Of course, I can manually add new docker template into existing docker cloud, but I would like to make it work using groovy script. Or, alternatively if it possible to create single docker cloud with multiple docker templates using the same groovy script.

I tried add one more template by adding def DockerTemplateParameters and def dockerTemplateBaseParameters templates into existing dockerCloud template with different value parameters, but script not working this way...

/*
   Automatically configure docker cloud stack in Jenkins.
   Docker plugin v1.1.5
*/

//configure cloud stack


import com.nirima.jenkins.plugins.docker.DockerCloud
import com.nirima.jenkins.plugins.docker.DockerTemplate
import com.nirima.jenkins.plugins.docker.DockerTemplateBase
import 
com.nirima.jenkins.plugins.docker.launcher.AttachedDockerComputerLauncher
import io.jenkins.docker.connector.DockerComputerAttachConnector
import jenkins.model.Jenkins

// parameters

def dockerCloudParameters = [
name:             'Adas-Project-Server-18',
serverUrl:        'tcp://10.10.1.2:4243',
credentialsId:    '',
version:          '1.26',
connectTimeout:   5,
readTimeout:      15,
dockerHostname:   '',
containerCapStr:  '5' 
]

def DockerTemplateParameters = [
labelString:    'docker-adas-linux',
instanceCapStr: '1',
remoteFs:       '/var/lib/jenkins'
]

def dockerTemplateBaseParameters = [
image:              'adas-build:linux',
bindAllPorts:       false,
bindPorts:          '',
cpuShares:          null,
dnsString:          '',
dockerCommand:      '',
environmentsString: '',
extraHostsString:   '',
hostname:           '',
macAddress:         '',
memoryLimit:        null,
memorySwap:         null,
network:            '',
privileged:         true,
pullCredentialsId:  '',
sharedMemorySize:   null,
tty:                false,
volumesFromString:  '',
volumesString:      'media:/media 
/var/lib/jenkins/workspace/CCACHE/Linux/.ccache/:/usr/src/.ccache'
]

// https://github.com/jenkinsci/docker-plugin/blob/docker-plugin- 
1.1.2/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplateBase.java
DockerTemplateBase dockerTemplateBase = new DockerTemplateBase(
dockerTemplateBaseParameters.image,
dockerTemplateBaseParameters.pullCredentialsId,
dockerTemplateBaseParameters.dnsString,
dockerTemplateBaseParameters.network,
dockerTemplateBaseParameters.dockerCommand,
dockerTemplateBaseParameters.volumesString,
dockerTemplateBaseParameters.volumesFromString,
dockerTemplateBaseParameters.environmentsString,
dockerTemplateBaseParameters.hostname,
dockerTemplateBaseParameters.memoryLimit,
dockerTemplateBaseParameters.memorySwap,
dockerTemplateBaseParameters.cpuShares,
dockerTemplateBaseParameters.sharedMemorySize,
dockerTemplateBaseParameters.bindPorts,
dockerTemplateBaseParameters.bindAllPorts,
dockerTemplateBaseParameters.privileged,
dockerTemplateBaseParameters.tty,
dockerTemplateBaseParameters.macAddress,
dockerTemplateBaseParameters.extraHostsString
)

// https://github.com/jenkinsci/docker-plugin/blob/docker-plugin-1.1.2/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplate.java
DockerTemplate dockerTemplate = new DockerTemplate(
dockerTemplateBase,
new DockerComputerAttachConnector(),
DockerTemplateParameters.labelString,
DockerTemplateParameters.remoteFs,
DockerTemplateParameters.instanceCapStr
)

// https://github.com/jenkinsci/docker-plugin/blob/docker-plugin-1.1.2/src/main/java/com/nirima/jenkins/plugins/docker/DockerCloud.java
DockerCloud dockerCloud = new DockerCloud(
dockerCloudParameters.name,
[dockerTemplate],
dockerCloudParameters.serverUrl,
dockerCloudParameters.containerCapStr,
dockerCloudParameters.connectTimeout,
dockerCloudParameters.readTimeout,
dockerCloudParameters.credentialsId,
dockerCloudParameters.version,
dockerCloudParameters.dockerHostname
)

// get Jenkins instance
Jenkins jenkins = Jenkins.getInstance()

// add cloud configuration to Jenkins
jenkins.clouds.add(dockerCloud)

// save current Jenkins state to disk
jenkins.save()

So far below what I've tried (still not working):

I've created cloud using above groove script. Now I'm trying add to it one more docker template using code from @Oliver Gondža suggestion:

/*
   Adding new docker template into existing docker cloud stack in Jenkins.
   Docker plugin v1.1.5
 */

//configure cloud stack


import com.nirima.jenkins.plugins.docker.DockerTemplate
import com.nirima.jenkins.plugins.docker.DockerTemplateBase
import io.jenkins.docker.connector.DockerComputerAttachConnector
import jenkins.model.Jenkins

// parameters

def AndroidTemplateParameters = [
  labelString:    'docker-adas-android',
  instanceCapStr: '1',
  remoteFs:       '/var/lib/jenkins'
]

def AndroidTemplateBaseParameters = [
  image:              'yi/adas-build:android',
  bindAllPorts:       false,
  bindPorts:          '',
  cpuShares:          null,
  dnsString:          '',
  dockerCommand:      '',
  environmentsString: '',
  extraHostsString:   '',
  hostname:           '',
  macAddress:         '',
  memoryLimit:        null,
  memorySwap:         null,
  network:            '',
  privileged:         true,
  pullCredentialsId:  '',
  sharedMemorySize:   null,
  tty:                false,
  volumesFromString:  '',
  volumesString:      'media:/media /var/lib/jenkins/workspace/CCACHE/Android/.ccache/:/usr/src/.ccache'
]

// https://github.com/jenkinsci/docker-plugin/blob/docker-plugin-1.1.2/src/main/java/com/nirima/jenkins/plugins/docker/DockerTemplateBase.java
DockerTemplateBase AndroidTemplateBase = new DockerTemplateBase(
  AndroidTemplateBaseParameters.image,
  AndroidTemplateBaseParameters.pullCredentialsId,
  AndroidTemplateBaseParameters.dnsString,
  AndroidTemplateBaseParameters.network,
  AndroidTemplateBaseParameters.dockerCommand,
  AndroidTemplateBaseParameters.volumesString,
  AndroidTemplateBaseParameters.volumesFromString,
  AndroidTemplateBaseParameters.environmentsString,
  AndroidTemplateBaseParameters.hostname,
  AndroidTemplateBaseParameters.memoryLimit,
  AndroidTemplateBaseParameters.memorySwap,
  AndroidTemplateBaseParameters.cpuShares,
  AndroidTemplateBaseParameters.sharedMemorySize,
  AndroidTemplateBaseParameters.bindPorts,
  AndroidTemplateBaseParameters.bindAllPorts,
  AndroidTemplateBaseParameters.privileged,
  AndroidTemplateBaseParameters.tty,
  AndroidTemplateBaseParameters.macAddress,
  AndroidTemplateBaseParameters.extraHostsString
)

// get Jenkins instance
Jenkins jenkins = Jenkins.getInstance()

def cloud = jenkins.clouds.getByName("Adas-Project-Server-18")
cloud.addTemplate(new DockerTemplate(
  AndroidTemplateBase,
  new DockerComputerAttachConnector(),
  AndroidTemplateParameters.labelString,
  AndroidTemplateParameters.remoteFs,
  AndroidTemplateParameters.instanceCapStr
))


// save current Jenkins state to disk
jenkins.save()

When I'm trying to run above code in Jenkins script console I'm getting following error:

java.lang.NullPointerException: Cannot invoke method addTemplate() on null object

Need help to fix this code and make it work. Thank you in advance, Igor.

Upvotes: 1

Views: 2203

Answers (1)

Oliver Gondža
Oliver Gondža

Reputation: 3511

You can access configured clouds by jenkins.clouds.getByName(String) to locate the cloud you would like to update. You add more templates to it by calling DockerCloud.addTemplate(DockerTemplate). Remember to save Jenkins once you are done. Roughly like this:

DockerTemplateBase someOtherTemplateBase = new DockerTemplateBase(
    ...
)

def someOtherTemplateParameters = [
    ...
]

Jenkins jenkins = Jenkins.getInstance()
def cloud = jenkins.clouds.getByName("Adas-Project-Server-18")
cloud.addTemplate(new DockerTemplate(
    someOtherDockerTemplateBase,
    new DockerComputerAttachConnector(),
    someOtherTemplateParameters.labelString,
    someOtherTemplateParameters.remoteFs,
    someOtherTemplateParameters.instanceCapStr
))
jenkins.save()

Upvotes: 1

Related Questions