Installing Jenkins on Kubernetes for your CI and CD Pipelines sounds like a daunting task until you get to know that you can do that with Helm Charts.

The Helm Chart for Jenkins is avilable here.

Installation

First you need to specify your overrides in a YAML file. Let’ call it jenkins-values.yaml. Refer to values.yaml in the Helm Chart to figure out what can be overridden.

My overrides look like this.

Master:
  ServiceType: ClusterIP
  InstallPlugins:
      - kubernetes:0.12
      - workflow-aggregator:2.5
      - workflow-job:2.15
      - credentials-binding:1.13
      - git:3.5.1
      - pipeline-github-lib:1.0
      - ghprb:1.39.0
      - blueocean:1.1.7
      - ldap:1.20 
      - matrix-auth:2.2
      - slack:2.3
  AdminPassword: admin
  ScriptApproval:
      - "method groovy.json.JsonSlurperClassic parseText java.lang.String"
      - "method hudson.model.Actionable getActions"
      - "method java.lang.Class isInstance java.lang.Object"
      - "method jenkins.plugins.git.AbstractGitSCMSource$SCMRevisionImpl getHash"
      - "method jenkins.scm.api.SCMRevisionAction getRevision"
      - "method org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper getRawBuild"
      - "new groovy.json.JsonSlurperClassic"
      - "staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods toBoolean java.lang.Boolean"

You can use a shell script which looks like this to deploy your Helm Chart. Let’s call this deploy.sh. Pass two commandline to override the default Release Name and the Namespace.

#!/bin/bash

# Deploys Jenkins

RELEASE_NAME=${1:-jenkins}
NAMESPACE=${2:-default}

helm install -n $RELEASE_NAME --namespace $NAMESPACE -f ./jenkins-values.yaml stable/jenkins

Verification

To verify your installation, you can create a Pipeline Projects and run the Pipeline Script below.

def label = "mypod-${UUID.randomUUID().toString()}"

podTemplate(label: label, 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(label) {
        stage('Get a Maven project') {
            git 'https://github.com/jenkinsci/kubernetes-plugin.git'
            container('maven') {
                sh 'pwd'
                sh 'ls'
            }
        }

        stage('Get a Golang project') {
            git url: 'https://github.com/hashicorp/terraform.git'
            container('golang') {
                sh """
                pwd
                ls
                """
            }
        }

    }
}