0

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.

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

3 Comments

Alright, I'll try that when I get home. Do I have to do this even though the docker image I am pulling down is already a public docker?
For the credentials, I'm assuming they are seperated? And not in the same string?
Thank you for that update and expanded explanation. This does seem to solve my issue, I think. And now on to the next!
0

You can always run the docker using sh

sh''' 
    //your docker command here
'''

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.