Jenkins Setup for comprehensive ERP testing

Automated Testing Tools are used to assure modifications are always backward compatible and safe for production
Forum rules
This forum is personally pruned to avoid redundant posts. Related topics are moved to the same sub-forum. Language will be corrected for readability.

Jenkins Setup for comprehensive ERP testing

Postby red1 » Thu Dec 01, 2011 4:30 am

This documents the way Jenkins Continuous Integration Build Server is set up to give a comprehensive Quality Assurance environment for the ADempiere361/iDempiere project. You can see a live demo at http://berliserv.net:8080/
Sequence of testing:
1. adempiere361
2. Database
3. Silentsetup
4. Server2
5. WebUITesting

jenkinsCompletePanel.png
jenkinsCompletePanel.png (168.2 KiB) Viewed 5647 times

The above has projects set up for the pulling of any code change from the trunk repository, then build it, apply the database seed and migration scripts since last release, and then run Fitnesse business logic tests for the Java client, then run the application server, and run the Selenium testing of the ZK Web interface. Lastly you can test the RUN_Server2Stop of the Apps Server.

jenkinsSuccess.png
jenkinsSuccess.png (155.8 KiB) Viewed 5647 times

Above is the Selenium testing that opens the Webstore, check a product category, login into the ZK UI, search for the Sales Order item, launch it, create a new Std Order, assign a Business Partner and Warehouse, creates two orderlines of different products and qtys, toggle the gridviews, then return to the main tab and confirm the order.

There is Selenium grid to use but there are sometimes conflicts within the Debian server that hosts these and you may have to setup the following:
1. Firefox profile from headless Firefox in the Debian server
2. An init.d script for Selenium to run in the background
3. Jboss of ADempiere set to another port as it conflicts with port 4444 of Selenium

In next post will be the init.d script, Jenkins build and bash shell scripts. All work is committed to http://adempiere.svn.sourceforge.net/vi ... eleniumHS/

Main persons to thank are banym Dominik Zajac of BayCIX / D2C2 of Munich, Germany,
didiber Dietmar Berlinger of PROMANDANT AUSTRIA.

THIS CONTRIBUTION IS SPONSORED BY SYSNOVA (Thanks to ZeeShan).
red1
Site Admin
 
Posts: 2759
Joined: Tue Jul 06, 2004 3:01 pm
Location: Kuala Lumpur, Malaysia

Re: Jenkins Setup for comprehensive ERP testing

Postby red1 » Thu Dec 01, 2011 5:16 am

The following are scripts mentioned above. Later we will see how to config the whole Jenkins' projects.
The scripts are numbered from 01_ to 02_ for easy tracking of sequential order how they are meant to be used.

Code: Select all
#!/bin/bash
#01_install_db.sh
#This script install Imports ADempiere dump and apply latest migration scripts
# from /migration/360lts.010-release
#Author: Dominik Zajac
#Maintainer: red1@red1.org
#Date: 11-27-2011
#Version: 0.1.0

set -x
WORKSPACE=/var/lib/jenkins/jobs/adempiere361/workspace
SCRIPTHOME=/opt/adempiere_database_tool

#Remove existing database
/usr/bin/dropdb -U adempiere  adempiere
echo "COMMENT: Old Database removed";

#Import new fresh database
/usr/bin/createdb -U adempiere adempiere
echo "COMMENT: Database created";
/usr/bin/psql -U adempiere adempiere < $SCRIPTHOME/adempiere.dump
echo "COMMENT: Database imported";

#Apply migration scripts
$WORKSPACE/migration/migrate_postgresql.sh \
$WORKSPACE/migration/360lts.010-release commit \
|psql -U adempiere -d adempiere

echo "COMMENT: Migration scripts applied"


Code: Select all
#!/bin/bash
#02_silentsetup.sh
#This script starts deploy binary to ADEMPIERER HOME and apply properties for setup
#Author: Dietmar Berlinger (based on Dominik Zajac et al)
#Maintainer: red1@red1.org
#Date: 11-27-2011
#Version: 0.1.0

set -x
#export JAVA_HOME=/usr/lib/jvm/java-6-sun
WORKSPACE=/var/lib/jenkins/jobs/adempiere361/workspace
ADEMPIEREHOME=$WORKSPACE/adempiere

#REPLACING ADEMPIEREHOME WITH NEW BINARY BUILT BY JENKINS
echo "COMMENT: Deleting Binary and Untar zip to it";
rm -r $ADEMPIEREHOME/*
cp $WORKSPACE/../lastSuccessful/archive/install/build/Adempiere_360LTS.010.tar.gz $ADEMPIEREHOME
cd $ADEMPIEREHOME

#untar binary and copy over previous properties
tar -xf Adempiere_360LTS.010.tar.gz --no-same-owner
cp /opt/save_AD_properties/*.properties $ADEMPIEREHOME/Adempiere
echo "Copied properties from save_AD_properties"

#RUN silent setup
cd  $ADEMPIEREHOME/Adempiere
echo "change to ADempiere directory"
chmod -R +x *.sh
cd utils/
chmod -R +x *.sh
cd ..
./RUN_silentsetup.sh

echo "COMMENT: Silent Setup run finished";


Code: Select all
#!/bin/bash
#03_Server2.sh
#This script starts up ADempiere Web Server
#Author: Dietmar Berlinger (based on Dominik Zajac et al)
#Maintainer: red1@red1.org
#Date: 11-27-2011
#Version: 0.1.0

set -x
WORKSPACE=/var/lib/jenkins/jobs/adempiere361/workspace
ADEMPIEREHOME=$WORKSPACE/adempiere
cd $ADEMPIEREHOME/Adempiere

#run web application server - RUN_Server2 on a different thread / in the background
#nohup $ADEMPIEREHOME/Adempiere/utils/RUN_Server2.sh &
cd $ADEMPIEREHOME/Adempiere/utils/
#running it directly seems ok and Jenkins green light can pulsate.
./RUN_Server2.sh
echo "COMMENT: Apps and Web Server started"


Code: Select all
#!/bin/bash
#04_WebUITesting.sh
#This script carries out Selenium tests
#Author Dietmar Berlinger / red1 (based on Dominik Zajac et al)
#Date: 11-16-2011
#Version: 0.1.0

set -x
export SELENIUMHOME=/var/lib/jenkins/jobs/WebUITesting/workspace/lib
export CLASSPATH="$SELENIUMHOME/AD_Selenium.jar:$SELENIUMHOME/junit-4.8.1.jar:$SELENIUMHOME/selenium-java-client-driver.jar"
export PATH="$PATH:/usr/lib/iceweasel"

#run Selenium service
cd $SELENIUMHOME

#FOR LOCAL - NOT JENKINS
#nohup java -jar selenium-server-standalone-2.11.0.jar &

#JENKINS HAS SELENIUM GRID PLUGIN
echo "COMMENT: Make sure you have Selenium Grid in Jenkins panel";

#run tests
#REFERS TO SELENIUM.PROPERTIES - ENSURE URL POINTS TO YOUR SERVER2 INSTANCE

java org.junit.runner.JUnitCore org.adempiere.test.junit.NewSOTestCase
echo "COMMENT: Selenium tests in progress on Web UI";


Code: Select all
#!/bin/bash
#05_Server2Stop.sh
#This script stop ADempiere Web Server
#Author: Dietmar Berlinger (based on Dominik Zajac et al)
#Maintainer: red1@red1.org
#Date: 11-27-2011
#Version: 0.1.0

set -x
WORKSPACE=/var/lib/jenkins/jobs/adempiere361/workspace
ADEMPIEREHOME=$WORKSPACE/adempiere

#run web application server - SERVER STOP
cd $ADEMPIEREHOME/Adempiere/utils
$ADEMPIEREHOME/Adempiere/utils/RUN_Server2Stop.sh

#nohup /var/lib/jenkins/jobs/adempiere361/workspace/adempiere/Adempiere/utils/R$

echo "COMMENT: Apps and Web Server STOP"


Below is the code based on Heng Sin's work and some enhancement in ADempiere361 by Carlos Ruiz.

Code: Select all
/**********************************************************************
* This file is part of Adempiere ERP Bazaar                           *
* http://www.adempiere.org                                            *
*                                                                     *
* Copyright (C) Low Heng Sin                                          *
*                                                                     *
* This program is free software; you can redistribute it and/or       *
* modify it under the terms of the GNU General Public License         *
* as published by the Free Software Foundation; either version 2      *
* of the License, or (at your option) any later version.              *
*                                                                     *
* This program is distributed in the hope that it will be useful,     *
* but WITHOUT ANY WARRANTY; without even the implied warranty of      *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the        *
* GNU General Public License for more details.                        *
*                                                                     *
* You should have received a copy of the GNU General Public License   *
* along with this program; if not, write to the Free Software         *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,          *
* MA 02110-1301, USA.                                                 *
*                                                                     *
* Contributors:                                                       *
* - Redhuan D. Oon - www.red1.org                              *
* ********************************************************************/

package org.adempiere.test.junit;

import com.thoughtworks.selenium.*;

import java.io.IOException;
import java.net.URL;
import java.util.Properties;

public class NewSOTestCase extends SeleneseTestCase {
   String password = null;
   Properties properties = new Properties();

   public void setUp() throws Exception {
      try {
         URL url = ClassLoader.getSystemResource("selenium.properties");
          properties.load(url.openStream());
          password = properties.getProperty("password");
      } catch (IOException e) {
         e.printStackTrace();
      }
      setUp(properties.getProperty("URI")+properties.getProperty("browser"));
   }
   public void testUntitled() throws Exception {

      //red1 - login to main link and click on Webstore
      selenium.open("/admin/adempiere.html");   
      Thread.sleep(1000);
      selenium.click("link=Web Store");
      Thread.sleep(1000);

      // - verify default pricelist exist
      verifyTrue(selenium.isTextPresent("Price List: Standard 2003 (2) -"));

      //verify product category content
      selenium.select("id=ID_M_Product_Category_ID", "label=Tools");
      Thread.sleep(1000);
      selenium.click("name=Submit");
      Thread.sleep(1000);
      verifyTrue(selenium.isTextPresent("Rake Metal"));
      
      //go to ZK Ajax UI
      selenium.open("/webui/index.zul");   
      selenium.type("//input[starts-with(@id, 'txtUserId_')]", "SuperUser");
      selenium.fireEvent("//input[starts-with(@id, 'txtUserId_')]", "blur");
      Thread.sleep(1000);
      selenium.focus("//input[starts-with(@id, 'txtPassword_')]");
      selenium.type("//input[starts-with(@id, 'txtPassword_')]", password);
      selenium.fireEvent("//input[starts-with(@id, 'txtPassword_')]", "blur");
      Thread.sleep(1000);
      selenium.focus("//input[starts-with(@id, 'lstLanguage_')]");
      selenium.fireEvent("//input[starts-with(@id, 'lstLanguage_')]", "blur");
      Thread.sleep(2000);
      selenium.click("//table[starts-with(@id, 'Ok_')]");
      for (int second = 0;; second++) {
         if (second >= 60) fail("timeout");
         try {            
            if (selenium.isElementPresent("//input[starts-with(@id, 'lstRole_')]")) break;
         } catch (Exception e) {}
         Thread.sleep(1000);
      }
      String role = properties.getProperty("role");
      selenium.type("//input[starts-with(@id, 'lstRole_')]", role);
      selenium.fireEvent("//input[starts-with(@id, 'lstRole_')]", "blur");
      Thread.sleep(1000);
      String organization = properties.getProperty("organization");
      selenium.type("//input[starts-with(@id, 'lstOrganisation_')]", organization);
      selenium.fireEvent("//input[starts-with(@id, 'lstOrganisation_')]", "blur");
      String warehouse = properties.getProperty("warehouse");
      selenium.type("//input[starts-with(@id, 'lstWarehouse_')]", warehouse);
      selenium.fireEvent("//input[starts-with(@id, 'lstWarehouse_')]", "blur");
      Thread.sleep(2000);
      selenium.click("//table[starts-with(@id, 'Ok_')]");
      for (int second = 0;; second++) {
         if (second >= 120) fail("timeout");
         try {
            if (selenium.isElementPresent("//a[text()=\'"+role+"\']")) break;
         } catch (Exception e) {}
         Thread.sleep(1000);
      }   
      assertTrue(selenium.isElementPresent("//a[text()=\'"+role+"\']"));
      
      //open the Sales Order window with new Order and Orderline
      selenium.focus("//input[starts-with(@id, 'cmbSearch_')]");
      selenium.type("//input[starts-with(@id, 'cmbSearch_')]", "Sales Order");
      selenium.fireEvent("//input[starts-with(@id, 'cmbSearch_')]", "blur");      
      Thread.sleep(5000);      
      verifyTrue(selenium.isTextPresent("OrderOrder LineOrder TaxPayment Schedule"));
      selenium.click("//a[starts-with(@id, 'btnNew_')]");      
      Thread.sleep(1000);
      selenium.type("//input[starts-with(@id, 'Field_AD_Org_ID_')]","HQ");
      Thread.sleep(1000);
      selenium.fireEvent("//div[starts-with(@id, 'Field_AD_Org_ID_')]//input[1]", "blur");
      Thread.sleep(1000);
      selenium.type("//input[starts-with(@id, 'Field_M_Warehouse_ID_')]","HQ Warehouse");
      Thread.sleep(1000);
      selenium.fireEvent("//div[starts-with(@id, 'Field_M_Warehouse_ID_')]//input[1]", "blur");
      Thread.sleep(1000);
      selenium.type("//div[starts-with(@id, 'Field_C_BPartner_ID_')]//input[starts-with(@id, 'zk_comp_')]", "Joe");
      selenium.fireEvent("//div[starts-with(@id, 'Field_C_BPartner_ID_')]//input[1]", "blur");
      selenium.type("//input[starts-with(@id, 'Field_SalesRep_ID_')]", "GardenAdmin");
      selenium.fireEvent("//div[starts-with(@id, 'Field_SalesRep_ID_')]//input[1]", "blur");
      Thread.sleep(1000);
      selenium.click("//a[starts-with(@id, 'btnSave_')]");      
      Thread.sleep(1000);
       selenium.click("//button[starts-with(@id,'ADButtonTab1_')]");
       selenium.click("//a[starts-with(@id, 'btnToggle_')]");
         for (int second = 0;; second++) {
            if (second >= 120) fail("timeout");
            try {
               if (selenium.isElementPresent("//div[starts-with(@id, 'Field_M_Product_ID_')]//input[starts-with(@id, 'zk_comp_')]")) break;
            } catch (Exception e) {}
            Thread.sleep(1000);
         }
       Thread.sleep(5000);
       selenium.click("//a[starts-with(@id, 'btnToggle_')]");
       selenium.focus("//div[starts-with(@id,'Field_M_Product_ID_')]//div[1]//table[1]//tr[1]//td[1]//input[1]");
       Thread.sleep(1000);
       selenium.type("//div[starts-with(@id, 'Field_M_Product_ID_')]//div[1]//table[1]//tr[1]//td[1]//input[1]", "Seeder");
       Thread.sleep(1000);
       selenium.fireEvent("//div[starts-with(@id, 'Field_M_Product_ID_')]//div[1]//table[1]//tr[1]//td[1]//input[1]", "blur");
       Thread.sleep(1000);
       assertTrue(selenium.isElementPresent("//div[starts-with(@id, 'Field_M_Product_ID_')]//div[1]//table[1]//tr[1]//td[1]//input[1]"));
       
       selenium.focus("//div[starts-with(@id,'Field_QtyEntered_')]//div[1]//table[1]//tr[1]//td[1]//input[1]");
       Thread.sleep(1000);
       selenium.type("//div[starts-with(@id,'Field_QtyEntered_')]//div[1]//table[1]//tr[1]//td[1]//input[1]", "1");
       Thread.sleep(1000);
       selenium.fireEvent("//div[starts-with(@id,'Field_QtyEntered_')]//div[1]//table[1]//tr[1]//td[1]//input[1]", "blur");
       Thread.sleep(1000);
       selenium.click("//a[starts-with(@id, 'btnSave_')]");
       Thread.sleep(1000);
      
       //red1 trying another new OrderLine with different product
       selenium.click("//a[starts-with(@id, 'btnToggle_')]");
       Thread.sleep(1000);
       selenium.click("//a[starts-with(@id, 'btnNew_')]");   
       Thread.sleep(5000);      
       selenium.focus("//div[starts-with(@id,'Field_M_Product_ID_')]//div[1]//table[1]//tr[1]//td[1]//input[1]");
       Thread.sleep(1000);
       selenium.type("//div[starts-with(@id, 'Field_M_Product_ID_')]//div[1]//table[1]//tr[1]//td[1]//input[1]", "Hoe");
       Thread.sleep(5000);
       selenium.fireEvent("//div[starts-with(@id, 'Field_M_Product_ID_')]//div[1]//table[1]//tr[1]//td[1]//input[1]", "blur");
       Thread.sleep(5000);
       assertTrue(selenium.isElementPresent("//div[starts-with(@id, 'Field_M_Product_ID_')]//div[1]//table[1]//tr[1]//td[1]//input[1]"));
       
       selenium.focus("//div[starts-with(@id,'Field_QtyEntered_')]//div[1]//table[1]//tr[1]//td[1]//input[1]");
       Thread.sleep(5000);
       selenium.type("//div[starts-with(@id,'Field_QtyEntered_')]//div[1]//table[1]//tr[1]//td[1]//input[1]", "1");
       Thread.sleep(5000);
       selenium.fireEvent("//div[starts-with(@id,'Field_QtyEntered_')]//div[1]//table[1]//tr[1]//td[1]//input[1]", "blur");
       Thread.sleep(5000);
       selenium.click("//a[starts-with(@id, 'btnSave_')]");
       Thread.sleep(5000);
      
       //red1 trying to return to earlier tab and Complete order
       selenium.click("//button[starts-with(@id,'ADButtonTab0_')]");
       Thread.sleep(1000);
       selenium.click("//table[starts-with(@id, 'Field_DocAction_Order')]");
       Thread.sleep(1000);
       selenium.click("//table[starts-with(@id, 'Ok_')]");
       Thread.sleep(1000);
   }
   public static void main(String[] args) throws Exception {
      
      NewSOTestCase test = new NewSOTestCase();
      test.setUp();
      test.testUntitled();

   }
   
}


The /etc/init.d/Selenium start done by Dietmar Berlinger of PROMANDANT AUSTRIA.
This you add to sysstart rc in debian= update-rc.d selenium default

Code: Select all
[12/1/11 4:59:10 AM] didiber: sftp://jenkins@berliserv.net:8912
[12/1/11 5:14:14 AM] didiber: #!/bin/bash
# /etc/init.d/selenium
# debian-compatible selenium-grid startup script.
# Based on jenkins startups
# Praneeth Bodduluri <lifeeth[at]gmail.com>
# update-rc.d -n -f selenium start 90 2 3 4 5 . stop 10 0 1 6 .

### BEGIN INIT INFO
# Provides: selenium-grid
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start selenium at boot time
# Description: Controls selenium grid.
### END INIT INFO


PATH=/bin:/usr/bin:/sbin:/usr/sbin

DESC="Selenium Grid Hub"
NAME=selenium
SCRIPTNAME=/etc/init.d/$NAME
SELENIUM_HOME=/usr/local/selenium
LOG_DIR=/var/log/selenium
ERROR_LOG=$LOG_DIR/selenium_error.log
STD_LOG=$LOG_DIR/selenium_std.log
TMP_DIR=$SELENIUM_HOME/tmp
PID_FILE=$TMP_DIR/selenium.pid
JAVA=/usr/bin/java
SELENIUM_APP="$SELENIUM_HOME/selenium-server-standalone-2.11.0.jar"
USER=selenium
### END  CONFIG ###
case "${1:-''}" in
       'start')
               if test -f $PID_FILE
      then
                 PID=`cat $PID_FILE`
        if  ps --pid $PID >/dev/null  ;
        then
                       echo "Selenium is running...$PID"
              exit 0
                 else
                       echo "Selenium isn't running..."
                       echo "Removing stale pid file: $PID_FILE"
                 fi
               fi
                 
               echo "Starting Selenium..."
               #echo "COMMAND: su $USER -c \"$JAVA -jar $SELENIUM_APP >$STD_LOG 2>$ERROR_LOG &\""

      su $USER -c "$JAVA -jar $SELENIUM_APP >$STD_LOG 2>$ERROR_LOG &"
      error=$?
               if test $error -gt 0
               then
                  echo "${bon}Error $error! Couldn't start Selenium!${boff}"
               fi
               ps  -C java -o pid,cmd | grep $SELENIUM_APP  | awk {'print $1 '} > $PID_FILE
       ;;
       'stop')
               if test -f $PID_FILE
               then
                       echo "Stopping Selenium..."
                       PID=`cat $PID_FILE`
                       su $USER -c "kill -3 $PID"
                       if kill -9 $PID ;
                               then
                                       sleep 2
                                       test -f $PID_FILE && rm -f $PID_FILE
                               else
                                       echo "Selenium could not be stopped..."
                               fi
               else
                       echo "Selenium is not running."
               fi
               ;;
       'restart')
               if test -f $PID_FILE
               then
                       su $USER -c "kill -HUP `cat $PID_FILE`"
                       test -f $PID_FILE && rm -f $PID_FILE
                       sleep 1
         su $USER -c "$JAVA -jar $SELENIUM_APP >$STD_LOG 2>$ERROR_LOG &"
         error=$?
                    if test $error -gt 0
                  then
                     echo "${bon}Error $error! Couldn't start Selenium!${boff}"
                  fi
                  ps  -C java -o pid,cmd | grep $SELENIUM_APP  | awk {'print $1 '} > $PID_FILE

                       echo "Reload Selenium..."
               else
                       echo "Selenium isn't running..."
               fi
               ;;
       'status')
               if test -f $PID_FILE
      then
                 PID=`cat $PID_FILE`
        if  ps --pid $PID >/dev/null ;
        then
                       echo "Selenium is running...$PID"
                 else
                   echo "Selenium isn't running..."
                 fi
               else
                       echo "Selenium isn't running..."
               fi
               ;;
       *)      # no parameter specified
               echo "Usage: $SELF start|stop|restart|status"
               exit 1
       ;;
esac
red1
Site Admin
 
Posts: 2759
Joined: Tue Jul 06, 2004 3:01 pm
Location: Kuala Lumpur, Malaysia

Re: Jenkins Setup for comprehensive ERP testing

Postby red1 » Fri Dec 02, 2011 3:06 am

The following are Configure settings for each project in the Jenkins stack.

Firstly for the Project adempiere361. You can see the artifacts that it fetches also.

Screen Shot 2011-12-02 at 1.15.46 AM.png
Screen Shot 2011-12-02 at 1.15.46 AM.png (117.22 KiB) Viewed 5626 times

Here are screenshots for Project adempiere361 showing the affected settings. Those not shown here are blanks:

Screen Shot 2011-12-02 at 1.35.44 AM.png
Screen Shot 2011-12-02 at 1.35.44 AM.png (27.29 KiB) Viewed 5626 times


Screen Shot 2011-12-02 at 1.35.59 AM.png
Screen Shot 2011-12-02 at 1.35.59 AM.png (25.19 KiB) Viewed 5626 times

Next is Database which runs the 01_install_db.sh script to get the Postgresql database to the latest migration DB changes.

Screen Shot 2011-12-02 at 1.43.07 AM.png
Screen Shot 2011-12-02 at 1.43.07 AM.png (89.91 KiB) Viewed 5626 times


Screen Shot 2011-12-02 at 1.43.40 AM.png
Screen Shot 2011-12-02 at 1.43.40 AM.png (44.45 KiB) Viewed 5626 times

With code and DB done, we RUN_silentsetup:

Screen Shot 2011-12-02 at 1.53.37 AM.png
Screen Shot 2011-12-02 at 1.53.37 AM.png (38.91 KiB) Viewed 5626 times


Screen Shot 2011-12-02 at 1.53.05 AM.png
Screen Shot 2011-12-02 at 1.53.05 AM.png (44.71 KiB) Viewed 5626 times

Then (after Fitnesse - covered in another thread) we look at the Server2 project which will run 03_Server2.sh which as the name suggests, will RUN_Server2 shell script so that the Application and Web server will run and you can access the Web UI via http://berliserv.net:8088 but most important the Selenum tests can run off it.

Screen Shot 2011-12-02 at 1.46.31 AM.png
Screen Shot 2011-12-02 at 1.46.31 AM.png (55.61 KiB) Viewed 5626 times


Screen Shot 2011-12-02 at 1.46.55 AM.png
Screen Shot 2011-12-02 at 1.46.55 AM.png (44.57 KiB) Viewed 5626 times

After this is the Server2Stop step which is self-explanatory and similar to above does not have any source code management but the related script.

Lastly we see the Selenium testing which is not using the Selenium Grid plugin due to a conflict with Firefox profile finding. Thus the workaround is to run Selenium in the background and you can
even do that as another bash shell script in a separate project configuration.

Screen Shot 2011-12-02 at 2.47.47 AM.png
Screen Shot 2011-12-02 at 2.47.47 AM.png (49.57 KiB) Viewed 5626 times

In the above you see the artifacts taken from the SVN repository it is pointing to, and this is how easy Jenkins is making artifacts visible for further usage by the shell script.

Screen Shot 2011-12-02 at 2.59.00 AM.png
Screen Shot 2011-12-02 at 2.59.00 AM.png (61.11 KiB) Viewed 5626 times

Screen Shot 2011-12-02 at 2.59.11 AM.png
Screen Shot 2011-12-02 at 2.59.11 AM.png (37.55 KiB) Viewed 5626 times

Note in the above that you need the Xvnc plugin to set the DISPLAY number to the environment variable.
red1
Site Admin
 
Posts: 2759
Joined: Tue Jul 06, 2004 3:01 pm
Location: Kuala Lumpur, Malaysia


Return to Quality Assurance

Who is online

Users browsing this forum: No registered users and 1 guest

cron