jenkinsfile.get.and.sync.dict 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. def CLUSTER = [ gost: 'iru-swarm1.infoclinica.lan', open: 'iru-swarm1-open.infoclinica.ru' ]
  2. def FTP = [
  3. HELIX: 'ftp://ex2.helix.ru/Dictionaries/*',
  4. CMD: 'ftp://cmd.infoclinica.lan/nsi/*',
  5. GEMOTEST: 'ftp://ftp.gemotest.ru/services/*'
  6. ]
  7. def HELIXNAMES = [
  8. /* HelixMSK: [ id: '990010000000015', idtask: '990010000000017', dir: 'HelixMSK/Files/Dictionaries', user: 'TestDictMsk', pass: 'kO3R20eK' ],
  9. clinicAskona: [ id: '990010000004940', dir: 'HelixMSK/Files/Dictionaries/Askona', user: 'MskPMK', pass: 'QdFQIF68' ],
  10. clinicBZ: [ id: '990010000001881', dir: 'HelixMSK/Files/Dictionaries/BZ', user: 'MskClinicLMS', pass: '1npZfzex' ],
  11. clinicDR: [ id: '990010000002008', dir: 'HelixMSK/Files/Dictionaries/DR', user: 'MskDoctorRyadom', pass: 'iqBn0gIa' ],
  12. clinicMskDomNaTverskoy: [ id: '990010000013837', dir: 'HelixMSK/Files/Dictionaries/DomNaTverskoy', user: 'MskDomNaTverskoy', pass: '83gQlPPL' ],
  13. clinicISH: [ id: '990010000013838', dir: 'HelixMSK/Files/Dictionaries/ISH', user: 'MskInvMedHol', pass: '1Uw76Ef#' ],
  14. clinicKomsomolsky: [ id: '990010000013842', dir: 'HelixMSK/Files/Dictionaries/komsomolsky', user: 'MskAlfa', pass: 'iQjw0OWh' ],
  15. clinicMedscan: [ id: '990010000013843', dir: 'HelixMSK/Files/Dictionaries/Medscan', user: 'MskMedscan', pass: 'd#8Ug@7E' ],
  16. clinicMedekspert: [ id: '990010000013840', dir: 'HelixMSK/Files/Dictionaries/medekspert', user: 'MskMedexpertP', pass: 'wA3My!0J' ],
  17. clinicMedlux: [ id: '990010000013413', dir: 'HelixMSK/Files/Dictionaries/Medlux_mostfarm', user: 'MskMedlux', pass: 'Zn8hede7' ],
  18. clinicMskProfMedLab: [ id: '990010000013850', dir: 'HelixMSK/Files/Dictionaries/profmedlab', user: 'MskProfMedLab', pass: 'The)ais3' ],
  19. clinicRGSU: [ id: '990010000013852', dir: 'HelixMSK/Files/Dictionaries/RGSU', user: 'MskRGSU', pass: 'TPnYb3OT' ],
  20. clinicSova: [ id: '990010000004941', dir: 'HelixMSK/Files/Dictionaries/Sova', user: 'MskSova', pass: 'ehCPz9mx' ],
  21. clinicTemp: [ id: '990010000013661', dir: 'HelixMSK/Files/Dictionaries/Temp', user: 'MskTemp', pass: 'Hoch9is%' ],
  22. HelixEKB: [ id: '990010000000044', idtask: '990010000000019', dir: 'HelixEKB/Files/Dictionaries', user: 'TestDictEkb', pass: 'Fp5LMnKW' ],
  23. clinicBZ_EKB: [ id: '990010000013445', dir: 'HelixEKB/Files/Dictionaries/BZ_Ekb', user: 'EkbBudZdorov', pass: '0Qk&8Ko%' ],
  24. HelixNSK: [ id: '990010000000045', idtask: '990010000000022', dir: 'HelixNSK/Files/Dictionaries', user: 'TestDictNor', pass: 'jq9xd6sY' ],
  25. */ HelixPNZ: [ id: '990010000000046', idtask: '990010000000021', dir: 'HelixPNZ/Files/Dictionaries', user: 'TestDictPnz', pass: 'IgK~66Ff' ],
  26. clinicDavinchigrup: [ id: '990010000013845', dir: 'HelixPNZ/Files/Dictionaries/Davinchigrup', user: 'MskDaVinchi', pass: 'uGh9re)u' ],
  27. clinicMotherhood: [ id: '990010000013673', dir: 'HelixPNZ/Files/Dictionaries/Materinstvoidetstvo', user: 'MskMaterinstvoIDetst', pass: 'ZCPuzbw8' ],
  28. clinicSadko: [ id: '990010000013846', dir: 'HelixPNZ/Files/Dictionaries/Sadko', user: 'MskSadko', pass: 'VOTdPC3A' ],
  29. /* HelixHBR: [ id: '990010000000047', idtask: '990010000000018', dir: 'HelixHBR/Files/Dictionaries', user: 'TestDictHab', pass: 'idTf4WkE' ],
  30. HelixSPB: [ id: '990010000000013', idtask: '990010000000013', dir: 'HelixSPB/Files/Dictionaries', user: 'TestDictSpb', pass: '8686Giq0' ],
  31. clinicBaltMed: [ id: '990010000002030', dir: 'HelixSPB/Files/Dictionaries/BaltMed', user: 'SpbMServ', pass: '1tMi8jRz' ],
  32. clinicONA: [ id: '990010000004936', dir: 'HelixSPB/Files/Dictionaries/ONA', user: 'ona', pass: 'svn2CD3KkL' ],
  33. clinicRAN: [ id: '990010000001898', dir: 'HelixSPB/Files/Dictionaries/RAN', user: 'ran', pass: '7vFal2JBsC' ],
  34. // Неверный логин, хотя по через консоль доступ есть clinicSPom: [ id: '990010000013379', dir: 'HelixSPB/Files/Dictionaries/SkorayaPom', user: 'SpbSkorayaPom', pass: '8$c%Vo46' ],
  35. clinicStatusGracy: [ id: '990010000013855', dir: 'HelixSPB/Files/Dictionaries/StatusGracy', user: 'SpbStatGracP', pass: 'Qb#4Ir*1' ],
  36. HelixNSB: [ id: '990010000000029', idtask: '990010000000020', dir: 'HelixNSB/Files/Dictionaries', user: 'TestDictNvsb', pass: '511bLPm3' ],
  37. clinicMedisPlus: [ id: '990010000013458', dir: 'HelixNSB/Files/Dictionaries/MedisPlusKlinika', user: 'SpbKlinikaPskov', pass: '@3Sj*7St' ],
  38. clinicProfMed: [ id: '990010000004939', dir: 'HelixNSB/Files/Dictionaries/ProfMed', user: 'SpbProfMedUfa', pass: 'djZ6rA1T' ],
  39. */
  40. ]
  41. def INVITRONAMES = [
  42. InvitroMSK: [ id: '990010000000002', idtask: '990010000000002', dir: 'InvitroMSK/Files/Dictionaries' ],
  43. InvitroCHLB: [ id: '990010000000043', idtask: '990010000000032', dir: 'InvitroCHLB/Files/Dictionaries' ],
  44. InvitroSMR: [ id: '990010000000041', idtask: '990010000000031', dir: 'InvitroSMR/Files/Dictionaries' ],
  45. InvitroSPB: [ id: '990010000000042', idtask: '990010000000030', dir: 'InvitroSPB/Files/Dictionaries' ],
  46. // InvitroNSB: [ id: '990010000000033', idtask: '990010000000033', dir: 'InvitroNSB/Files/Dictionaries' ],
  47. ]
  48. def ALFANAMES = [
  49. // DNKOM: [ id: '990010000000018', idtask: '990010000000023', dir: 'DNKOM/Files/Dictionaries' ],
  50. // Dialab: [ id: '990010000000019', idtask: '990010000000024', dir: 'Dialab/Files/Dictionaries' ],
  51. // LabQuest: [ id: '990010000000049', idtask: '990010000000034', dir: 'LabQuest/Files/Dictionaries' ],
  52. Arhimed: [ id: '990010000000055', idtask: '990010000000041', dir: 'Arhimed/Files/Dictionaries' ],
  53. ]
  54. // def GEMOTEST = [ id: '990010000000014', idtask: '990010000000014', dir: 'GemoTest/Files/Dictionaries', user: 'a_info', pass: 'Ainfo150916' ]
  55. // def LITEH = [ id: '990010000000024', idtask: '990010000000026' ]
  56. // def NAKFF = [ id: '990010000000004', idtask: '990010000000004' ]
  57. def CMD = [ id: '990010000000003', idtask: '990010000000003', dir: 'CMD/Files/Dictionaries', user: 'SDSIntegration', pass: 'RK5CLTr77' ]
  58. //def KDL = [ id: '990010000000006', idtask: '990010000000001' ]
  59. def TAG = ''
  60. pipeline {
  61. agent {
  62. label "swarm"
  63. }
  64. environment {
  65. OPEN_CLUSTER='iru-swarm1-open.infoclinica.ru'
  66. GOST_CLUSTER='iru-swarm1.infoclinica.lan'
  67. JENKINS_MAIL='jenkins.dev@sdsys.ru'
  68. SMTP_SERVER='mail.sdsys.ru'
  69. DOCKER_CERT_PATH='/run/secrets/swarm'
  70. WGET_IMAGE='inutano/wget'
  71. SYNC_IMAGE='registry.infoclinica.ru:5000/syncmanager:i686.f30-0.2'
  72. ANALIS_IMAGE='registry.infoclinica.ru:5000/lab/analis-wineservice'
  73. SYNC_SERVER_IMAGE='registry.infoclinica.ru:5000/syncserver:x64.f30-0.6'
  74. STACK_DEPLOY_REPO='ssh://git@git.sdsys.ru:8022/labportal/stack-deploy.git'
  75. mailto='admin@sdsys.ru'
  76. }
  77. stages {
  78. stage ("Git pull stack-deploy REPO") {
  79. steps {
  80. script {
  81. withCredentials([sshUserPrivateKey(credentialsId: 'provision', keyFileVariable: 'GIT_SSH_KEY', passphraseVariable: '', usernameVariable: 'GIT_SSH_USERNAME')]) {
  82. sh '''GIT_SSH_COMMAND='ssh -i ${GIT_SSH_KEY} -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  83. git clone ${STACK_DEPLOY_REPO}
  84. '''
  85. }
  86. TAG = sh (script: "cat ${WORKSPACE}/stack-deploy/tags/lab/analis-wineservice.build-version" , returnStdout: true)
  87. container_operate(GOST_CLUSTER)
  88. container_operate(OPEN_CLUSTER)
  89. sh """export DOCKER_HOST=tcp://$GOST_CLUSTER:2376 DOCKER_TLS_VERIFY=1
  90. docker pull ${SYNC_SERVER_IMAGE}
  91. """
  92. }
  93. }
  94. }
  95. stage ("HELIX dictionaries") {
  96. steps {
  97. script {
  98. HELIXNAMES.each { key, value ->
  99. echo "Get dictionaries for $key"
  100. get_ftp(value.dir, value.user, value.pass, FTP.HELIX, OPEN_CLUSTER, WGET_IMAGE)
  101. }
  102. sh """printf '#!/bin/bash\ncd /root/wine32/dosdevices/unc/samba.infoclinica.lan/smartdelta01/$dir\n\
  103. exec "/usr/bin/xvfb-run" "-a" "wine" "/opt/syncserver/SyncServer.exe" "\$@"' > entrypoint.sh
  104. chmod +x entrypoint.sh
  105. """
  106. HELIXNAMES.each { key, value ->
  107. if (value.idtask) {
  108. container_operate(GOST_CLUSTER, [ 'sync' ])
  109. catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
  110. timeout(time: 10 as Integer, unit: 'MINUTES') {
  111. echo "Syncing dictionaries for $key"
  112. def log_dir = value.dir.replace("Files", "LOGS")
  113. syncServer(log_dir, value.idtask, SYNC_SERVER_IMAGE, GOST_CLUSTER)
  114. }
  115. }
  116. }
  117. }
  118. }
  119. }
  120. }
  121. stage ("INVITRO dictionaries") {
  122. steps {
  123. script {
  124. INVITRONAMES.each { key, value ->
  125. echo "CleanUP files for $key"
  126. cleanUP(value.dir, GOST_CLUSTER, WGET_IMAGE)
  127. echo "Get dictionaries for $key"
  128. def log_dir = value.dir.replace("Files", "LOGS")
  129. get_http(log_dir, value.id, ANALIS_IMAGE, TAG, GOST_CLUSTER)
  130. }
  131. sh """printf '#!/bin/bash\ncd /root/wine32/dosdevices/unc/samba.infoclinica.lan/smartdelta01/$dir\n\
  132. cat \$(ls -1t InvitroGetExtendedProduct_*.xml | head -n1) > InvitroGetExtendedProduct.xml\n\
  133. cat \$(ls -1t InvitroGetInfo_*.xml | head -n1) > InvitroGetInfo.xml\n\
  134. exec "/usr/bin/xvfb-run" "-a" "wine" "/opt/syncserver/SyncServer.exe" "\$@"' > entrypoint.sh
  135. chmod +x entrypoint.sh
  136. """
  137. INVITRONAMES.each { key, value ->
  138. if (value.idtask) {
  139. container_operate(GOST_CLUSTER, [ 'sync' ])
  140. catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
  141. timeout(time: 10 as Integer, unit: 'MINUTES') {
  142. echo "Syncing dictionaries for $key"
  143. def log_dir = value.dir.replace("Files", "LOGS")
  144. def dir = value.dir
  145. syncServer(log_dir, value.idtask, SYNC_SERVER_IMAGE, GOST_CLUSTER)
  146. }
  147. }
  148. }
  149. }
  150. }
  151. }
  152. }
  153. stage ("ALFA dictionaries") {
  154. steps {
  155. script {
  156. ALFANAMES.each { key, value ->
  157. echo "CleanUP files for $key"
  158. cleanUP(value.dir, GOST_CLUSTER, WGET_IMAGE)
  159. echo "Get dictionaries for $key"
  160. def log_dir = value.dir.replace("Files", "LOGS")
  161. get_http(log_dir, value.id, ANALIS_IMAGE, TAG, GOST_CLUSTER)
  162. }
  163. sh """printf '#!/bin/bash\ncd /root/wine32/dosdevices/unc/samba.infoclinica.lan/smartdelta01/$dir\n\
  164. cat \$(ls -1t AlfaLabDict_*.xml | head -n1) > AlfaLabDict.xml\n\
  165. exec "/usr/bin/xvfb-run" "-a" "wine" "/opt/syncserver/SyncServer.exe" "\$@"' > entrypoint.sh
  166. chmod +x entrypoint.sh
  167. """
  168. catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
  169. timeout(time: 10 as Integer, unit: 'MINUTES') {
  170. ALFANAMES.each { key, value ->
  171. echo "Syncing $key"
  172. container_operate(GOST_CLUSTER, [ 'sync' ])
  173. def log_dir = value.dir.replace("Files", "LOGS")
  174. def dir = value.dir
  175. syncServer(log_dir, value.idtask, SYNC_SERVER_IMAGE, GOST_CLUSTER)
  176. }
  177. }
  178. }
  179. }
  180. }
  181. }
  182. /* stage ("Gemotest dictionaries") {
  183. steps {
  184. script {
  185. echo "Get dictionaries for Gemotest"
  186. get_ftp(GEMOTEST.dir, GEMOTEST.user, GEMOTEST.pass, FTP.GEMOTEST, OPEN_CLUSTER, WGET_IMAGE)
  187. sh """printf '#!/bin/bash\ncd /root/wine32/dosdevices/unc/samba.infoclinica.lan/smartdelta01/$dir\n\
  188. exec "/usr/bin/xvfb-run" "-a" "wine" "/opt/syncserver/SyncServer.exe" "\$@"' > entrypoint.sh
  189. chmod +x entrypoint.sh
  190. """
  191. catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
  192. timeout(time: 10 as Integer, unit: 'MINUTES') {
  193. echo "Syncing dictionaries for Gemotest"
  194. container_operate(GOST_CLUSTER, [ 'sync' ])
  195. def log_dir = GEMOTEST.dir.replace("Files", "LOGS")
  196. syncServer(log_dir, GEMOTEST.idtask, SYNC_SERVER_IMAGE, GOST_CLUSTER)
  197. }
  198. }
  199. }
  200. }
  201. }
  202. */ stage ("CMD dictionaries") {
  203. steps {
  204. script {
  205. echo "Get dictionaries for CMD"
  206. get_ftp(CMD.dir, CMD.user, CMD.pass, FTP.CMD, GOST_CLUSTER, WGET_IMAGE)
  207. sh """printf '#!/bin/bash\ncd /root/wine32/dosdevices/unc/samba.infoclinica.lan/smartdelta01/$dir\n\
  208. exec "/usr/bin/xvfb-run" "-a" "wine" "/opt/syncserver/SyncServer.exe" "\$@"' > entrypoint.sh
  209. chmod +x entrypoint.sh
  210. """
  211. catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
  212. timeout(time: 10 as Integer, unit: 'MINUTES') {
  213. echo "Syncing dictionaries for CMD"
  214. container_operate(GOST_CLUSTER, [ 'sync' ])
  215. def log_dir = CMD.dir.replace("Files", "LOGS")
  216. syncServer(log_dir, CMD.idtask, SYNC_SERVER_IMAGE, GOST_CLUSTER)
  217. }
  218. }
  219. }
  220. }
  221. }
  222. }
  223. post {
  224. always {
  225. echo "CleaningUp work directory"
  226. deleteDir()
  227. }
  228. failure {
  229. mail charset: 'UTF-8',
  230. subject: "Jenkins Dictionaries sync ERROR",
  231. mimeType: 'text/html',
  232. to: "${mailto}",
  233. body: "<b>ATTENTION!!!</b> <b><br> Jenkins job failed.\n\n <b><br>Project Name:</b> ${env.JOB_NAME} <b><br>\nBuild Number:</b> ${env.BUILD_NUMBER} <b><br>\nURL Build:</b> ${RUN_DISPLAY_URL}"
  234. }
  235. success {
  236. mail charset: 'UTF-8',
  237. subject: "Jenkins Dictionaries sync SUCCESS",
  238. mimeType: 'text/html',
  239. to: "${mailto}",
  240. body: "<b>Congradulations!!!</b> <b><br> Jenkins job succefully finished.\n\n <b><br>Project Name:</b> ${env.JOB_NAME} <b><br>\nBuild Number:</b> ${env.BUILD_NUMBER} <b><br>\nURL Build:</b> ${RUN_DISPLAY_URL}"
  241. }
  242. }
  243. }
  244. def sync(String dir, String idtask, String IMAGE, String CLUSTER) {
  245. sh """export DOCKER_HOST=tcp://$CLUSTER:2376 DOCKER_TLS_VERIFY=1
  246. docker create -i --name sync \
  247. -v analis-wineservice_analis_Files_netapp:/root/wine32/dosdevices/unc/samba.infoclinica.lan/smartdelta01/ \
  248. --network=labnetwork ${IMAGE} -a prod_lab -e "$idtask" \
  249. -logfile "\\\\\\samba.infoclinica.lan\\smartdelta01\\$dir\\syncmanager_#.log"
  250. docker cp infodent.ini sync:/opt/syncmanager/infodent.ini
  251. docker start -i sync
  252. docker rm sync
  253. """
  254. }
  255. def syncServer(String dir, String idtask, String IMAGE, String CLUSTER) {
  256. sh """export DOCKER_HOST=tcp://$CLUSTER:2376 DOCKER_TLS_VERIFY=1
  257. docker create -i --name sync \
  258. -v analis-wineservice_analis_Files_netapp:/root/wine32/dosdevices/unc/samba.infoclinica.lan/smartdelta01 \
  259. --network=labnetwork ${IMAGE} -a prod_lab -e syncrefcode=$idtask \
  260. logpath=/root/wine32/dosdevices/unc/samba.infoclinica.lan/smartdelta01/$dir /nocycles
  261. docker cp infodent.ini sync:/opt/syncserver
  262. docker cp sync.conf sync:/opt/syncserver
  263. docker cp entrypoint.sh sync:/opt
  264. docker start -i sync
  265. docker rm sync
  266. """
  267. }
  268. def get_http(String dir, String id, String IMAGE, String TAG, String CLUSTER) {
  269. sh """export DOCKER_HOST=tcp://$CLUSTER:2376 DOCKER_TLS_VERIFY=1
  270. docker create -i --name get \
  271. -v analis-wineservice_analis_Files_netapp:/root/.wine/dosdevices/unc/samba.infoclinica.lan/smartdelta01 \
  272. --network=labnetwork -e DEBUG=false \
  273. -e LOGPATH=/root/.wine/dosdevices/unc/samba.infoclinica.lan/smartdelta01/$dir \
  274. ${IMAGE}:${TAG} SyncRefInterval=1 LabSystems=$id /nocycles
  275. docker cp infodent.ini get:/opt/analis/infodent.ini
  276. docker cp analis.conf get:/opt/analis/analis.conf
  277. docker start -i get
  278. docker rm get
  279. """
  280. }
  281. def get_ftp(String dir, String user, String pass, String ftp, String CLUSTER, String IMAGE) {
  282. sh """export DOCKER_HOST=tcp://$CLUSTER:2376 DOCKER_TLS_VERIFY=1
  283. docker run --rm -i -v analis-wineservice_analis_Files_netapp:/services/ ${IMAGE} \
  284. /bin/ash -c ' \
  285. rm -fv /services/$dir/*.xml;
  286. wget -P /services/$dir --user="$user" --password="$pass" $ftp'
  287. """
  288. }
  289. def cleanUP(String dir, String CLUSTER, String IMAGE) {
  290. sh """export DOCKER_HOST=tcp://$CLUSTER:2376 DOCKER_TLS_VERIFY=1
  291. docker run --rm -i -v analis-wineservice_analis_Files_netapp:/services/ ${IMAGE} \
  292. /bin/ash -c ' \
  293. rm -fv /services/$dir/*.xml'
  294. """
  295. }
  296. def container_operate(String CLUSTER, name = [ 'get', 'sync' ]) {
  297. for (i in name) {
  298. sh """export DOCKER_HOST=tcp://$CLUSTER:2376 DOCKER_TLS_VERIFY=1
  299. docker stop $i || true && docker rm $i || true
  300. """
  301. }
  302. }