Search code examples
jenkinsjenkins-pipeline

Missing Required Parameter in Docker File


I'm learning how to use Jenkins and jenkinsfile for my CI/CD project, and when trying to run a docker image to run my selenium tests against, an error is thrown saying that the docker image param is missing.

I've followed the docks on the jenkins site for a tutorial and I'm now trying to fit that for my own purposes.

pipeline {
agent any

stages {
    stage('Build') {
        steps {
            echo 'Building..'
            sh 'npm install'
        }
    }
    stage('Test') {
        steps {
            echo 'Testing..'
             docker {
                        image 'selenium/standalone-firefox:3.141.59-gold' 
                        args '-p 4444:4444' 
                }
            sh 'npm test'
        }
    }
    stage('Deploy') {
        steps {
            echo 'Deploying....'
        }
    }
 }
}

Docker should run on my Ubuntu server with port 4444 of the docker exposed and mapped to port 4444 of the server.


Solution

  • You used Declarative Pipeline for your Jenkinsfile, not Scripted Pipeline. For Declarative Pipeline, the docker is a directive which can only be used to specify agent for entire pipeline or stage as following:

    pipeline {
       agent { // specify docker container for entire pipeline
          docker {
             image ''
             args ''
          }
       }
    }
    
    stage('test') {
       agent { // all steps of this stage will be executed inside this docker container
          docker {
             image ''
             args ''
          }
       }
    }
    

    You can't use this docker directive as pipeline step, like sh, 'echo'.

    Jenkins indeed supply a docker DSL which can be directly used in Scripted Pipeline.

    Declarative Pipeline supply a step script in where we can put Scripted Pipeline-liked script as following:

    stage('test') {
      steps {
        script {
          def version = ....
          def img = docker.build(...)
          img.push()
    
          docker.image(...).inside(){}
        }
      }
    }
    

    Thus you can change your Jenkinsfile as following and give a trying.

    pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                echo 'Building..'
                sh 'npm install'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
                script {
                    docker.image('selenium/standalone-firefox:3.141.59-gold')
                          .inside('-p 4444:4444'){}
                }
                sh 'npm test'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
     }
    }
    

    By default the Docker Pipeline integrates assumes the default Docker Registry of Docker Hub.

    If you intend to use use a custom Docker Registry, you can use docker.withRegistry to specify the custom Registry URL and Credentials as following:

    stage('Test') {
        steps {
            echo 'Testing..'
    
                script {
                    docker.withRegistry('<custom docker registry>', 
                                        '<credentialsId for custom docker registry if required>') {
                        docker.image('selenium/standalone-firefox:3.141.59-gold')
                              .inside('-p 4444:4444'){}
                    }
                }
            sh 'npm test'
        }
    }
    

    Note: If the custom docker registry need credentails, you have to add your account for custom docker registry into Jenkins via Jenkins Credentials. After adding, Jenkins will assign a id for your account, the id called credentialsId which used in above code.