Fasten your safety belt, and departing …..
1. Create a pipeline job.
2. Setup your SCM and build from Jenkinsfile (sample provided below).
//////////////////// //Sample Jenkinsfile //////////////////// def AGENT_LABEL = "slave-${UUID.randomUUID().toString()}" def K8S_DEPLOYMENT_FILE = "k8s-service.yml" // This is where the dynamic slave magic happen, // it launch the agent using randomly generated number as k8s pod pipeline { agent { kubernetes { label "${AGENT_LABEL}" defaultContainer 'jenkins-jnlp-slave-docker' yamlFile 'k8s-jnlp-slave.yml' } } stages { stage('Build artifacts') { steps { // maven3 need to pre-configure in Jenkins // mavenSettingsConfig is optional when you have customize settings.xml file using Config File Management plugin withMaven(maven: 'maven3', mavenSettingsConfig: 'maven-settings') { sh "mvn clean install -Dmaven.test.skip=true" } } } stage('Build Docker Image') { steps { script { withEnv(["WORKSPACE=${pwd()}"]) { //docker-credential is credential set in Jenkins to authenticate against your docker registry docker.withRegistry("YOUR_NEXUS_REGISTRY", 'docker-credential') { def image = docker.build("YOUR_IMAGE_NAME", "PROJECT_DIR/Dockerfile .") image.push() } } } } } stage('Run kubernetes deployment') { steps { // kubeconfig is your kube config file which need to pre-configure in Jenkins as secret file // check step 5 below withKubeConfig([credentialsId: 'kubeconfig']) { sh "kubectl create -f ${K8S_DEPLOYMENT_FILE}" } } } } }
########################## #Sample k8s-jnlp-slave.yml ########################## apiVersion: v1 kind: Pod metadata: labels: name: jenkins-jnlp-slave-docker spec: containers: - name: jenkins-jnlp-slave-docker image: d1ck50n/jenkins-jnlp-slave-docker:latest command: ['cat'] tty: true imagePullPolicy: Always volumeMounts: - name: dockersock mountPath: "/var/run/docker.sock" imagePullSecrets: - name: tntcred volumes: - name: dockersock hostPath: path: /var/run/docker.sock
Jenkins slave is docker, and we will use it to build our docker images, which means we will need to have a docker engine inside Jenkins slave docker (a.k.a docker in docker). Since I’m not able to make use of ready made docker image available @ docker hub as my jenkins slave (I need jdk, maven, kubectl… too as my jenkins slave) , so I created my own based on jenkins/jnlp-slave image.
To achieve DoD, we map the docker.sock from the host to our container (‘dockersock’ in k8s-jnlp-slave.yml).
3. Install plugins as below:
4.Create jenkins kubernetes plugin by adding new entry.
5. Fill in configuration according to your kubernetes cluster or use your kube config file by adding credential as highlighted below:
6. Regardless you configure manually or using your customize kube config file, you need to test the connection.
7. Build your job and you should see a new node created and start building.
Source available @ github.
Credits to authors and websites below:
- https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
- https://medium.com/@gustavo.guss/jenkins-building-docker-image-and-sending-to-registry-64b84ea45ee9
- https://medium.com/lucjuggery/about-var-run-docker-sock-3bfd276e12fd
- https://medium.com/hootsuite-engineering/building-docker-images-inside-kubernetes-42c6af855f25
- https://estl.tech/accessing-docker-from-a-kubernetes-pod-68996709c04b