如何在声明性管道中定义多个容器?

时间:2017-11-24 09:48:37

标签: jenkins kubernetes jenkins-pipeline jnlp

我正在使用kuberntes-plugin。在其自述文件中,它给出了如何使用多个容器图像编写脚本管道,如

podTemplate(label: 'mypod', containers: [
    containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
    containerTemplate(name: 'golang', image: 'golang:1.8.0', ttyEnabled: true, command: 'cat')
  ]) {
    node('mypod') { 

我尝试了以下的声明性管道。

pipeline {
  agent {
    kubernetes {
      //cloud 'kubernetes'
      label 'mypod'
      containerTemplate {
        name 'maven'
        image 'maven:3.3.9-jdk-8-alpine'
        ttyEnabled true
        command 'cat'
      }
      containerTemplate {
        name 'containtertwo'
        image 'someimage'
        ttyEnabled true

      }
    }
  }

它创建一个只有一个容器的pod。

如何将多个containerTemplates与声明性管道一起使用?

2 个答案:

答案 0 :(得分:1)

这不是您问题的解决方案,但是我在查看之后找到了一些信息。

KubernetesDeclarativeAgent只有一个containerTemplate。无论哪个containerTemplate位于您的容器集合的底部,都将是使用的那个。

在您的示例中,它将是containtertwo

您无法拥有多个顶级agents,并且您无法在代理中拥有多个kubernetes。而现在你不能拥有多个容器。如果为此抛出某种错误或警告,我更愿意。

我能想到的有两种解决方法。如果您必须使用声明式,那么您可以向agent添加stage,但这可能会导致其自身的问题。另一个是脚本管道,这就是我要做的事情。

关于此的文档还有很多不足之处。

答案 1 :(得分:0)

您可以在Pod模板文件的帮助下实现这一目标。我使用以下程序在kubernetes上部署我的应用程序:

apiVersion: v1
kind: Pod
metadata:
  labels:
    label: docker
spec:
  containers:
  - name: docker
    image: jenkins/jnlp-agent-docker
    command:
    - cat
    tty: true
    volumeMounts:
    - mountPath: '/var/run/docker.sock'
      name: docker-socket
  - name: kubectl
    image: bitnami/kubectl
    command:
    - cat
    tty: true
  volumes:
  - name: docker-socket
    hostPath:
      path: '/var/run/docker.sock'
  securityContext:
    runAsUser: 0

然后在声明性管道中使用它:

stage('Deploy') {
  when {
    anyOf { branch 'master'; tag '' }
  }
  agent {
    kubernetes {
      defaultContainer 'kubectl' // All `steps` instructions will be executed by this container
      yamlFile 'path/to/pod/template.yaml'
    }
  }
  steps {
    container('docker') {
      sh 'echo This is executed in the docker container'
    }
  }
}

您还可以借助yaml选项而不是yamlFile在Jenkinsfile中指定模板,只需在此使用多行字符串即可。