Let’s explain an easy way to build an integration pipeline (CI) on Minikube.
Launch Minikube
If you don’t have Minikube running on your system,
$ minikube start --memory 4000 --cpus 2
Wait for a few minutes, you’ll see something like.
Starting local Kubernetes v1.10.0 cluster... Starting VM... Getting VM IP address... Moving files into cluster... Setting up certs... Connecting to cluster... Setting up kubeconfig... Starting cluster components... Kubectl is now configured to use the cluster. Loading cached images from config file.
Installing Helm
Helm is The Kubernetes Package Manager, it helps you to deploy services into Kubernetes.
$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.10.0-linux-amd64.tar.gz -O helm.tar.gz $ tar zxf helm.tar.gz $ sudo cp linux-amd64/helm /usr/local/bin/helm $ sudo chmod +x /usr/local/bin/helm
Applying the RBAC policy
$ kubectl create -f https://raw.githubusercontent.com/nordri/kubernetes-experiments/master/Pipeline/ServiceAccount.yaml
and then launch helm.
helm init --service-account tiller
Checking
$ helm version Client: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.10.0", GitCommit:"9ad53aac42165a5fadc6c87be0dea6b115f93090", GitTreeState:"clean"}
Deploying Jenkins
I’m using a custom values file for this chart. What I’m adjusting is:
AdminPassword: set to admin1234
ServiceType: set to NodePort (because is Minikube)
In plugins:
– kubernetes:1.2
– workflow-aggregator:2.5
– workflow-job:2.17
– credentials-binding:1.15
– git:3.7.0
And then the deployment:
$ helm install --name jenkins -f jenkins-helm-values.yaml stable/jenkins
After a few minutes we could be able to access Jenkins with:
$ minikube service jenkins
Configuring Jenkins
First, set the credentials to access Docker Hub where we’ll push the Docker images. The only field you must keep is ID because is needed by the pipeline in a next step. Fill it with your information:
Back to Jenkins main screen, add a new item type Pipeline
And finally, configure the pipeline in the Pipeline section:
Save the changes and click on Build now
And that’s it!
The pipeline
Let’s deep into the pipeline
The head
The pipeline starts setting the worker id so the pod has different label on each execution.
Follow the pod definition where we can define the containers who will run inside the pod. For this example we’ll need:
- maven
- docker
- mysql, this one with environment variables
- java, also with environment variables
Then the volumes, we need the docker sock in order to run docker in docker and a folder to save the artefacts downloaded from the Internet (it’s a Maven project!) between the executions. Saving time and bandwidth.
Cloning the repo…
What we do here is clean the workspace and clone the repository. It a SpringBoot application with MySQL.
Building…
We build the package using maven container.
Testing…
In this stage we launch our app inside Java container and after 30 seconds we check if it online, a simple smoky test. We save the return value in RES to decide if it’s ok or not. If not, finish with fail. As we defined all the containers at the beginning there’s a MySQL running inside the pod.
Building & Uploading Docker images…
If the testing stage went OK, we can push it to Docker Hub. To set the tag we use the commit ID cut to eight characters. To login into Docker Hub we use the withCredentials who takes a credential by id and fill the environment variables.
References
Set Up a Jenkins CI/CD Pipeline with Kubernetes