/* 
 *   Создает задания в jenkins из архива jobs.zip
 */
метод Скрипт()
    знч ИмяФайлаCli = "jenkins-cli.jar"
    знч ПутьКФайлуJenkinsCli = ИмяФайлаCli
    пер ФайлJenkinsCli = новый Файл(ПутьКФайлуJenkinsCli)
    знч ПутьКФайлуПараметровДоступаИзКаталога = "%{Скрипт.ПолучитьРабочийКаталог()}/jenkins-api.json"
    знч ПутьКРепозиториюПоУмолчанию = "c:/git/sbm"
    знч ПутьКРепозиториюБиблиотекиПоУмолчанию = "c:/git/sbm-jenkins-library"
    пер ФайлПараметровДоступа = новый Файл(ПутьКФайлуПараметровДоступаИзКаталога)
    если не ФайлJenkinsCli.Существует()
        ФайлJenkinsCli = Файлы.Создать(ФайлJenkinsCli)
    ;
    знч ПутьКФайлуПараметровДоступа =
        Консоль.СчитатьСтроку("Укажите полный путь к файлу параметров доступа [%{ФайлПараметровДоступа.Путь}]:")

    если ПутьКФайлуПараметровДоступа.Пусто()
        Консоль.Записать(
            "[createJenkinsJobs] Не указан путь к файлу параметров доступа. Будет взят файл из каталога дистрибутива")
    иначе
        ФайлПараметровДоступа = новый Файл(ПутьКФайлуПараметровДоступа)
    ;
    пер ПутьКРепозиторию = Консоль.СчитатьСтроку("Укажите полный путь к репозиторию [%{ПутьКРепозиториюПоУмолчанию}]:")
    если ПутьКРепозиторию.Пусто()
        ПутьКРепозиторию = ПутьКРепозиториюПоУмолчанию
        Консоль.Записать(
            "[createJenkinsJobs] Не указан путь к репозиторию. Будет заполнен путь по умолчанию: [%{ПутьКРепозиториюПоУмолчанию}]")
    ;
    пер ПутьКРепозиториюБиблиотеки = Консоль.СчитатьСтроку(
        "Укажите полный путь к репозиторию библиотеки [%{ПутьКРепозиториюБиблиотекиПоУмолчанию}]:")
    если ПутьКРепозиториюБиблиотеки.Пусто()
        ПутьКРепозиториюБиблиотеки = ПутьКРепозиториюБиблиотекиПоУмолчанию
        Консоль.Записать(
            "[createJenkinsJobs] Не указан путь к репозиторию библиотеки. Будет заполнен путь по умолчанию: [%{ПутьКРепозиториюБиблиотекиПоУмолчанию}]")
    ;

    исп Поток = ФайлПараметровДоступа.ОткрытьПотокЧтения()
    знч НастройкиЧтенияОбъектовJson = новый НастройкиЧтенияОбъектовJson()
    НастройкиЧтенияОбъектовJson.ИнициализироватьОтсутствующиеПоля = Истина
    НастройкиЧтенияОбъектовJson.ИнициализироватьПустыеКоллекции = Истина
    знч ПараметрыДоступа = СериализацияJson.ПрочитатьОбъект(Поток, Тип<ПараметрыДоступа>, НастройкиЧтенияОбъектовJson)
    знч ПутьРаспаковкиАрхива = Файлы.СоздатьВременныйКаталог("jobs_temp")
    знч Ответ = КлиентHttp.ЗапросGet("%{ПараметрыДоступа.АдресСервера}/jnlpJars/%ИмяФайлаCli").Выполнить()
    Ответ.Тело.КопироватьВФайл(ФайлJenkinsCli)
    знч Префикс = "SBM"
    знч ФайлАрхива = новый ФайлZip("jobs.zip")
    ФайлАрхива.ИзвлечьВсе(ПутьРаспаковкиАрхива)
    знч НастройкаПоискаФайловЗаданий = новый НастройкиПоискаФайлов().ИсключитьКаталоги(Истина)
        .ИмяСодержит(Префикс)
    знч НайденныеЗадания = Файлы.Найти("%ПутьРаспаковкиАрхива/jobs", НастройкаПоискаФайловЗаданий)
    Консоль.Записать("[createJenkinsJobs] Найдено заданий: %{НайденныеЗадания.Размер()}")
    для ТекФайлЗадания из НайденныеЗадания
        попытка
            СоздатьЗаданиеJenkins(ТекФайлЗадания, ПараметрыДоступа, ПутьКФайлуJenkinsCli, ПутьКРепозиторию,
                ПутьКРепозиториюПоУмолчанию, ПутьКРепозиториюБиблиотеки, ПутьКРепозиториюБиблиотекиПоУмолчанию)
        поймать Искл: Исключение
            знч СообщениеОбОшибке = Искл.ВСтроку()
            Консоль.ЗаписатьОшибку("[createJenkinsJobs] Не удалось создать задание %{ТекФайлЗадания
                    .ИмяБезРасширения}:\n$СообщениеОбОшибке")
        ;
    ;
;

метод СоздатьЗаданиеJenkins(ФайлЗадания: Файл, ПараметрыДоступа: ПараметрыДоступа, ПутьКФайлуJenkinsCli: Строка,
        ПутьКРепозиторию: Строка,
        ПутьКРепозиториюПоУмолчанию: Строка,
        ПутьКРепозиториюБиблиотеки: Строка,
        ПутьКРепозиториюБиблиотекиПоУмолчанию: Строка)

    Консоль.Записать("[createJenkinsJobs] Создаётся задание: %{ФайлЗадания.ИмяБезРасширения}")
    исп ПотокЧтения = ФайлЗадания.ОткрытьПотокЧтения()
    знч СодержимоеФайлаЗадания = ПотокЧтения.ПрочитатьКакСтроку()
    знч ФорматированноеСодержимое =
        ЗаполнитьПутьКРепозиторию(СодержимоеФайлаЗадания, ПутьКРепозиторию, ПутьКРепозиториюПоУмолчанию,
        ПутьКРепозиториюБиблиотеки, ПутьКРепозиториюБиблиотекиПоУмолчанию)
    знч Команда = НоваяКомандаJenkinsCLI(ФайлЗадания.ИмяБезРасширения, ПараметрыДоступа, ПутьКФайлуJenkinsCli)
    Команда.Запустить()
    знч ПотокВвода = Команда.ПолучитьПотокВвода()
    ПотокВвода.Записать(ФорматированноеСодержимое)
    ПотокВвода.Закрыть()
    Команда.ОжидатьЗавершения(Длительность.ИзСекунд(100))
    знч РезультатВыполнения = Команда.ПолучитьПотокВывода().ПрочитатьКакСтроку()
    знч КодВозврата = Команда.ПолучитьКодВозврата()
    если КодВозврата != 0
        Консоль.ЗаписатьОшибку("[createJenkinsJobs] Не удалось создать задание %{ФайлЗадания
                .ИмяБезРасширения}:\n$РезультатВыполнения")
    иначе
        Консоль.Записать("[createJenkinsJobs] Задание создано: %{ФайлЗадания.ИмяБезРасширения}")
    ;
;

метод ЗаполнитьПутьКРепозиторию(СодержимоеФайлаЗадания: Строка, ПутьКРепозиторию: Строка,
        ПутьКРепозиториюПоУмолчанию: Строка,
        ПутьКРепозиториюБиблиотеки: Строка,
        ПутьКРепозиториюБиблиотекиПоУмолчанию: Строка): Строка

    знч ДанныеФайлаЗадания =
        СодержимоеФайлаЗадания.Заменить(ПутьКРепозиториюБиблиотекиПоУмолчанию, ПутьКРепозиториюБиблиотеки).Заменить(
        ПутьКРепозиториюПоУмолчанию,
        ПутьКРепозиторию)
    возврат ДанныеФайлаЗадания
;

метод НоваяКомандаJenkinsCLI(ИмяЗадания: Строка, ПараметрыДоступа: ПараметрыДоступа,
        ПутьКФайлуJenkinsCli: Строка): ПроцессОс

    знч Аргументы = новый Массив<Строка>()
    Аргументы.Добавить("-\"jar %ПутьКФайлуJenkinsCli\"")
    Аргументы.Добавить("-\"s %{ПараметрыДоступа.АдресСервера}\"")
    Аргументы.Добавить("-\"auth %{ПараметрыДоступа.Пользователь}:%{ПараметрыДоступа.Пароль}\"")
    Аргументы.Добавить("\"create-job\" \"%ИмяЗадания\"")
    знч Процесс = новый ПроцессОс("java", Аргументы)

    возврат Процесс
;

структура ПараметрыДоступа
    знч Пользователь: Строка
    знч Пароль: Строка
    знч АдресСервера: Строка
;