Jenkins is a tool for Continuous Integration and Continuous Delivery and has a plugin for provisioning builds (slaves) cross a Kubernetes cluster.
The plugin kicks off every build in a new
pod and tears it down when the build is complete. This means that every build is clean and reproducible. This is clearly something that we want in Kubernetes-On-ARM.
There is now support for multiple platforms with the relase of Kubernetes
arm64 being two of them. There is also a side project:
kube-deploy/docker-multinode that lets you setup a Kubernetes cluster in minutes, using docker.
Sloop - is my project that uses
kube-deploy/docker-multinode for running Kubernetes “native”. You can read more about it in an earlier post Building your Kubernetes cluster in minutes. You’re more than welcome to check(it)out and give it a try.
The Jenkins master keeps state and needs a durable volume for storing
data about your builds. I highly recommend using something other than
hostPath. I use a
I have created a Jenkins image:
kodbasen/jenkins-arm and here’s a
deployment you can use:
apiVersion: extensions/v1beta1 kind: Deployment metadata: annotations: labels: run: jenkins name: jenkins namespace: default spec: replicas: 1 selector: matchLabels: run: jenkins template: metadata: labels: run: jenkins spec: containers: - image: kodbasen/jenkins-arm:2.7.1 imagePullPolicy: IfNotPresent name: jenkins ports: - containerPort: 8080 protocol: TCP name: web - containerPort: 50000 protocol: TCP name: slaves volumeMounts: - mountPath: /var/jenkins_home name: jenkinshome volumes: - name: jenkinshome persistentVolumeClaim: claimName: jenkins
I’m using a
jenkins. I leave it up to you to sort out your volume configuration.
Next we need to expose our Jenkins deployment as a
apiVersion: v1 kind: Service metadata: labels: run: jenkins name: jenkins namespace: default spec: ports: - name: web port: 80 protocol: TCP targetPort: 8080 - name: slaves port: 50000 protocol: TCP targetPort: 50000 selector: run: jenkins
You should now have Jenkins up and running. Now check your Jenkins
pod log and copy the first time password and head over to Jenkins to set it up, and while your there, install the Kubernetes plugin. Come back here when your done and I’ll show you how to setup the plugin.
The Kubernetes plugin uses a
slave image and a
pod-template so there´s
not much for you to configure. Follow the instruction on the plugin page but use kodbasen/jenkins-slave-arm image as Docker image.
In your build configuration you need to restrict where the build can be run. Set it to use your pod template label.
If you wan’t to run docker builds on Jenkins theres another slave image that you can use: kodbasen/jenkins-docker-slave-arm. This image includes the docker binaries and runs docker builds on the host where the pod is running. For this to
work you need to mount three
When running your build you’ll se the build pending while the slave is provisioned.
You can control which nodes should be used for running builds using a
I’ve started moving all my builds from Drone over to Jenkins. If you decide to give Jenkins a try, and you’re using Sloop, let me know how it goes.
I hope you picked up something new, and that it was worth while reading this post.