Автоматически настроить докерское облако в Jenkins, используя groovy script - PullRequest
0 голосов
/ 16 января 2019

Я настраиваю плагин 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 () для нулевой объект

Нужна помощь, чтобы исправить этот код и заставить его работать. Заранее спасибо, Игорь.

1 Ответ

0 голосов
/ 17 января 2019

Вы можете получить доступ к настроенным облакам с помощью jenkins.clouds.getByName(String), чтобы найти облако, которое вы хотите обновить. Вы добавляете больше шаблонов, вызывая DockerCloud.addTemplate(DockerTemplate). Не забудьте спасти Дженкинса, как только вы закончите. Примерно так:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...