diff --git a/docker-build-image-pipeline.groovy b/docker-build-image-pipeline.groovy
index cb0e3f9..2ec0ab6 100644
--- a/docker-build-image-pipeline.groovy
+++ b/docker-build-image-pipeline.groovy
@@ -15,60 +15,62 @@
 def gerrit = new com.mirantis.mk.Gerrit()
 def git = new com.mirantis.mk.Git()
 def dockerLib = new com.mirantis.mk.Docker()
-node("docker") {
-  def workspace = common.getWorkspace()
-  def imageTagsList = IMAGE_TAGS.tokenize(" ")
-  try{
+timeout(time: 12, unit: 'HOURS') {
+  node("docker") {
+    def workspace = common.getWorkspace()
+    def imageTagsList = IMAGE_TAGS.tokenize(" ")
+    try{
 
-    def buildArgs = []
-    try {
-      buildArgs = IMAGE_BUILD_PARAMS.tokenize(' ')
+      def buildArgs = []
+      try {
+        buildArgs = IMAGE_BUILD_PARAMS.tokenize(' ')
+      } catch (Throwable e) {
+        buildArgs = []
+      }
+      def dockerApp
+      docker.withRegistry(REGISTRY_URL, REGISTRY_CREDENTIALS_ID) {
+        stage("checkout") {
+           git.checkoutGitRepository('.', IMAGE_GIT_URL, IMAGE_BRANCH, IMAGE_CREDENTIALS_ID)
+        }
+
+        if (IMAGE_BRANCH == "master") {
+          try {
+            def tag = sh(script: "git describe --tags --abbrev=0", returnStdout: true).trim()
+            def revision = sh(script: "git describe --tags --abbrev=4 | grep -oP \"^${tag}-\\K.*\" | awk -F\\- '{print \$1}'", returnStdout: true).trim()
+            imageTagsList << tag
+            revision = revision ? revision : "0"
+            if(Integer.valueOf(revision) > 0){
+              imageTagsList << "${tag}-${revision}"
+            }
+            if (!imageTagsList.contains("latest")) {
+              imageTagsList << "latest"
+            }
+          } catch (Exception e) {
+            common.infoMsg("Impossible to find any tag")
+          }
+        }
+
+        stage("build") {
+          common.infoMsg("Building docker image ${IMAGE_NAME}")
+          dockerApp = dockerLib.buildDockerImage(IMAGE_NAME, "", "${workspace}/${DOCKERFILE_PATH}", imageTagsList[0], buildArgs)
+          if(!dockerApp){
+            throw new Exception("Docker build image failed")
+          }
+        }
+        stage("upload to docker hub"){
+          for(int i=0;i<imageTagsList.size();i++){
+            common.infoMsg("Uploading image ${IMAGE_NAME} with tag ${imageTagsList[i]}")
+            dockerApp.push(imageTagsList[i])
+          }
+        }
+      }
     } catch (Throwable e) {
-      buildArgs = []
+       // If there was an error or exception thrown, the build failed
+       currentBuild.result = "FAILURE"
+       currentBuild.description = currentBuild.description ? e.message + " " + currentBuild.description : e.message
+       throw e
+    } finally {
+       common.sendNotification(currentBuild.result,"",["slack"])
     }
-    def dockerApp
-    docker.withRegistry(REGISTRY_URL, REGISTRY_CREDENTIALS_ID) {
-      stage("checkout") {
-         git.checkoutGitRepository('.', IMAGE_GIT_URL, IMAGE_BRANCH, IMAGE_CREDENTIALS_ID)
-      }
-
-      if (IMAGE_BRANCH == "master") {
-        try {
-          def tag = sh(script: "git describe --tags --abbrev=0", returnStdout: true).trim()
-          def revision = sh(script: "git describe --tags --abbrev=4 | grep -oP \"^${tag}-\\K.*\" | awk -F\\- '{print \$1}'", returnStdout: true).trim()
-          imageTagsList << tag
-          revision = revision ? revision : "0"
-          if(Integer.valueOf(revision) > 0){
-            imageTagsList << "${tag}-${revision}"
-          }
-          if (!imageTagsList.contains("latest")) {
-            imageTagsList << "latest"
-          }
-        } catch (Exception e) {
-          common.infoMsg("Impossible to find any tag")
-        }
-      }
-
-      stage("build") {
-        common.infoMsg("Building docker image ${IMAGE_NAME}")
-        dockerApp = dockerLib.buildDockerImage(IMAGE_NAME, "", "${workspace}/${DOCKERFILE_PATH}", imageTagsList[0], buildArgs)
-        if(!dockerApp){
-          throw new Exception("Docker build image failed")
-        }
-      }
-      stage("upload to docker hub"){
-        for(int i=0;i<imageTagsList.size();i++){
-          common.infoMsg("Uploading image ${IMAGE_NAME} with tag ${imageTagsList[i]}")
-          dockerApp.push(imageTagsList[i])
-        }
-      }
-    }
-  } catch (Throwable e) {
-     // If there was an error or exception thrown, the build failed
-     currentBuild.result = "FAILURE"
-     currentBuild.description = currentBuild.description ? e.message + " " + currentBuild.description : e.message
-     throw e
-  } finally {
-     common.sendNotification(currentBuild.result,"",["slack"])
   }
 }
