Helm is a package manager for Kubernetes. Helm uses a packaging format called charts, which include all of the Kubernetes resources that are required to deploy an application, such as deployments, services, ingress, etc. Helm charts are very useful for installing applications and performing upgrades on a Kubernetes cluster.
In this article, I will show you how to deploy a Helm chart using Jenkins continuous integration and continuous delivery (CI/CD) and Red Hat OpenShift 4. Figure 1 shows a high-level view of the process.
Prerequisites
You will need to install the following technologies before beginning this exercise:
Deploy Jenkins
First, install Jenkins using either a template or the Developer Catalog on OpenShift:
- Assuming you have OpenShift Container Platform 4 in your development environment, navigate to Developer perspective in the OpenShift web console.
- Select Add from the Developer Catalog and search for Jenkins, then click Instantiate Template, as shown in Figure 2.
Create a Jenkins agent image with the Helm client
This is required to run the helm
CLI command in containers.
To create the agent with the Helm client, we will use ose-jenkins-agent-base as the base image:
- Create the Dockerfile:
FROM registry.redhat.io/openshift4/ose-jenkins-agent-base COPY helm /usr/bin/helm ---> untar helm-linux-amd64.tar.gz(Helm 3 CLI) to get helm client. RUN chmod +x /usr/bin/helm
- Build the image:
podman build -t quay.io/<User-ID>/jenkins-helm-agent:v0.1 .
- Push the image to the repository:
podman push quay.io/<USER-ID>/jenkins-helm-agent:v0.1
Note: You can also push the image to the OpenShift internal image registry.
Configure pod templates in Jenkins
Next, configure the pod templates for the new Helm agent:
- Open the Jenkins console. Click Manage Jenkins —> Manage Nodes and Clouds —> Configure Clouds.
- Add new pod templates for the Helm agent and enter
helm
in the Name and Labels fields, as shown in Figure 3.
Build the Jenkins pipeline stages
Build the pipeline stages:
- Add the repo:
stage("add Repo") { steps { sh "helm repo add shailendra ${repo}" } }
- Deploy the chart to DEV/UAT:
stage("Deploy to Dev") { steps { script{ openshift.withCluster(){ sh "helm upgrade --install my-guestbook shailendra/guestbook --values dev/values.yaml -n dev --wait" } } } }
Sample Jenkinsfile:
def repo="https://shailendra14k.github.io/sample-helm-chart/"
pipeline{
agent{
label 'helm'
}
stages{
stage("add Repo") {
steps {
sh "helm repo add shailendra ${repo}"
}
}
stage("Deploy to Dev") {
steps {
script{
openshift.withCluster(){
sh "helm upgrade --install helm-app shailendra/sample-app --values dev/values.yaml -n dev --wait"
}
}
}
}
stage("Deploy to UAT") {
steps {
script{
openshift.withCluster(){
sh "helm upgrade --install helm-app shailendra/sample-app --values uat/values.yaml -n uat --wait"
}
}
}
}
}
}
Deploy the pipeline
Now, you can deploy the pipeline:
- Open the Jenkins console and click New Item.
- Enter the name and select Pipeline.
- Go to the Pipeline tab.
- Select Pipeline script from SCM and provide the GitHub link that points to the Jenkinsfile:
https://github.com/shailendra14k/sample-helm-chart.git
. See Figure 4.
Run and verify the pipeline
Finally, run and verify the pipeline:
- Run the pipeline by clicking Build Now (see Figure 5) and then verify the output.
Figure 5: Running the pipeline. - Verify application deployment on the
DEV
namespace:oc get all -n dev NAME READY STATUS RESTARTS AGE pod/helm-app-sample-app-7b6bd8f757-bqzq7 1/1 Running 0 92s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/helm-app-sample-app ClusterIP 172.30.20.99 6379/TCP 92s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/helm-app-sample-app 1/1 1 1 92s NAME DESIRED CURRENT READY AGE replicaset.apps/helm-app-sample-app-7b6bd8f757 1 1 1 93s
- Review the Helm chart status:
helm list -A NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION helm-app dev 2 2021-02-21 19:40:41.251103914 +0000 UTC deployed sample-app-0.1.0 1.16.0 helm-app uat 2 2021-02-21 19:40:47.85977876 +0000 UTC deployed sample-app-0.1.0 1.16.0
Conclusion
Thanks for reading! I hope this article helps you get started with Helm CI/CD on OpenShift.
Last updated: August 24, 2022