-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathdeploy.os
471 lines (293 loc) · 21.6 KB
/
deploy.os
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
#Использовать cmdline
#Использовать 1commands
#Использовать logos
#Использовать v8runner
#Использовать progbar
#Использовать ReadParams
#Использовать "./Lib/deployka_m/src"
#Использовать "."
Перем _ПараметрыРаботы;
Перем _Лог;
Перем _Замер;
Перем _УправлениеСеансами;
Перем _Конфигуратор;
// Получить имя лога продукта
//
// Возвращаемое значение:
// Строка - имя лога продукта
//
Функция ИмяЛога() Экспорт
Возврат "oscript.app.Deploy";
КонецФункции
Процедура ВыполнитьБекап()
Если Не _ПараметрыРаботы.ВыполнятьБекап() Тогда
_Лог.Отладка( "Бекап пропущен. ВыполнятьБекап = Ложь" );
Возврат;
КонецЕсли;
_Замер.НачатьЗамер( "Начат бекап", "Бекап" );
выполнениеБекапа = Новый РаботаСSQL();
выполнениеБекапа.ИнициализироватьЛог( _Лог.Уровень(), _Замер.ПолучитьПотомка() );
выполнениеБекапа.УстановитьСервер( _ПараметрыРаботы.Параметры["SQL.Server"] );
выполнениеБекапа.УстановитьПользователя( _ПараметрыРаботы.Параметры["SQL.User"] );
выполнениеБекапа.УстановитьПароль( _ПараметрыРаботы.Параметры["SQL.Password"] );
выполнениеБекапа.УстановитьИмяБазы( _ПараметрыРаботы.Параметры["SQL.Base"] );
результат = выполнениеБекапа.ВыполнитьБекап( _ПараметрыРаботы.Параметры["FileBackup"] );
Если Не результат Тогда
ЗавершитьРаботу(1);
КонецЕсли;
_Замер.СообщитьЗамер( "Выполнен бекап");
КонецПроцедуры
Процедура ПерезапуститьСервер()
Если Не _ПараметрыРаботы.РебутатьСервер1С() Тогда
_Лог.Отладка( "Ребут сервера 1С пропущен. РебутатьСервер1С = Ложь" );
Возврат;
КонецЕсли;
имяСервиса1С = _ПараметрыРаботы.Параметры["Server1C.ServiceName"];
имяСервисаRAS = _ПараметрыРаботы.Параметры["Server1C.ServiceRASName"];
Если Не ЗначениеЗаполнено( имяСервиса1С ) Тогда
_Лог.Отладка( "Ребут сервера 1С пропущен. Имя сервиса 1С не указано" );
Возврат;
КонецЕсли;
_Замер.НачатьЗамер( "Начало ребута сервера 1С", "РебутСервера1С" );
строкаЗапуска = "sc stop """ + имяСервиса1С + """";
ВыполнитьКомандуСВыводомИнформации( строкаЗапуска, "Остановка серера 1С" );
Если ЗначениеЗаполнено( имяСервисаRAS ) Тогда
строкаЗапуска = "sc stop """ + имяСервисаRAS + """";
ВыполнитьКомандуСВыводомИнформации( строкаЗапуска, "Остановка RAS" );
КонецЕсли;
Приостановить(10000);
_Лог.Информация( "Принудительное завершение процессов" );
ВыполнитьКомандуСВыводомИнформации( "taskkill /f /im ""rphost.exe""" );
ВыполнитьКомандуСВыводомИнформации( "taskkill /f /im ""rmngr.exe""" );
ВыполнитьКомандуСВыводомИнформации( "taskkill /f /im ""ragent.exe""" );
Если ЗначениеЗаполнено( имяСервисаRAS ) Тогда
ВыполнитьКомандуСВыводомИнформации( "taskkill /f /im ""ras.exe""" );
КонецЕсли;
Приостановить(10000);
Если ЗначениеЗаполнено( _ПараметрыРаботы.Параметры["Server1C.CNTX_PATH"] ) Тогда
Попытка
УдалитьФайлы( _ПараметрыРаботы.Параметры["Server1C.CNTX_PATH"], "snccntx*" );
Исключение
_Лог.Отладка( "Не удалось очистить папку " + _ПараметрыРаботы.Параметры["Server1C.CNTX_PATH"] );
_Лог.Отладка( ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если ЗначениеЗаполнено( _ПараметрыРаботы.Параметры["Server1C.PFL_PATH"] ) Тогда
Попытка
УдалитьФайлы( _ПараметрыРаботы.Параметры["Server1C.PFL_PATH"], "*.pfl" );
Исключение
_Лог.Отладка( "Не удалось очистить папку " + _ПараметрыРаботы.Параметры["Server1C.PFL_PATH"] );
_Лог.Отладка( ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если ЗначениеЗаполнено( _ПараметрыРаботы.Параметры["Server1C.TEMP_PATH"] ) Тогда
Попытка
УдалитьФайлы( _ПараметрыРаботы.Параметры["Server1C.TEMP_PATH"], "*.*" );
Исключение
_Лог.Отладка( "Не удалось очистить папку " + _ПараметрыРаботы.Параметры["Server1C.TEMP_PATH"] );
_Лог.Отладка( ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
строкаЗапуска = "sc start """ + имяСервиса1С + """";
ВыполнитьКомандуСВыводомИнформации( строкаЗапуска, "Старт серера 1С" );
Если ЗначениеЗаполнено( имяСервисаRAS ) Тогда
строкаЗапуска = "sc stop """ + имяСервисаRAS + """";
ВыполнитьКомандуСВыводомИнформации( строкаЗапуска, "Старт RAS" );
КонецЕсли;
_Замер.СообщитьЗамер( "Выполнен ребут сервера 1С");
Приостановить(10000);
КонецПроцедуры
Процедура ВыполнитьКомандуСВыводомИнформации( Знач пСтрокаЗапуска, Знач пОписаниеОперации = "" )
Команда = Новый Команда;
Если ЗначениеЗаполнено( пОписаниеОперации ) Тогда
_Лог.Информация( пОписаниеОперации );
КонецЕсли;
_Лог.Информация( пСтрокаЗапуска );
Команда.УстановитьСтрокуЗапуска( пСтрокаЗапуска );
КодВозврата = Команда.Исполнить();
_Лог.Отладка( "Код возврата: " + КодВозврата );
_Лог.Информация( Команда.ПолучитьВывод() );
КонецПроцедуры
Процедура ВключитьRAS()
Если Не _ПараметрыРаботы.УдалятьСоединения() Тогда
Возврат;
КонецЕсли;
Если _ПараметрыРаботы.ЭтоДинамическоеОбновление() Тогда
Возврат;
КонецЕсли;
_Замер.НачатьЗамер( "Включение ras" );
строкаЗапуска = _ПараметрыРаботы.Параметры["EXERAS"];
Если ЗначениеЗаполнено( строкаЗапуска ) Тогда
_Лог.Отладка( "Запуск RAS: " + строкаЗапуска + " cluster" );
ЗапуститьПриложение( ОбщегоНазначения.ОбернутьВКавычки( строкаЗапуска ) + " cluster" );
_Замер.СообщитьЗамер( "Включен ras");
Иначе
_Замер.СообщитьЗамер( "Запуск ras пропущен");
КонецЕсли;
КонецПроцедуры
Процедура УстановитьБлокировку()
Если Не _ПараметрыРаботы.УдалятьСоединения() Тогда
_Лог.Отладка( "Установка блокировки пропущена. УдалятьСоединения = Ложь" );
Возврат;
КонецЕсли;
Если _ПараметрыРаботы.ЭтоДинамическоеОбновление() Тогда
_Лог.Отладка( "Установка блокировки пропущена. ЭтоДинамическоеОбновление = Истина" );
Возврат;
КонецЕсли;
_Замер.НачатьЗамер( "Установка блокировки для " + _ПараметрыРаботы.ПредставлениеБазы());
ВывестиКоличествоАктивныхСеансов();
_ПараметрыРаботы.ПараметрыДеплойки.Вставить("Действие", "lock");
_УправлениеСеансами.ВыполнитьКоманду ( _ПараметрыРаботы.ПараметрыДеплойки );
_Замер.СообщитьЗамер( "Установлена блокировка для " + _ПараметрыРаботы.ПредставлениеБазы() );
КонецПроцедуры
Процедура ВывестиКоличествоАктивныхСеансов()
_Лог.Информация( "Сеансов: " + КоличествоАктивныхСеансов() );
КонецПроцедуры
Функция КоличествоАктивныхСеансов()
_ПараметрыРаботы.ПараметрыДеплойки.Вставить("Действие", "unlock");
Возврат _УправлениеСеансами.КоличествоСеансов( _ПараметрыРаботы.ПараметрыДеплойки );
КонецФункции
Процедура УдалитьСоединения()
Если Не _ПараметрыРаботы.УдалятьСоединения() Тогда
Возврат;
КонецЕсли;
Если _ПараметрыРаботы.ЭтоДинамическоеОбновление() Тогда
Возврат;
КонецЕсли;
_Замер.НачатьЗамер( "Принудительное завершение работы пользователей для " + _ПараметрыРаботы.ПредставлениеБазы() );
ВывестиКоличествоАктивныхСеансов();
_ПараметрыРаботы.ПараметрыДеплойки.Вставить("Действие", "kill");
_ПараметрыРаботы.ПараметрыДеплойки.Вставить("-lockstart", "");
_ПараметрыРаботы.ПараметрыДеплойки.Вставить("-lockstartat", 0);
Для ц = 1 По 5 Цикл
Попытка
_Лог.Отладка( "Удаление соединений, попытка " + ц);
_УправлениеСеансами.ВыполнитьКоманду ( _ПараметрыРаботы.ПараметрыДеплойки );
Если КоличествоАктивныхСеансов() = 0 Тогда
Прервать;
КонецЕсли;
Исключение
_Лог.Отладка( "Ошибка удаления соединений: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
_Замер.СообщитьЗамер( "Работа пользователей завершена для " + _ПараметрыРаботы.ПредставлениеБазы() );
ВывестиКоличествоАктивныхСеансов();
КонецПроцедуры
Процедура СнятьБлокировку()
Если Не _ПараметрыРаботы.УдалятьСоединения() Тогда
Возврат;
КонецЕсли;
Если _ПараметрыРаботы.ЭтоДинамическоеОбновление() Тогда
Возврат;
КонецЕсли;
_Замер.НачатьЗамер( "Снятие блокировки для " + _ПараметрыРаботы.ПредставлениеБазы() );
_ПараметрыРаботы.ПараметрыДеплойки.Вставить("Действие", "unlock");
_УправлениеСеансами.ВыполнитьКоманду ( _ПараметрыРаботы.ПараметрыДеплойки );
_Замер.СообщитьЗамер( "Блокировка снята для " + _ПараметрыРаботы.ПредставлениеБазы() );
ВывестиКоличествоАктивныхСеансов();
КонецПроцедуры
Процедура ПаузаПередУдалениемСеансов()
Если Не _ПараметрыРаботы.УдалятьСоединения() Тогда
Возврат;
КонецЕсли;
Если _ПараметрыРаботы.ЭтоДинамическоеОбновление() Тогда
Возврат;
КонецЕсли;
_Замер.НачатьЗамер( "Пауза перед принудительным завершением работы для " + _ПараметрыРаботы.ПредставлениеБазы() );
всегоПаузаСекунд = 0;
Если ЗначениеЗаполнено( _ПараметрыРаботы.Параметры["Cluster.lockstart"] ) Тогда
всегоПаузаСекунд = _ПараметрыРаботы.Параметры["Cluster.lockstart"] - ТекущаяДата();
ИначеЕсли ЗначениеЗаполнено( _ПараметрыРаботы.Параметры["Cluster.lockstartat"] ) Тогда
всегоПаузаСекунд = _ПараметрыРаботы.Параметры["Cluster.lockstartat"];
КонецЕсли;
Если Не ЗначениеЗаполнено( всегоПаузаСекунд ) Тогда
всегоПаузаСекунд = 0;
ИначеЕсли всегоПаузаСекунд < 10 Тогда
всегоПаузаСекунд = 10;
Иначе
всегоПаузаСекунд = всегоПаузаСекунд + 30;
КонецЕсли;
ПрогрессБарПаузы = Новый ПрогрессБар();
ПрогрессБарПаузы.Начать(всегоПаузаСекунд, "Ожидание ", Ложь, Ложь, Ложь);
Для ц = 0 По всегоПаузаСекунд Цикл
ПрогрессБарПаузы.СделатьШаг();
Приостановить(1000);
КонецЦикла;
ПрогрессБарПаузы.Завершить();
_Замер.СообщитьЗамер( "Пауза завершена для " + _ПараметрыРаботы.ПредставлениеБазы() );
КонецПроцедуры
Процедура ОбновитьКонфигурациюИзХранилища()
Если Не _ПараметрыРаботы.ОбновлятьКонфигурацию() Тогда
Возврат;
КонецЕсли;
Если _ПараметрыРаботы.Параметры["UseDynamicUpdate"] = Истина Тогда
_Замер.НачатьЗамер( "Начало получения конфигурации из хранилища для " + _ПараметрыРаботы.ПредставлениеБазы() );
_Конфигуратор.ПолучитьИзмененияКонфигурацииБазыДанныхИзХранилища(_ПараметрыРаботы.Параметры["Repo.Connect"], _ПараметрыРаботы.Параметры["Repo.User"], _ПараметрыРаботы.Параметры["Repo.Password"] );
Текст = _Конфигуратор.ВыводКоманды();
Если Не ПустаяСтрока(Текст) Тогда
_Лог.Информация(Текст);
КонецЕсли;
_Замер.СообщитьЗамер( "Конфигурация получена для " + _ПараметрыРаботы.ПредставлениеБазы() );
_Замер.НачатьЗамер( "Начало динамического обновления для " + _ПараметрыРаботы.ПредставлениеБазы() );
_Конфигуратор.ОбновитьКонфигурациюБазыДанных( ,, Истина );
Текст = _Конфигуратор.ВыводКоманды();
Если Не ПустаяСтрока(Текст) Тогда
_Лог.Информация(Текст);
КонецЕсли;
_Замер.СообщитьЗамер( "Конфигурация обновлена для " + _ПараметрыРаботы.ПредставлениеБазы() );
Иначе
_Замер.НачатьЗамер( "Начало обновления конфигурации из хранилища для " + _ПараметрыРаботы.ПредставлениеБазы() );
_Конфигуратор.ОбновитьКонфигурациюБазыДанныхИзХранилища(_ПараметрыРаботы.Параметры["Repo.Connect"], _ПараметрыРаботы.Параметры["Repo.User"], _ПараметрыРаботы.Параметры["Repo.Password"] );
Текст = _Конфигуратор.ВыводКоманды();
Если Не ПустаяСтрока(Текст) Тогда
_Лог.Информация(Текст);
КонецЕсли;
_Замер.СообщитьЗамер( "Конфигурация обновлена для " + _ПараметрыРаботы.ПредставлениеБазы() );
КонецЕсли;
ОбщегоНазначения.УдалитьФайлЕслиСуществует( _Конфигуратор.ФайлИнформации() );
КонецПроцедуры
Процедура ЗапускМиграции()
Если Не _ПараметрыРаботы.ОбновлятьКонфигурацию() Тогда
Возврат;
КонецЕсли;
_Замер.НачатьЗамер( "Запуск миграции данных при обновлении для " + _ПараметрыРаботы.ПредставлениеБазы() );
_Конфигуратор.ЗапуститьВРежимеПредприятия( _ПараметрыРаботы.Параметры["UpdateLaunchParameter"] );
Текст = _Конфигуратор.ВыводКоманды();
Если Не ПустаяСтрока(Текст) Тогда
_Лог.Информация(Текст);
КонецЕсли;
ОбщегоНазначения.УдалитьФайлЕслиСуществует( _Конфигуратор.ФайлИнформации() );
_Замер.СообщитьЗамер( "Миграция данных выполнена для " + _ПараметрыРаботы.ПредставлениеБазы() );
КонецПроцедуры
Процедура Деплой()
ВключитьRAS();
_ПараметрыРаботы.ТестПараметров();
Если _ПараметрыРаботы.РежимТестированияПараметров Тогда
_Замер.СообщитьЗавершение();
Возврат;
КонецЕсли;
УстановитьБлокировку();
Попытка
ПаузаПередУдалениемСеансов();
УдалитьСоединения();
ВыполнитьБекап();
ПерезапуститьСервер();
ОбновитьКонфигурациюИзХранилища();
ЗапускМиграции();
СнятьБлокировку();
Исключение
СнятьБлокировку();
_Замер.СообщитьКритическуюОшибку( "Деплой провален" );
_Замер.СообщитьКритическуюОшибку( ПодробноеПредставлениеОшибки( ИнформацияОбОшибке()) );
ЗавершитьРаботу(1);
КонецПопытки;
_Замер.СообщитьЗавершение();
КонецПроцедуры
_Лог = Логирование.ПолучитьЛог(ИмяЛога());
_ПараметрыРаботы = Новый ПараметрыРаботы();
_ПараметрыРаботы.ИспользоватьДеплойку = Истина;
_ПараметрыРаботы.Инициализация( АргументыКоманднойСтроки, _Лог );
_Замер = _ПараметрыРаботы.Замер;
_УправлениеСеансами = _ПараметрыРаботы.УправлениеСеансами;
_Конфигуратор = _ПараметрыРаботы.Конфигуратор;
Деплой();