Я настраиваю плагин Jenkins Docker, используя код скрипта groovy с сайта плагина: https://wiki.jenkins.io/display/JENKINS/Docker+Plugin
Все работает, как нужно, однако сценарий сконструирован так, чтобы создать одно докерное облако с одним докерным шаблоном. Конечно, я могу вручную добавить новый шаблон докера в существующее облако докеров, но я бы хотел, чтобы он работал, используя groovy script. Или, в качестве альтернативы, если возможно создать одно облако Docker с несколькими шаблонами Docker, используя один и тот же скрипт Groovy.
Я попытался добавить еще один шаблон, добавив шаблоны def DockerTemplateParameters и def dockerTemplateBaseParameters в существующий шаблон dockerCloud с другими параметрами значений, но скрипт не работает таким образом ...
/*
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()
Так далеко ниже того, что я пробовал (все еще не работает):
Я создал облако с помощью скрипта выше Groove. Сейчас я пытаюсь добавить к нему еще один шаблон докера, используя код из предложения @Oliver Gondža:
/*
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()
Когда я пытаюсь запустить приведенный выше код в консоли сценариев Jenkins, я получаю следующую ошибку:
java.lang.NullPointerException: невозможно вызвать метод addTemplate () для
нулевой объект
Нужна помощь, чтобы исправить этот код и заставить его работать.
Заранее спасибо,
Игорь.