| 
					
				 | 
			
			
				@@ -1,8 +1,12 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // def ENAMES = [ 'prod', 'dev' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-def ENAMES = [ 'dev' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def ENAMES = [ 'prod' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def CLUSTERS = ['prod': 'iru-swarm.infoclinica.lan', 'dev': 'dev-iru-swarm.infoclinica.lan'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def REGISTRIES = ['prod': 'registry.infoclinica.ru:5000', 'dev': 'dev-registry.infoclinica.ru:5000'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def DHOST = ['prod': 'tcp://iru-swarm.infoclinica.lan:2376', 'dev': 'tcp://dev-iru-swarm.infoclinica.lan:2376'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def LIST_SERVICE = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def TO_ROLLBACK = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def ERROR_JOB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def VERSION_TO_UPDATE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 pipeline { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   agent { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     label "swarm" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -10,8 +14,9 @@ pipeline { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   environment { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SWARM_GIT_URL='ssh://git@git.sdsys.ru:8022/labportal/stack-deploy.git' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     SWARM_GIT_NAME='stack-deploy' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    JENKINS_MAIL='jenkins@sdsys.ru' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    DHOST='tcp://dev-iru-swarm.infoclinica.lan:2376 DOCKER_TLS_VERIFY=1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    JENKINS_MAIL='jenkins.dev@sdsys.ru' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    DOCKER_CERT_PATH='/run/secrets/swarm' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    DOCKER_IMAGE='analis-wineservice' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   parameters { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     string( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -19,34 +24,117 @@ pipeline { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       defaultValue: "tomishinets.v@sdsys.ru", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       description: "Email which has to be notified." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    choice ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      choices: 'up\ndown', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      description: 'What you want? Up version or down?', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      name: 'TASK_ACTION' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   stages { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     stage("Check Stable Version") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       steps { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          sh """GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                  git clone ${SWARM_GIT_NAME} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-             """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          def STABLE_VERSION = sh (script: "cat ${SWARM_GIT_NAME}/tags/lab/analis-wineservice.stable-version" , returnStdout: true).trim() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          echo STABLE_VERSION 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sh """set +x && GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    git clone ${SWARM_GIT_URL} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          switch (TASK_ACTION) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            case 'up': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              VERSION_TO_UPDATE = sh (script: "set +x && cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.build-version" , returnStdout: true).trim() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              sh "set +x && echo \"Update version of Apps to $VERSION_TO_UPDATE\" > commit.txt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            case 'down': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              VERSION_TO_UPDATE = sh (script: "set +x && cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.old-stable-version" , returnStdout: true).trim() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              sh "set +x && echo \"Downgrade version of Apps to $VERSION_TO_UPDATE\" > commit.txt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    stage("Get Names Of Running Services") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      steps { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          ENAMES.each { item -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            echo "Viewing: ${item} services, on ${CLUSTERS.get((item))}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            LIST_SERVICE = sh (script: "set +x && DOCKER_HOST=${DHOST.get((item))} DOCKER_TLS_VERIFY=1 docker service ls -f label=com.docker.stack.namespace=analis-wineservice --format '{{.Name}}'" , returnStdout: true).split('\n') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            switch (TASK_ACTION) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              case 'up': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                echo "These services will be updated $LIST_SERVICE to version $VERSION_TO_UPDATE" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              case 'down': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                echo "These services will be downgraded $LIST_SERVICE to version $VERSION_TO_UPDATE" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    stage("Update Services") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      steps { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          ENAMES.each { item -> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              for (name in LIST_SERVICE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                TO_ROLLBACK.add(name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                sh "set +x && DOCKER_HOST=${DHOST.get((item))} DOCKER_TLS_VERIFY=1 docker service update $name --image ${REGISTRIES.get((item))}/lab/$DOCKER_IMAGE:$VERSION_TO_UPDATE" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              def STABLE_VERSION = sh (script: "set +x && cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.stable-version" , returnStdout: true).trim() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              for (names_falure in TO_ROLLBACK) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                echo "Recoverig $names_falure to $STABLE_VERSION" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                sh "set +x && DOCKER_HOST=${DHOST.get((item))} DOCKER_TLS_VERIFY=1 docker service rollback $names_falure" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              ERROR_JOB = TO_ROLLBACK.last() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              currentBuild.result = 'FAILURE' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              error ("Failure on update $ERROR_JOB. The service $TO_ROLLBACK was rollback!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    stage("Update Tags") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      steps { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          def STABLE_VERSION = sh (script: "set +x && cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.stable-version" , returnStdout: true).trim() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          def OLD_STABLE_VERSION = sh (script: "set +x && cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.old-stable-version" , returnStdout: true).trim() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          sh "set +x && echo $STABLE_VERSION > $SWARM_GIT_NAME/tags/lab/analis-wineservice.old-stable-version" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          sh "set +x && echo $VERSION_TO_UPDATE > $SWARM_GIT_NAME/tags/lab/analis-wineservice.stable-version"  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    stage("Push New Versions To Git") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      steps { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          sh "cat commit.txt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          sh "cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.stable-version" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          sh "cat $SWARM_GIT_NAME/tags/lab/analis-wineservice.old-stable-version" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/*          withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            sh """cd $SWARM_GIT_NAME 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  git add -A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  git config --global user.email "${JENKINS_MAIL}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  git config --global user.name "Jenkins" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  git commit -F ../commit.txt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  git push origin master 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+*/        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   post { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    always { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      echo "CleaningUp work directory" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      deleteDir() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     failure { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       mail charset: 'UTF-8', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            subject: "Jenkins build ERROR", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            mimeType: 'text/html', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            to: "${mailto}", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           body: "<b>ATTENTION!!!</b> Jenkins job <b>FAILED.</b>\n\n <br>Project Name: ${env.JOB_NAME}\n <br>Build TAG: <b>${REV_NUMBER}-${BUILD_NUMBER}</b>\n <br>Build URL: ${RUN_DISPLAY_URL}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    success { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      mail charset: 'UTF-8', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           subject: "Jenkins build SUSCCESS", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           mimeType: 'text/html', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           to: "${mailto}", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           body: "<b>Congradulations!!!</b> Jenkins job successfully finished\n\n <br>Project Name: ${env.JOB_NAME}\n <br>Build TAG: <b>${REV_NUMBER}-${BUILD_NUMBER}</b>\n <br>Build URL: ${RUN_DISPLAY_URL}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           body: "<b>ATTENTION!!!</b> <br> <b>Failure update:</b> $ERROR_JOB <br><b>Was rollback:</b> $TO_ROLLBACK <b><br>Project Name:</b> ${env.JOB_NAME} <b><br>Build Number:</b> ${env.BUILD_NUMBER} <b><br>URL Build:</b> ${RUN_DISPLAY_URL}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |