You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by ns...@apache.org on 2017/07/28 23:22:33 UTC

[incubator-mxnet] branch master updated: Add post-build email notification & fix Windows CPU build (#7225)

This is an automated email from the ASF dual-hosted git repository.

nswamy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git


The following commit(s) were added to refs/heads/master by this push:
     new eb23742  Add post-build email notification & fix Windows CPU build (#7225)
eb23742 is described below

commit eb2374215de684b918df9e42a997f243a98a3707
Author: lxn2 <lx...@users.noreply.github.com>
AuthorDate: Fri Jul 28 16:22:31 2017 -0700

    Add post-build email notification & fix Windows CPU build (#7225)
    
    * Add post-build email to Jenkinsfile (#7207)
    
    Add post-build action to email if build failed. This branch will be used to test this Jenkinsfile.
    
    * Add post-build email notification & fix Windows CPU build (#7212)
    
    * Add post-build email to Jenkinsfile
    
    * Add post-build email notification & fix Windows CPU build
    
    * Add new variables to Jenkinsfile (#7220)
    
    * Add post-build email to Jenkinsfile
    
    * Add post-build email notification & fix Windows CPU build
    
    * Add variable definitions
---
 Jenkinsfile | 596 +++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 309 insertions(+), 287 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 26a96a4..613b88c 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -8,6 +8,10 @@ mx_lib = 'lib/libmxnet.so, lib/libmxnet.a, dmlc-core/libdmlc.a, nnvm/lib/libnnvm
 docker_run = 'tests/ci_build/ci_build.sh'
 // timeout in minutes
 max_time = 60
+// assign any caught errors here
+err = null
+// set build status to success by default
+currentBuild.result = "SUCCESS"
 
 // initialize source codes
 def init_git() {
@@ -38,18 +42,6 @@ def init_git_win() {
   }
 }
 
-stage("Sanity Check") {
-  timeout(time: max_time, unit: 'MINUTES') {
-    node('mxnetlinux') {
-      ws('workspace/sanity') {
-        init_git()
-        make('lint', 'cpplint rcpplint jnilint')
-        make('lint', 'pylint')
-      }
-    }
-  }
-}
-
 // Run make. First try to do an incremental make from a previous workspace in hope to
 // accelerate the compilation. If something wrong, clean the workspace and then
 // build from scratch.
@@ -84,134 +76,6 @@ echo ${libs} | sed -e 's/,/ /g' | xargs md5sum
 """
 }
 
-stage('Build') {
-  parallel 'CPU: Openblas': {
-    node('mxnetlinux') {
-      ws('workspace/build-cpu') {
-        init_git()
-        def flag = """ \
-DEV=1                         \
-USE_PROFILER=1                \
-USE_CPP_PACKAGE=1             \
-USE_BLAS=openblas             \
--j\$(nproc)
-"""
-        make("cpu", flag)
-        pack_lib('cpu')
-      }
-    }
-  },
-  'GPU: CUDA7.5+cuDNN5': {
-    node('mxnetlinux') {
-      ws('workspace/build-gpu') {
-        init_git()
-        def flag = """ \
-DEV=1                         \
-USE_PROFILER=1                \
-USE_BLAS=openblas             \
-USE_CUDA=1                    \
-USE_CUDA_PATH=/usr/local/cuda \
-USE_CUDNN=1                   \
-USE_CPP_PACKAGE=1             \
--j\$(nproc)
-"""
-        make('gpu', flag)
-        pack_lib('gpu')
-        stash includes: 'build/cpp-package/example/test_score', name: 'cpp_test_score'
-      }
-    }
-  },
-  'Amalgamation': {
-    node('mxnetlinux') {
-      ws('workspace/amalgamation') {
-        init_git()
-        make('cpu', '-C amalgamation/ USE_BLAS=openblas MIN=1')
-      }
-    }
-  },
-  'GPU: MKLML': {
-    node('mxnetlinux') {
-      ws('workspace/build-mklml') {
-        init_git()
-        def flag = """ \
-DEV=1                         \
-USE_PROFILER=1                \
-USE_BLAS=openblas             \
-USE_MKL2017=1                 \
-USE_MKL2017_EXPERIMENTAL=1    \
-USE_CUDA=1                    \
-USE_CUDA_PATH=/usr/local/cuda \
-USE_CUDNN=1                   \
-USE_CPP_PACKAGE=1             \
--j\$(nproc)
-"""
-        make('mklml_gpu', flag)
-        pack_lib('mklml')
-      }
-    }
-  },
-  'CPU windows':{
-    node('mxnetwindows') {
-      ws('workspace/build-cpu') {
-        withEnv(['OpenBLAS_HOME=C:\\mxnet\\openblas', 'OpenCV_DIR=C:\\mxnet\\opencv_vc14', 'CUDA_PATH=C:\\CUDA\\v8.0']) {
-          init_git_win()
-          bat """mkdir build_vc14_cpu
-cd build_vc14_cpu
-cmake -G \"Visual Studio 14 2015 Win64\" -DUSE_CUDA=0 -DUSE_CUDNN=0 -DUSE_NVRTC=0 -DUSE_OPENCV=1 -DUSE_OPENMP=1 -DUSE_PROFILER=1 -DUSE_BLAS=open -DUSE_LAPACK=1 -DUSE_DIST_KVSTORE=0 ${env.WORKSPACE}"""
-          bat 'C:\\mxnet\\build_vc14_cpu.bat'
-
-          bat '''rmdir /s/q pkg_vc14_gpu
-mkdir pkg_vc14_cpu\\lib
-mkdir pkg_vc14_cpu\\python
-mkdir pkg_vc14_cpu\\include
-mkdir pkg_vc14_cpu\\build
-copy build_vc14_cpu\\Release\\libmxnet.lib pkg_vc14_cpu\\lib
-copy build_vc14_cpu\\Release\\libmxnet.dll pkg_vc14_cpu\\build
-xcopy python pkg_vc14_cpu\\python /E /I /Y
-xcopy include pkg_vc14_cpu\\include /E /I /Y
-xcopy dmlc-core\\include pkg_vc14_cpu\\include /E /I /Y
-xcopy mshadow\\mshadow pkg_vc14_cpu\\include\\mshadow /E /I /Y
-xcopy nnvm\\include pkg_vc14_cpu\\nnvm\\include /E /I /Y
-del /Q *.7z
-7z.exe a vc14_cpu.7z pkg_vc14_cpu\\
-'''
-          stash includes: 'vc14_cpu.7z', name: 'vc14_cpu'
-         }
-        }
-       }
-     },
-     'GPU windows':{
-       node('mxnetwindows') {
-         ws('workspace/build-gpu') {
-           withEnv(['OpenBLAS_HOME=C:\\mxnet\\openblas', 'OpenCV_DIR=C:\\mxnet\\opencv_vc14', 'CUDA_PATH=C:\\CUDA\\v8.0']) {
-             init_git_win()
-             bat """mkdir build_vc14_gpu
-call "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\x86_amd64\\vcvarsx86_amd64.bat"
-cd build_vc14_gpu
-cmake -G \"NMake Makefiles JOM\" -DUSE_CUDA=1 -DUSE_CUDNN=1 -DUSE_NVRTC=1 -DUSE_OPENCV=1 -DUSE_OPENMP=1 -DUSE_PROFILER=1 -DUSE_BLAS=open -DUSE_LAPACK=1 -DUSE_DIST_KVSTORE=0 -DCUDA_ARCH_NAME=All -DCMAKE_CXX_FLAGS_RELEASE="/FS /MD /O2 /Ob2 /DNDEBUG" -DCMAKE_BUILD_TYPE=Release ${env.WORKSPACE}"""
-             bat 'C:\\mxnet\\build_vc14_gpu.bat'
-             bat '''rmdir /s/q pkg_vc14_gpu
-mkdir pkg_vc14_gpu\\lib
-mkdir pkg_vc14_gpu\\python
-mkdir pkg_vc14_gpu\\include
-mkdir pkg_vc14_gpu\\build
-copy build_vc14_gpu\\libmxnet.lib pkg_vc14_gpu\\lib
-copy build_vc14_gpu\\libmxnet.dll pkg_vc14_gpu\\build
-xcopy python pkg_vc14_gpu\\python /E /I /Y
-xcopy include pkg_vc14_gpu\\include /E /I /Y
-xcopy dmlc-core\\include pkg_vc14_gpu\\include /E /I /Y
-xcopy mshadow\\mshadow pkg_vc14_gpu\\include\\mshadow /E /I /Y
-xcopy nnvm\\include pkg_vc14_gpu\\nnvm\\include /E /I /Y
-del /Q *.7z
-7z.exe a vc14_gpu.7z pkg_vc14_gpu\\
-'''
-             stash includes: 'vc14_gpu.7z', name: 'vc14_gpu'
-           }
-         }
-       }
-  }
-}
-
 // Python unittest for CPU
 def python_ut(docker_type) {
   timeout(time: max_time, unit: 'MINUTES') {
@@ -234,168 +98,326 @@ def python_gpu_ut(docker_type) {
   }
 }
 
-stage('Unit Test') {
-  parallel 'Python2/3: CPU': {
-    node('mxnetlinux') {
-      ws('workspace/ut-python-cpu') {
-        init_git()
-        unpack_lib('cpu')
-        python_ut('cpu')
-      }
-    }
-  },
-  'Python2/3: GPU': {
-    node('mxnetlinux') {
-      ws('workspace/ut-python-gpu') {
-        init_git()
-        unpack_lib('gpu', mx_lib)
-        python_gpu_ut('gpu')
-      }
-    }
-  },
-  'Python2/3: MKLML': {
-    node('mxnetlinux') {
-      ws('workspace/ut-python-mklml') {
-        init_git()
-        unpack_lib('mklml')
-        python_ut('mklml_gpu')
-        python_gpu_ut('mklml_gpu')
-      }
-    }
-  },
-  'Scala: CPU': {
-    node('mxnetlinux') {
-      ws('workspace/ut-scala-cpu') {
-        init_git()
-        unpack_lib('cpu')
-        timeout(time: max_time, unit: 'MINUTES') {
-          sh "${docker_run} cpu make scalapkg USE_BLAS=openblas"
-          sh "${docker_run} cpu make scalatest USE_BLAS=openblas"
+try {
+    stage("Sanity Check") {
+      timeout(time: max_time, unit: 'MINUTES') {
+        node('mxnetlinux') {
+          ws('workspace/sanity') {
+            init_git()
+            make('lint', 'cpplint rcpplint jnilint')
+            make('lint', 'pylint')
+          }
         }
       }
     }
-  },
-  'R: CPU': {
-    node('mxnetlinux') {
-      ws('workspace/ut-r-cpu') {
-        init_git()
-        unpack_lib('cpu')
-        timeout(time: max_time, unit: 'MINUTES') {
-          sh "${docker_run} cpu rm -rf .Renviron"
-          sh "${docker_run} cpu mkdir -p /workspace/ut-r-cpu/site-library"
-          sh "${docker_run} cpu make rpkg USE_BLAS=openblas R_LIBS=/workspace/ut-r-cpu/site-library"
-          sh "${docker_run} cpu R CMD INSTALL --library=/workspace/ut-r-cpu/site-library mxnet_current_r.tar.gz"
-          sh "${docker_run} cpu make rpkgtest R_LIBS=/workspace/ut-r-cpu/site-library"
+
+    stage('Build') {
+      parallel 'CPU: Openblas': {
+        node('mxnetlinux') {
+          ws('workspace/build-cpu') {
+            init_git()
+            def flag = """ \
+    DEV=1                         \
+    USE_PROFILER=1                \
+    USE_CPP_PACKAGE=1             \
+    USE_BLAS=openblas             \
+    -j\$(nproc)
+    """
+            make("cpu", flag)
+            pack_lib('cpu')
+          }
         }
-      }
-    }
-  },
-  'R: GPU': {
-    node('mxnetlinux') {
-      ws('workspace/ut-r-gpu') {
-        init_git()
-        unpack_lib('gpu')
-        timeout(time: max_time, unit: 'MINUTES') {
-          sh "${docker_run} cpu rm -rf .Renviron"
-          sh "${docker_run} gpu mkdir -p /workspace/ut-r-gpu/site-library"
-          sh "${docker_run} gpu make rpkg USE_BLAS=openblas R_LIBS=/workspace/ut-r-gpu/site-library"
-          sh "${docker_run} gpu R CMD INSTALL --library=/workspace/ut-r-gpu/site-library mxnet_current_r.tar.gz"
-          sh "${docker_run} gpu make rpkgtest R_LIBS=/workspace/ut-r-gpu/site-library"
+      },
+      'GPU: CUDA7.5+cuDNN5': {
+        node('mxnetlinux') {
+          ws('workspace/build-gpu') {
+            init_git()
+            def flag = """ \
+    DEV=1                         \
+    USE_PROFILER=1                \
+    USE_BLAS=openblas             \
+    USE_CUDA=1                    \
+    USE_CUDA_PATH=/usr/local/cuda \
+    USE_CUDNN=1                   \
+    USE_CPP_PACKAGE=1             \
+    -j\$(nproc)
+    """
+            make('gpu', flag)
+            pack_lib('gpu')
+            stash includes: 'build/cpp-package/example/test_score', name: 'cpp_test_score'
+          }
+        }
+      },
+      'Amalgamation': {
+        node('mxnetlinux') {
+          ws('workspace/amalgamation') {
+            init_git()
+            make('cpu', '-C amalgamation/ USE_BLAS=openblas MIN=1')
+          }
         }
+      },
+      'GPU: MKLML': {
+        node('mxnetlinux') {
+          ws('workspace/build-mklml') {
+            init_git()
+            def flag = """ \
+    DEV=1                         \
+    USE_PROFILER=1                \
+    USE_BLAS=openblas             \
+    USE_MKL2017=1                 \
+    USE_MKL2017_EXPERIMENTAL=1    \
+    USE_CUDA=1                    \
+    USE_CUDA_PATH=/usr/local/cuda \
+    USE_CUDNN=1                   \
+    USE_CPP_PACKAGE=1             \
+    -j\$(nproc)
+    """
+            make('mklml_gpu', flag)
+            pack_lib('mklml')
+          }
+        }
+      },
+      'CPU windows':{
+        node('mxnetwindows') {
+          ws('workspace/build-cpu') {
+            withEnv(['OpenBLAS_HOME=C:\\mxnet\\openblas', 'OpenCV_DIR=C:\\mxnet\\opencv_vc14', 'CUDA_PATH=C:\\CUDA\\v8.0']) {
+              init_git_win()
+              bat """mkdir build_vc14_cpu
+    cd build_vc14_cpu
+    cmake -G \"Visual Studio 14 2015 Win64\" -DUSE_CUDA=0 -DUSE_CUDNN=0 -DUSE_NVRTC=0 -DUSE_OPENCV=1 -DUSE_OPENMP=1 -DUSE_PROFILER=1 -DUSE_BLAS=open -DUSE_LAPACK=1 -DUSE_DIST_KVSTORE=0 ${env.WORKSPACE}"""
+              bat 'C:\\mxnet\\build_vc14_cpu.bat'
+
+              bat '''rmdir /s/q pkg_vc14_cpu
+    mkdir pkg_vc14_cpu\\lib
+    mkdir pkg_vc14_cpu\\python
+    mkdir pkg_vc14_cpu\\include
+    mkdir pkg_vc14_cpu\\build
+    copy build_vc14_cpu\\Release\\libmxnet.lib pkg_vc14_cpu\\lib
+    copy build_vc14_cpu\\Release\\libmxnet.dll pkg_vc14_cpu\\build
+    xcopy python pkg_vc14_cpu\\python /E /I /Y
+    xcopy include pkg_vc14_cpu\\include /E /I /Y
+    xcopy dmlc-core\\include pkg_vc14_cpu\\include /E /I /Y
+    xcopy mshadow\\mshadow pkg_vc14_cpu\\include\\mshadow /E /I /Y
+    xcopy nnvm\\include pkg_vc14_cpu\\nnvm\\include /E /I /Y
+    del /Q *.7z
+    7z.exe a vc14_cpu.7z pkg_vc14_cpu\\
+    '''
+              stash includes: 'vc14_cpu.7z', name: 'vc14_cpu'
+             }
+            }
+           }
+         },
+         'GPU windows':{
+           node('mxnetwindows') {
+             ws('workspace/build-gpu') {
+               withEnv(['OpenBLAS_HOME=C:\\mxnet\\openblas', 'OpenCV_DIR=C:\\mxnet\\opencv_vc14', 'CUDA_PATH=C:\\CUDA\\v8.0']) {
+                 init_git_win()
+                 bat """mkdir build_vc14_gpu
+    call "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\x86_amd64\\vcvarsx86_amd64.bat"
+    cd build_vc14_gpu
+    cmake -G \"NMake Makefiles JOM\" -DUSE_CUDA=1 -DUSE_CUDNN=1 -DUSE_NVRTC=1 -DUSE_OPENCV=1 -DUSE_OPENMP=1 -DUSE_PROFILER=1 -DUSE_BLAS=open -DUSE_LAPACK=1 -DUSE_DIST_KVSTORE=0 -DCUDA_ARCH_NAME=All -DCMAKE_CXX_FLAGS_RELEASE="/FS /MD /O2 /Ob2 /DNDEBUG" -DCMAKE_BUILD_TYPE=Release ${env.WORKSPACE}"""
+                 bat 'C:\\mxnet\\build_vc14_gpu.bat'
+                 bat '''rmdir /s/q pkg_vc14_gpu
+    mkdir pkg_vc14_gpu\\lib
+    mkdir pkg_vc14_gpu\\python
+    mkdir pkg_vc14_gpu\\include
+    mkdir pkg_vc14_gpu\\build
+    copy build_vc14_gpu\\libmxnet.lib pkg_vc14_gpu\\lib
+    copy build_vc14_gpu\\libmxnet.dll pkg_vc14_gpu\\build
+    xcopy python pkg_vc14_gpu\\python /E /I /Y
+    xcopy include pkg_vc14_gpu\\include /E /I /Y
+    xcopy dmlc-core\\include pkg_vc14_gpu\\include /E /I /Y
+    xcopy mshadow\\mshadow pkg_vc14_gpu\\include\\mshadow /E /I /Y
+    xcopy nnvm\\include pkg_vc14_gpu\\nnvm\\include /E /I /Y
+    del /Q *.7z
+    7z.exe a vc14_gpu.7z pkg_vc14_gpu\\
+    '''
+                 stash includes: 'vc14_gpu.7z', name: 'vc14_gpu'
+               }
+             }
+           }
       }
     }
-  },
-  'Python2/3: CPU Win':{
-    node('mxnetwindows') {
-      ws('workspace/ut-python-cpu') {
-        init_git_win()
-        unstash 'vc14_cpu'
-        bat '''rmdir /s/q pkg_vc14_cpu
-7z x -y vc14_cpu.7z'''
-        bat """xcopy C:\\mxnet\\data data /E /I /Y
-xcopy C:\\mxnet\\model model /E /I /Y
-call activate py3
-set PYTHONPATH=${env.WORKSPACE}\\pkg_vc14_cpu\\python
-del /S /Q ${env.WORKSPACE}\\pkg_vc14_cpu\\python\\*.pyc
-C:\\mxnet\\test_cpu.bat"""
-                        bat """xcopy C:\\mxnet\\data data /E /I /Y
-xcopy C:\\mxnet\\model model /E /I /Y
-call activate py2
-set PYTHONPATH=${env.WORKSPACE}\\pkg_vc14_cpu\\python
-del /S /Q ${env.WORKSPACE}\\pkg_vc14_cpu\\python\\*.pyc
-C:\\mxnet\\test_cpu.bat"""
-      }
-     }
-   },
-   'Python2/3: GPU Win':{
-     node('mxnetwindows') {
-       ws('workspace/ut-python-gpu') {
-         init_git_win()
-         unstash 'vc14_gpu'
-         bat '''rmdir /s/q pkg_vc14_gpu
-7z x -y vc14_gpu.7z'''
-         bat """xcopy C:\\mxnet\\data data /E /I /Y
-xcopy C:\\mxnet\\model model /E /I /Y
-call activate py3
-set PYTHONPATH=${env.WORKSPACE}\\pkg_vc14_gpu\\python
-del /S /Q ${env.WORKSPACE}\\pkg_vc14_gpu\\python\\*.pyc
-C:\\mxnet\\test_gpu.bat"""
-         bat """xcopy C:\\mxnet\\data data /E /I /Y
-xcopy C:\\mxnet\\model model /E /I /Y
-call activate py2
-set PYTHONPATH=${env.WORKSPACE}\\pkg_vc14_gpu\\python
-del /S /Q ${env.WORKSPACE}\\pkg_vc14_gpu\\python\\*.pyc
-C:\\mxnet\\test_gpu.bat"""
-       }
-     }
-   }
-}
-
 
-stage('Integration Test') {
-  parallel 'Python': {
-    node('mxnetlinux') {
-      ws('workspace/it-python-gpu') {
-        init_git()
-        unpack_lib('gpu')
-        timeout(time: max_time, unit: 'MINUTES') {
-          sh "${docker_run} gpu PYTHONPATH=./python/ python example/image-classification/test_score.py"
+    stage('Unit Test') {
+      parallel 'Python2/3: CPU': {
+        node('mxnetlinux') {
+          ws('workspace/ut-python-cpu') {
+            init_git()
+            unpack_lib('cpu')
+            python_ut('cpu')
+          }
         }
-      }
-    }
-  },
-  'Caffe': {
-    node('mxnetlinux') {
-      ws('workspace/it-caffe') {
-        init_git()
-        unpack_lib('gpu')
-        timeout(time: max_time, unit: 'MINUTES') {
-          sh "${docker_run} caffe_gpu PYTHONPATH=/caffe/python:./python python tools/caffe_converter/test_converter.py"
+      },
+      'Python2/3: GPU': {
+        node('mxnetlinux') {
+          ws('workspace/ut-python-gpu') {
+            init_git()
+            unpack_lib('gpu', mx_lib)
+            python_gpu_ut('gpu')
+          }
         }
-      }
+      },
+      'Python2/3: MKLML': {
+        node('mxnetlinux') {
+          ws('workspace/ut-python-mklml') {
+            init_git()
+            unpack_lib('mklml')
+            python_ut('mklml_gpu')
+            python_gpu_ut('mklml_gpu')
+          }
+        }
+      },
+      'Scala: CPU': {
+        node('mxnetlinux') {
+          ws('workspace/ut-scala-cpu') {
+            init_git()
+            unpack_lib('cpu')
+            timeout(time: max_time, unit: 'MINUTES') {
+              sh "${docker_run} cpu make scalapkg USE_BLAS=openblas"
+              sh "${docker_run} cpu make scalatest USE_BLAS=openblas"
+            }
+          }
+        }
+      },
+      'R: CPU': {
+        node('mxnetlinux') {
+          ws('workspace/ut-r-cpu') {
+            init_git()
+            unpack_lib('cpu')
+            timeout(time: max_time, unit: 'MINUTES') {
+              sh "${docker_run} cpu rm -rf .Renviron"
+              sh "${docker_run} cpu mkdir -p /workspace/ut-r-cpu/site-library"
+              sh "${docker_run} cpu make rpkg USE_BLAS=openblas R_LIBS=/workspace/ut-r-cpu/site-library"
+              sh "${docker_run} cpu R CMD INSTALL --library=/workspace/ut-r-cpu/site-library mxnet_current_r.tar.gz"
+              sh "${docker_run} cpu make rpkgtest R_LIBS=/workspace/ut-r-cpu/site-library"
+            }
+          }
+        }
+      },
+      'R: GPU': {
+        node('mxnetlinux') {
+          ws('workspace/ut-r-gpu') {
+            init_git()
+            unpack_lib('gpu')
+            timeout(time: max_time, unit: 'MINUTES') {
+              sh "${docker_run} cpu rm -rf .Renviron"
+              sh "${docker_run} gpu mkdir -p /workspace/ut-r-gpu/site-library"
+              sh "${docker_run} gpu make rpkg USE_BLAS=openblas R_LIBS=/workspace/ut-r-gpu/site-library"
+              sh "${docker_run} gpu R CMD INSTALL --library=/workspace/ut-r-gpu/site-library mxnet_current_r.tar.gz"
+              sh "${docker_run} gpu make rpkgtest R_LIBS=/workspace/ut-r-gpu/site-library"
+            }
+          }
+        }
+      },
+      'Python2/3: CPU Win':{
+        node('mxnetwindows') {
+          ws('workspace/ut-python-cpu') {
+            init_git_win()
+            unstash 'vc14_cpu'
+            bat '''rmdir /s/q pkg_vc14_cpu
+    7z x -y vc14_cpu.7z'''
+            bat """xcopy C:\\mxnet\\data data /E /I /Y
+    xcopy C:\\mxnet\\model model /E /I /Y
+    call activate py3
+    set PYTHONPATH=${env.WORKSPACE}\\pkg_vc14_cpu\\python
+    del /S /Q ${env.WORKSPACE}\\pkg_vc14_cpu\\python\\*.pyc
+    C:\\mxnet\\test_cpu.bat"""
+                            bat """xcopy C:\\mxnet\\data data /E /I /Y
+    xcopy C:\\mxnet\\model model /E /I /Y
+    call activate py2
+    set PYTHONPATH=${env.WORKSPACE}\\pkg_vc14_cpu\\python
+    del /S /Q ${env.WORKSPACE}\\pkg_vc14_cpu\\python\\*.pyc
+    C:\\mxnet\\test_cpu.bat"""
+          }
+         }
+       },
+       'Python2/3: GPU Win':{
+         node('mxnetwindows') {
+           ws('workspace/ut-python-gpu') {
+             init_git_win()
+             unstash 'vc14_gpu'
+             bat '''rmdir /s/q pkg_vc14_gpu
+    7z x -y vc14_gpu.7z'''
+             bat """xcopy C:\\mxnet\\data data /E /I /Y
+    xcopy C:\\mxnet\\model model /E /I /Y
+    call activate py3
+    set PYTHONPATH=${env.WORKSPACE}\\pkg_vc14_gpu\\python
+    del /S /Q ${env.WORKSPACE}\\pkg_vc14_gpu\\python\\*.pyc
+    C:\\mxnet\\test_gpu.bat"""
+             bat """xcopy C:\\mxnet\\data data /E /I /Y
+    xcopy C:\\mxnet\\model model /E /I /Y
+    call activate py2
+    set PYTHONPATH=${env.WORKSPACE}\\pkg_vc14_gpu\\python
+    del /S /Q ${env.WORKSPACE}\\pkg_vc14_gpu\\python\\*.pyc
+    C:\\mxnet\\test_gpu.bat"""
+           }
+         }
+       }
     }
-  },
-  'cpp-package': {
-    node('mxnetlinux') {
-      ws('workspace/it-cpp-package') {
-        init_git()
-        unpack_lib('gpu')
-        unstash 'cpp_test_score'
-        timeout(time: max_time, unit: 'MINUTES') {
-          sh "${docker_run} gpu cpp-package/tests/ci_test.sh"
+
+    stage('Integration Test') {
+      parallel 'Python': {
+        node('mxnetlinux') {
+          ws('workspace/it-python-gpu') {
+            init_git()
+            unpack_lib('gpu')
+            timeout(time: max_time, unit: 'MINUTES') {
+              sh "${docker_run} gpu PYTHONPATH=./python/ python example/image-classification/test_score.py"
+            }
+          }
+        }
+      },
+      'Caffe': {
+        node('mxnetlinux') {
+          ws('workspace/it-caffe') {
+            init_git()
+            unpack_lib('gpu')
+            timeout(time: max_time, unit: 'MINUTES') {
+              sh "${docker_run} caffe_gpu PYTHONPATH=/caffe/python:./python python tools/caffe_converter/test_converter.py"
+            }
+          }
+        }
+      },
+      'cpp-package': {
+        node('mxnetlinux') {
+          ws('workspace/it-cpp-package') {
+            init_git()
+            unpack_lib('gpu')
+            unstash 'cpp_test_score'
+            timeout(time: max_time, unit: 'MINUTES') {
+              sh "${docker_run} gpu cpp-package/tests/ci_test.sh"
+            }
+          }
         }
       }
     }
-  }
-}
 
-stage('Deploy') {
-  node('mxnetlinux') {
-    ws('workspace/docs') {
-      if (env.BRANCH_NAME == "master") {
-        init_git()
-        sh "make docs"
+    stage('Deploy') {
+      node('mxnetlinux') {
+        ws('workspace/docs') {
+          if (env.BRANCH_NAME == "master") {
+            init_git()
+            sh "make docs"
+          }
+        }
       }
     }
-  }
+} catch (caughtError) {
+    node("mxnetlinux") {
+        sh "echo caught error"
+        err = caughtError
+        currentBuild.result = "FAILURE"
+    }
+} finally {
+    node("mxnetlinux") {
+        // Only send email if master failed
+        if (currentBuild.result == "FAILURE" && env.BRANCH_NAME == "master") {
+            emailext body: 'Build for MXNet branch ${BRANCH_NAME} has broken. Please view the build at ${BUILD_URL}', replyTo: '${EMAIL}', subject: '[BUILD FAILED] Branch ${BRANCH_NAME} build ${BUILD_NUMBER}', to: '${EMAIL}'
+        }
+        // Remember to rethrow so the build is marked as failing
+        if (err) {
+            throw err
+        }
+    }
 }

-- 
To stop receiving notification emails like this one, please contact
['"commits@mxnet.apache.org" <co...@mxnet.apache.org>'].