CI/CD Jenkins setup with docker image for Cucumber (BDD) projects.

 

Jenkins ( cloudbees ) set up for running BDD script from git hub

  1. Create a maven project for BDD push the script in git hub.

         https://github.com/sumankumar01/JenkinsExecutionWithDocker

Jenkinsfile.

def network='jenkins-${BUILD_NUMBER}'

def seleniumHub='selenium-hub-${BUILD_NUMBER}'

def chrome='chrome-${BUILD_NUMBER}'

def firefox='firefox-${BUILD_NUMBER}'

def containertest='conatinertest-${BUILD_NUMBER}'

  def MODL='cucumber.api.cli.Main --glue "StepDefinitions" classpath:Features'

pipeline {

 

        agent {

                any {

                    image 'maven:3-alpine'

                    args '-v $HOME/.m2:/root/.m2'

                }

            }

 

   stages{

      stage('Setting Up Selenium Grid') {

         steps{     

                sh "docker run -d -P -p 4444:4444 --name ${seleniumHub} selenium/hub"

                sh  "docker run -d -P  -p 5900:5900 --link ${seleniumHub}:hub  --name ${chrome} selenium/node-chrome-    debug:3.141.59-yttrium"   

         }

      }

       stage('Build Jar') {

            steps {

                sh 'mvn clean package -DskipTests'

            }

        }

        stage('Build Image') {

            steps {

                script {

                  app = docker.build("vagrant/containertest")

                  sh "pwd"

                }

            }

        }

      stage('Run Test') {

         steps{

          

                 sh "docker run --rm -e SELENIUM_HUB=${seleniumHub} -e BROWSER=chrome  -v ${WORKSPACE}/target:/usr/share/suman/ vagrant/containertest"

                  archiveArtifacts artifacts: 'target/**', fingerprint: true

         }

      }

      stage('Tearing Down Selenium Grid') {

          steps {

             //remove all the containers and volumes

             sh "docker rm -vf ${chrome}"

        sh "docker rm -vf ${seleniumHub}"

            

          }

        }  

   }

}

 DockerFile

FROM openjdk:8-jre-slim

 

WORKDIR /usr/share/suman

 

ADD /target/container-test-tests.jar container-test.jar

ADD  /target/libs libs

 

ADD pom.xml pom.xml

ENV BROWSER = chrome

ENV POMM  = AutomationPipeline

ENV SELENIUM_HUB = http://192.168.3.12:4444/wd/hub

 

ENTRYPOINT java -cp container-test.jar:libs/* -DseleniumHubHost=$SELENIUM_HUB -Dbrowser=$BROWSER cucumber.api.cli.Main --glue "StepDefinitions" classpath:Features /usr/share/suman/

 


2. Now set up Jenkins ( CloudBess ) for the execution and pull the script from git hub


3. Git, Jenkins, maven, Java8, docker should be cloud machine

4. Create a jenkins pipeline

   



6. We can see the running execution on through the VNC viewer

 Now Open VNC Viewer and put the port shown on terminal: Usually it   will be 5900: so put localhost:5900 on the VNC browser.

Video Link

Step by Step Video


Execute a script of Cucumber with Testng using Docker ( dockerfile, docker-compose-jenkins file)

https://github.com/sumankumar01/CucumberUsingTestngDocker

Runner class

 

package CucumberOptions;

 

import cucumber.api.CucumberOptions;

import cucumber.api.testng.AbstractTestNGCucumberTests;

 

@CucumberOptions(

             // features={"\\src\\test\\resources\\Features\\"},

             features = { "src//test//resources//Features" },

 

             plugin = { "html:target/cucumber-html-report", "json:target/cucumber.json", "pretty:target/cucumber-pretty.txt",

                           "com.cucumber.listener.ExtentCucumberFormatter:target/cucumber-reports/report.html",

                           "usage:target/cucumber-usage.json", "junit:target/cucumber-results.xml", "rerun:target/rerun.txt" },

 

             tags = { "@Registartion" },

             // dryRun=true,

 

             glue = { "StepDefinitions" }

 

)

public class TestRunner extends AbstractTestNGCucumberTests {

 

}

 

dockerfile

 

FROM openjdk:8u191-jre-alpine3.8

 

RUN apk add curl jq

 

# Workspace

WORKDIR /usr/share/suman

 

ADD /target/container-test-tests.jar container-test.jar

ADD  /target/libs libs

 

# in case of any other dependency like .csv / .json / .xls

# please ADD that as well

 

# ADD suite files

# ADD testng.xml                        not using

# ADD testng1.xml                             not using

 

# ADD health check script

ADD healthcheck.sh  healthcheck.sh

 

ENV  BROWSER=chrome

ENV HUB_HOST=http://192.168.3.12:4444/wd/hub

# MODULE

 

ENTRYPOINT sh healthcheck.sh

 docker-compose.yaml file

 

version: "3"

services:

  hub:

   image: selenium/hub:3.14

   ports:

    - "4444:4444"

  chrome:

    image: selenium/node-chrome-debug:3.141.59-yttrium

    ports:

     - "5900:5900"

    depends_on:

     - hub

    environment:

     - HUB_HOST=hub

  bdd:

    image: vagrant/containertest

    depends_on:

      - chrome

    environment:

      - HUB_HOST=hub

      - BROWSER=chrome

      - CUCUMBER_OPTIONS=classpath:Features

    volumes:

      - ./output://usr/share/suman/target/cucumber-reports

 

Script.sh file ( use in docker file )

 

echo "Checking if hub is ready - $HUB_HOST"

 

while [ "$( curl -s http://$HUB_HOST:4444/wd/hub/status | jq -r .value.ready )" != "true" ]

do

       sleep 1

done

 

 java -cp  container-test.jar:container-test-tests.jar:libs/* \

     -DHUB_HOST=$HUB_HOST \

    -DBROWSER=$BROWSER \

   -Dcucumber.options="classpath:Features" org.testng.TestNG  -testclass  CucumberOptions.TestRunner /usr/share/suman/

  


Jenkins file

 

def network='jenkins-${BUILD_NUMBER}'

def seleniumHub='selenium-hub-${BUILD_NUMBER}'

def chrome='chrome-${BUILD_NUMBER}'

def firefox='firefox-${BUILD_NUMBER}'

def containertest='conatinertest-${BUILD_NUMBER}'

  def MODL='cucumber.api.cli.Main --glue "StepDefinitions" classpath:Features'

pipeline {

 

        agent {

                any {

                    image 'maven:3-alpine'

                    args '-v $HOME/.m2:/root/.m2'

                }

            }

  

 

   stages{

      stage('Setting Up Selenium Grid') {

         steps{     

        

         //docker run -d -P -p 5900:5900 --link selenium-hub:hub selenium/node-chrome-debug:3.141.59-yttrium

         //docker run -d -P -p 5901:5900 --link selenium-hub:hub selenium/node-firefox-debug:3.141.59-yttrium 

          //  sh "docker network create ${network}"

         //   sh "docker run -d -p 4444:4444 --name ${seleniumHub} --network ${network} selenium/hub"

           // sh "docker run -d -e HUB_PORT_4444_TCP_ADDR=${seleniumHub} -e HUB_PORT_4444_TCP_PORT=4444 --network ${network} --name ${chrome} -p 5900:32768 selenium/node-chrome-debug:3.141.59-yttrium"

         //sh "docker run -d -e HUB_PORT_4444_TCP_ADDR=${seleniumHub} -e HUB_PORT_4444_TCP_PORT=4444 --network ${network} --name ${firefox} -p 5901:32769 selenium/node-firefox-debug"

        //sh "docker run -d --rm -i --name zalenium -p 4444:4444  -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/videos:/home/seluser/videos --privileged dosel/zalenium start"

                //sleep(time:80,unit:"SECONDS")

               

                //sh "docker run -d -P -p 4444:4444 --name ${seleniumHub} selenium/hub"

              // sh  "docker run -d -P  -p 5900:5900 --link ${seleniumHub}:hub  --name ${chrome} selenium/node-chrome-debug:3.141.59-yttrium"

              //  sh "docker-compose up"

              sh "pwd"

       

         }

      }

       stage('Build Jar') {

      

        

            

          

            steps {

                sh 'sudo mvn clean package -DskipTests -Dmaven.clean.failOnError=false'

            }

        }

        stage('Build Image') {

            steps {

                script {

                      // vinsdocker/containertest => organization/application - it could be anything

                  app = docker.build("vagrant/containertest")

                                  sh "pwd"

                }

            }

        }

      stage('Run Test') {

         steps{

          

                  // a directory 'search' is created for container test-output

                 // sh "docker run --rm -e SELENIUM_HUB=${seleniumHub} -e BROWSER=chrome  -v ${WORKSPACE}/target:/usr/share/suman/ --network ${network} vagrant/containertest"

                //sh "docker run --rm -e SELENIUM_HUB=${seleniumHub} -e BROWSER=chrome  -v ${WORKSPACE}/target:/usr/share/suman/ vagrant/containertest"

                  //archive all the files under 'search' directory

                 

                //  sh "docker-compose up"

                  sh "pwd"

                    sh "docker-compose up"

         

                 

                  archiveArtifacts artifacts: 'target/**', fingerprint: true

           

                           

           

         }

      }

      stage('Tearing Down Selenium Grid') {

          steps {

             //remove all the containers and volumes

             sh "docker rm -vf ${chrome}"

           // sh "docker rm -vf ${firefox}"

        sh "docker rm -vf ${seleniumHub}"

            // sh "docker network rm ${network}"

          //  sh 'docker stop zalenium'

          }

        }  

   }

}

 




Comments

Popular posts from this blog

Running selenium script from AWS using jenkins