I was using kuberntes-plugin. In its README it has given how to write scripted pipeline with multiple container images, like
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') {
I tried the following for declarative pipeline.
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
}
}
}
It creates a pod with only one container.
how to use multiple containerTemplates with declarative pipeline?
You can achive that with the help of a pod template file. I use the following one to deploy my app on 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: 0Then use this in a declarative pipeline:
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'
}
}
}
You can also specify the template in the Jenkinsfile with the help of yaml option instead of yamlFile, you just need to use a multiline string there.
This isnt a solution to your problem, but is some information I found after looking.
The KubernetesDeclarativeAgent only has a single containerTemplate. Whichever containerTemplate is at the bottom of your collection of containers will be the one that is used.
In your example it will be containtertwo.
You cant have multiple top level agents, and you cant have multiple kubernetes within an agent. And now you cant have multiple containers. I would prefer if an error or warning of some kind was thrown for this.
There are 2 work arounds I can think of. If you must use declarative, then you can add an agent to your stage, but this can lead to its own issues. The other is the scripted pipeline, which is what I am going to do.
The documentation on this leaves much to be desired.