Reputation: 95
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
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