Use "label" or define a pod template in jenkinsfile for kubernetes-plugin?

4/23/2020

In General

I'm trying to use label when using kubernetes-plugin for Jenkins, but I get a little bit confused. In my pipeline bellow I'm trying to build test job in parallel steps with different labels (agents).

I already have configured the plugin with pod template and container in my Jenkins config, where I use same settings as it's in the pipeline podTemplate defined.

Issue

The problem is that when I use agent label in stage 2 there is jnpl image running instead the image that I point in the config someimage:latest.

In stage 1 where I define the pod in pipeline there is no problem and the required images are running fine.

Question

What I'm doing wrong? Here is my jenkinsfile and config of the kubernetes-plugin in Jenkins:

def podTemplate = """
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: k8s
    image: someimage:latest
    command:
    - sleep
    args:
    - infinity
    volumeMounts:
      - name: workspace-volume
        mountPath: /home/jenkins/agent
    workingDir: "/home/jenkins/agent"
  volumes:
      - name: "workspace-volume"
        persistentVolumeClaim:
          claimName: "jenkins-worker-pvc"
          readOnly: false
"""
pipeline {
    agent none
    stages {
        stage("Parallel") {
            parallel {
                stage("1.k8s") {
                    agent {
                        kubernetes {
                            yaml podTemplate
                            defaultContainer 'k8s'
                        }
                    }
                    steps {
                        sh """
                            mvn -version
                        """
                    }
                }
                stage("2. k8s") {
                    agent { label 'k8s' }
                    steps {
                        sh """
                            mvn -version
                        """
                    }
                }
                stage("win") {
                    agent { label 'windows' }
                    steps {
                        bat "dir"
                    }
                }
            }
        }
    }
}

enter image description here

-- airdata
jenkins
jenkins-pipeline
jenkins-plugins
kubernetes
kubernetes-jenkins-plugin

1 Answer

4/23/2020

You did not specified an image for stage with label k8s and windows.

You can read in the docs that:

The plugin creates a Kubernetes Pod for each agent started, defined by the Docker image to run, and stops it after each build.

Agents are launched using JNLP, so it is expected that the image connects automatically to the Jenkins master.

You are using podTemplate and I would advice setting up container , this might look like the following:

podTemplate(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(POD_LABEL) {
        stage('Get a Maven project') {
            git 'https://github.com/jenkinsci/kubernetes-plugin.git'
            container('maven') {
                stage('Build a Maven project') {
                    sh 'mvn -B clean install'
                }
            }
        }

        stage('Get a Golang project') {
            git url: 'https://github.com/hashicorp/terraform.git'
            container('golang') {
                stage('Build a Go project') {
                    sh """
                    mkdir -p /go/src/github.com/hashicorp
                    ln -s `pwd` /go/src/github.com/hashicorp/terraform
                    cd /go/src/github.com/hashicorp/terraform && make core-dev
                    """
                }
            }
        }

    }
}

You can read more about Container Configuration and Container Group Support

-- Crou
Source: StackOverflow