In this lab we will create a custom Kubernetes Pod Template containing a NodeJS container and an additional Docker container for executing tests. We also want to use a different version of the node container than the one provided by the nodejs-app Kubernetes Pod Template on your managed controller. In order to be able to control what containers and what container image version we use in our Pipeline, we will update the Jenkinsfile Pipeline script with an inline Kubernetes Pod Template definition.
nodejs-pod.yaml file and then adding a yamlFile parameter to the agent declaration with a value of the the repository relative path to that yaml file. The file provides a standard Kubernetes Pod spec to be used to create the Pod Template based agent. Navigate to your workshop insurance-frontend repository in your workshop GitHub Organization, make sure you are on the add-jenkinsfile branch, then click the Add file button towards the top right of the screen and select Create new file. IMPORTANT: Make sure you are on the add-jenkinsfile branch. 
nodejs-pod.yaml and add the following content:kind: Pod
metadata:
name: nodejs-app
spec:
containers:
- name: nodejs
image: us-east1-docker.pkg.dev/core-workshop/workshop-registry/node:17-alpine
command:
- sleep
args:
- 99d
- name: testcafe
image: us-east1-docker.pkg.dev/core-workshop/workshop-registry/testcafe:1.18.0
command:
- sleep
args:
- 99d
securityContext:
runAsUser: 1000
This is a standard Kubernetes Pod Specification.
add-jenkinsfile branch selected and click the Commit new file button.agent section of the Test stage with the following - note that the value of the yamlFile parameter is the name of the pod template file we created: agent {
kubernetes {
yamlFile 'nodejs-pod.yaml'
}
}
Your complete add-jenkinsfile branch Jenkinsfile should match the following:
pipeline {
agent none
stages {
stage('Test') {
agent {
kubernetes {
yamlFile 'nodejs-pod.yaml'
}
}
steps {
container('nodejs') {
echo 'Hello World!'
sh 'node --version'
}
}
}
}
}
sh 'node --version' step - it is v17.x.x instead of v14.x.x:
Also notice that the final Kubernetes pod spec for the agent is printed out in the logs and is merge of a default template (with the jnlp container) and the nodejs-pod.yaml pod spec from your insurance-frontend repository:---
apiVersion: "v1"
kind: "Pod"
metadata:
annotations:
buildUrl: "http://cbci-pipeline-controller.controllers.svc.cluster.local/cbci-pipeline-controller/job/pipelines/job/insurance-frontend/job/beedemo-dev-patch-1/7/"
runUrl: "job/pipelines/job/insurance-frontend/job/beedemo-dev-patch-1/7/"
labels:
jenkins: "agent"
jenkins/label-digest: "9aa0cb9549a28ee62427ae2431380aed159ef6cf"
jenkins/label: "pipelines_insurance-frontend_beedemo-dev-patch-1_7-mn9xq"
cloudbees.com/master: "cbci-pipeline-controller"
name: "pipelines-insurance-frontend-beedemo-dev-patch-1-7-mn9xq--l3zmv"
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: "com.cloudbees.cje.type"
operator: "In"
values:
- "master"
- "cjoc"
topologyKey: "kubernetes.io/hostname"
weight: 1
containers:
- args:
- "99d"
command:
- "sleep"
image: "us-east1-docker.pkg.dev/core-workshop/workshop-registry/node:17-alpine"
name: "nodejs"
volumeMounts:
- mountPath: "/home/jenkins/agent"
name: "workspace-volume"
readOnly: false
workingDir: "/home/jenkins/agent"
- args:
- "99d"
command:
- "sleep"
image: "us-east1-docker.pkg.dev/core-workshop/workshop-registry/testcafe:1.18.0"
name: "testcafe"
volumeMounts:
- mountPath: "/home/jenkins/agent"
name: "workspace-volume"
readOnly: false
workingDir: "/home/jenkins/agent"
- args:
- "/var/jenkins_config/jenkins-agent"
command:
- "/bin/sh"
env:
- name: "JENKINS_SECRET"
value: "********"
- name: "JENKINS_AGENT_NAME"
value: "pipelines-insurance-frontend-beedemo-dev-patch-1-7-mn9xq--l3zmv"
- name: "JENKINS_WEB_SOCKET"
value: "true"
- name: "JENKINS_NAME"
value: "pipelines-insurance-frontend-beedemo-dev-patch-1-7-mn9xq--l3zmv"
- name: "JENKINS_AGENT_WORKDIR"
value: "/home/jenkins/agent"
- name: "JENKINS_URL"
value: "http://cbci-pipeline-controller.controllers.svc.cluster.local/cbci-pipeline-controller/"
image: "us-east1-docker.pkg.dev/core-workshop/workshop-registry/agent:2.361.1.2"
imagePullPolicy: "IfNotPresent"
name: "jnlp"
resources:
limits: {}
requests: {}
tty: false
volumeMounts:
- mountPath: "/var/jenkins_config"
name: "volume-0"
readOnly: false
- mountPath: "/home/jenkins/agent"
name: "workspace-volume"
readOnly: false
workingDir: "/home/jenkins/agent"
enableServiceLinks: false
hostNetwork: false
nodeSelector:
kubernetes.io/os: "linux"
restartPolicy: "Never"
securityContext:
runAsGroup: 1000
runAsUser: 1000
serviceAccountName: "jenkins"
volumes:
- configMap:
name: "jenkins-agent"
optional: false
name: "volume-0"
- emptyDir:
medium: ""
name: "workspace-volume"
pipeline {
agent none
stages {
stage('Test') {
agent {
kubernetes {
yamlFile 'nodejs-pod.yaml'
}
}
steps {
container('nodejs') {
echo 'Hello World!'
sh 'node --version'
}
}
}
}
}