diff --git a/README.md b/README.md
index 8f498c6..6e9806a 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ ovm - утилита, предназначенная для установки,
## Пререквизиты
* Установленный `.Net Framework >=4.5.2` либо `Mono >=4.6`
-* Работающий интернет
+* Работающий интернет (доступ к [oscript.io](https://oscript.io), а для установки сборок веток и пул-реквестов - к [build.oscript.io](https://build.oscript.io))
## Установка
@@ -103,6 +103,44 @@ ovm install dev stable 1.0.19 # Установить стабильную, но
ovm use --install dev # Активировать ночную сборку и установить, если ее нет
```
+### Установка сборок с сервера сборок
+
+Помимо релизов с сайта OneScript, ovm умеет ставить сборки веток и пул-реквестов с сервера сборок [build.oscript.io](https://build.oscript.io/job/1Script/). Это удобно, чтобы проверить свою библиотеку с еще не вышедшими изменениями движка.
+
+Версия задается с префиксом `branch:` (ветка) либо `pr:` (пул-реквест):
+
+```sh
+ovm install branch:develop # Последняя успешная сборка ветки develop
+ovm install branch:feature/my-branch # Ветка с косой чертой в имени
+ovm install pr:1731 # Последняя успешная сборка пул-реквеста 1731
+
+ovm use --install pr:1731 # Установить (если ее нет) и активировать сборку пул-реквеста
+```
+
+По умолчанию берется последняя успешная сборка. Конкретную сборку можно указать через решетку:
+
+```sh
+ovm install branch:develop#777 # Сборка №777 ветки develop
+```
+
+Каталогом установки (алиасом) по умолчанию становится имя ветки или пул-реквеста, косая черта заменяется на дефис, номер сборки дописывается через дефис:
+
+|Версия|Алиас|
+|-|-
+|`branch:develop`|`develop`
+|`branch:feature/my-branch`|`feature-my-branch`
+|`pr:1731`|`PR-1731`
+|`branch:develop#777`|`develop-777`
+
+Как и для обычных версий, алиас можно задать явно опцией `--name`:
+
+```sh
+ovm install --name test_pr pr:1731
+ovm use test_pr
+```
+
+Список веток и пул-реквестов, доступных к установке, выводится командой `ovm ls --builds` (см. [Вывод установленных версий OneScript](#вывод-установленных-версий-onescript)).
+
### Активация OneScript
Для запуска `oscript` и прочих утилит без указания путей к ним необходимо произвести активацию версии OneScript. При этом в каталоге данных `ovm` создастся специальная символическая ссылка `current`, ведущая на активированную версию.
@@ -135,6 +173,14 @@ $ ovm ls --remote # Вывод версий, доступных к устано
1.0.18 (http://oscript.io/downloads/archive/1_0_18)
```
+```sh
+$ ovm ls --builds # Вывод сборок веток и пул-реквестов, доступных к установке с сервера сборок
+
+pr:1731 (https://build.oscript.io/job/1Script/job/PR-1731/)
+branch:develop (https://build.oscript.io/job/1Script/job/develop/)
+branch:feature/async (https://build.oscript.io/job/1Script/job/feature%252Fasync/)
+```
+
```sh
$ ovm ls --all # Вывод всех версий - установленных и доступных
@@ -202,6 +248,18 @@ $ ovm config <имя параметра> <значение>
$ ovm config oscript.server https://internal.oscript.io
```
+### Настройка сервера сборок
+
+```sh
+$ ovm config build.server https://internal.build.oscript.io
+$ ovm config build.job 1Script
+```
+
+|Параметр|Значение по умолчанию|Пояснение
+|-|-|-
+|build.server|https://build.oscript.io|Адрес сервера сборок (Jenkins), с которого ставятся версии `branch:` и `pr:`
+|build.job|1Script|Имя многоветочного задания сборки OneScript на сервере сборок
+
### Настройка прокси-сервера
При работе за корпоративным прокси-сервером может потребоваться указание настроек прокси.
diff --git a/features/list-builds.feature b/features/list-builds.feature
new file mode 100644
index 0000000..c459fdc
--- /dev/null
+++ b/features/list-builds.feature
@@ -0,0 +1,20 @@
+#language: ru
+
+Функциональность: Просмотр сборок с сервера сборок
+
+Как разработчик OneScript
+Я хочу просматривать список сборок веток и пул-реквестов
+Чтобы устанавливать движок из конкретной ветки или пул-реквеста
+
+Контекст:
+ Допустим Я устанавливаю переменной среды "OVM_INSTALL_PATH" значение "./temp/ovm"
+
+Сценарий: Вывод списка доступных сборок
+ Когда Я выполняю команду "oscript ./src/cmd/ovm.os ls --builds"
+ Тогда я вижу в консоли строку подобно "^branch:develop\s\(http.*\)"
+ И я вижу в консоли строку подобно "^pr:\d+\s\(http.*\)"
+
+Сценарий: Вывод списка доступных сборок в тихом режиме
+ Когда Я выполняю команду "oscript ./src/cmd/ovm.os ls --builds --quiet"
+ # \s* перед $ - это перевод каретки в конце строки на Windows
+ Тогда я вижу в консоли строку подобно "^branch:develop\s*$"
diff --git a/lib.config b/lib.config
index e213981..3ed1b65 100644
--- a/lib.config
+++ b/lib.config
@@ -1,7 +1,26 @@
-
+
+
+
+
+
+
+
+
+
+
+
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packagedef b/packagedef
index 9685fa6..b05644d 100644
--- a/packagedef
+++ b/packagedef
@@ -1,5 +1,5 @@
Описание.Имя("ovm")
- .Версия("1.6.2")
+ .Версия("1.7.0")
.Автор("Nikita Fedkin")
.АдресАвтора("nixel2007@gmail.com")
.Описание("OneScript Version Manager")
diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Install.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Install.os"
index e72bf04..30bfbe6 100644
--- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Install.os"
+++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Install.os"
@@ -6,6 +6,9 @@
&Пластилин
Перем УстановщикOneScript;
+&Пластилин
+Перем ВерсииOneScript; // Работа с версиями OneScript
+
&Пластилин("ДетекторОкружения")
Перем Окружение;
@@ -38,10 +41,13 @@
КомандаПриложения.Аргумент(
"VERSION",
,
- "Устанавливаемая версия (версии) OneScript. " +
- "Допустимо использовать трехномерные версии (1.0.17, 1.0.18), " +
- "lts, stable, dev, preview, lts-dev " +
- "Может быть передано несколько значений")
+ "Устанавливаемая версия (версии) OneScript. "
+ + "Допустимо использовать трехномерные версии (1.0.17, 1.0.18), "
+ + "lts, stable, dev, preview, lts-dev, "
+ + "а также сборки веток и пул-реквестов с сервера сборок "
+ + "(branch:develop, branch:feature/my-branch, pr:1731). "
+ + "Конкретную сборку можно указать через решетку: branch:develop#777. "
+ + "Может быть передано несколько значений")
.ТМассивСтрок()
.ВОкружении("OVM_INSTALL_VERSION");
@@ -78,10 +84,16 @@
КонецЦикла;
Если МассивВерсийКУстановке.Количество() > 0 Тогда
+
+ Если НЕ ЗначениеЗаполнено(АлиасВерсии) Тогда
+ АлиасВерсии = ВерсииOneScript.АлиасПоУмолчанию(
+ МассивВерсийКУстановке[МассивВерсийКУстановке.ВГраница()]);
+ КонецЕсли;
+
Лог.Информация(
"Для начала использования версии OneScript, выполните команду:
|ovm use %1",
- ?(ЗначениеЗаполнено(АлиасВерсии), АлиасВерсии, МассивВерсийКУстановке[МассивВерсийКУстановке.ВГраница()])
+ АлиасВерсии
);
КонецЕсли;
diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260List.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260List.os"
index 411b1f6..0db561e 100644
--- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260List.os"
+++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260List.os"
@@ -15,6 +15,14 @@
&ПоУмолчанию(Ложь)
Перем ВыводитьСписокВерсийНаСайте;
+&Опция(
+ Имя = "builds b",
+ Описание = "Вывести список сборок веток и пул-реквестов, доступных к установке с сервера сборок")
+&ВОкружении("OVM_LIST_BUILDS")
+&ТБулево
+&ПоУмолчанию(Ложь)
+Перем ВыводитьСписокСборок; // Признак вывода списка сборок с сервера сборок
+
&Опция(Имя = "all a", Описание = "Вывести список всех версий: установленных и доступных на сайте")
&ВОкружении("OVM_LIST_ALL")
&ТБулево
@@ -34,7 +42,9 @@
&ВыполнениеКоманды
Процедура ВыполнениеКоманды() Экспорт
- Если ВыводитьВсеВерсии Тогда
+ Если ВыводитьСписокСборок Тогда
+ ВывестиСписокДоступныхКУстановкеСборок();
+ ИначеЕсли ВыводитьВсеВерсии Тогда
ВывестиВсеВерсии();
ИначеЕсли ВыводитьСписокВерсийНаСайте Тогда
ВывестиСписокДоступныхКУстановкеВерсий();
@@ -110,8 +120,22 @@
КонецЦикла;
КонецПроцедуры
+Процедура ВывестиСписокДоступныхКУстановкеСборок()
+
+ СписокДоступныхСборок = ВерсииOneScript.ПолучитьСписокДоступныхКУстановкеСборок();
+ Для Каждого ДоступнаяСборка Из СписокДоступныхСборок Цикл
+ Если ТихийРежим Тогда
+ Сообщение = ДоступнаяСборка.Алиас;
+ Иначе
+ Сообщение = СтрШаблон("%1 (%2)", ДоступнаяСборка.Алиас, ДоступнаяСборка.Путь);
+ КонецЕсли;
+ Лог.Информация(Сообщение);
+ КонецЦикла;
+
+КонецПроцедуры
+
Процедура ВывестиСписокДоступныхКУстановкеВерсий()
-
+
СписокДоступныВерсий = ВерсииOneScript.ПолучитьСписокДоступныхКУстановкеВерсий();
Для Каждого ДоступнаяВерсия Из СписокДоступныВерсий Цикл
Если ТихийРежим Тогда
diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Use.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Use.os"
index a4f67c8..78a201b 100644
--- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Use.os"
+++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Use.os"
@@ -1,7 +1,11 @@
&Пластилин
Перем АктиваторOneScript;
-&Аргумент(Имя = "VERSION", Описание = "Используемая версия OneScript. Допустимо использовать трехномерные версии (1.0.17, 1.0.18), stable, dev")
+&Аргумент(
+ Имя = "VERSION",
+ Описание = "Используемая версия OneScript. Допустимо использовать трехномерные версии
+ |(1.0.17, 1.0.18), stable, dev, а совместно с опцией --install - и сборки с сервера
+ |сборок (branch:develop, branch:develop#777, pr:1731, pr:1731#3)")
&ВОкружении("OVM_USE_VERSION")
&ТСтрока
Перем ИспользуемаяВерсия;
diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\272\321\202\320\270\320\262\320\260\321\202\320\276\321\200OneScript.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\272\321\202\320\270\320\262\320\260\321\202\320\276\321\200OneScript.os"
index 2f5826a..b4cb8b8 100644
--- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\272\321\202\320\270\320\262\320\260\321\202\320\276\321\200OneScript.os"
+++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\272\321\202\320\270\320\262\320\260\321\202\320\276\321\200OneScript.os"
@@ -29,11 +29,17 @@
// алиас не установлен
//
Процедура ИспользоватьВерсиюOneScript(Знач ИспользуемаяВерсия, Знач ВыполнятьУстановкуПриНеобходимости = Ложь) Экспорт
-
+
+ ВерсияКУстановке = ИспользуемаяВерсия;
+ ИспользуемаяВерсия = ВерсииOneScript.АлиасПоУмолчанию(ИспользуемаяВерсия);
+
Лог.Информация("Активация версии OneScript %1", ИспользуемаяВерсия);
- ПроверитьНаличиеИспользуемойВерсии(ИспользуемаяВерсия, ВыполнятьУстановкуПриНеобходимости);
-
+ ПроверитьНаличиеИспользуемойВерсии(
+ ИспользуемаяВерсия,
+ ВерсияКУстановке,
+ ВыполнятьУстановкуПриНеобходимости);
+
КаталогУстановки = ПараметрыOVM.КаталогУстановкиПоУмолчанию();
КаталогУстановкиВерсии = ОбъединитьПути(КаталогУстановки, ИспользуемаяВерсия);
@@ -253,17 +259,20 @@
КонецПроцедуры
-Процедура ПроверитьНаличиеИспользуемойВерсии(Знач ИспользуемаяВерсия, Знач ВыполнятьУстановкуПриНеобходимости)
-
+Процедура ПроверитьНаличиеИспользуемойВерсии(
+ Знач ИспользуемаяВерсия,
+ Знач ВерсияКУстановке,
+ Знач ВыполнятьУстановкуПриНеобходимости)
+
Если ВерсииOneScript.ВерсияУстановлена(ИспользуемаяВерсия) Тогда
Возврат;
КонецЕсли;
-
+
Если ВыполнятьУстановкуПриНеобходимости Тогда
ДополнительныеПараметры = УстановщикOneScript.ДополнительныеПараметрыУстановки();
ДополнительныеПараметры.ИспользоватьХ64 = Окружение.ЭтоX64();
- УстановщикOneScript.УстановитьOneScript(ИспользуемаяВерсия, , ДополнительныеПараметры);
+ УстановщикOneScript.УстановитьOneScript(ВерсияКУстановке, , ДополнительныеПараметры);
Иначе
ВызватьИсключение СтрШаблон("Не обнаружена требуемая версия <%1>", ИспользуемаяВерсия);
КонецЕсли;
diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\320\270OneScript.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\320\270OneScript.os"
index c562ffe..55bfef3 100644
--- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\320\270OneScript.os"
+++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\265\321\200\321\201\320\270\320\270OneScript.os"
@@ -12,6 +12,9 @@
&Пластилин
Перем ПровайдерДистрибутивовВерсии;
+&Пластилин
+Перем ПровайдерДистрибутивовСборки; // Провайдер дистрибутивов сборок сервера сборок
+
Перем ДопустимыеАлиасы; // Кеш коллекции допустимых алиасов
&Пластилин("ДетекторОкружения")
@@ -253,6 +256,187 @@
Возврат ПровайдерДистрибутивовВерсии.ПолучитьДоступныеВидыДистрибутивовВерсии(НомерВерсии);
КонецФункции
+// Возвращает таблицу файлов сборки ветки или пул-реквеста с сервера сборок
+//
+// Параметры:
+// ИмяСборки - Строка - Имя ветки или пул-реквеста на сервере сборок (develop, PR-1731, feature/my-branch)
+// НомерСборки - Строка - Номер сборки. Если не указан, используется последняя успешная сборка
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - Вид,ИмяФайла,Архитектура,Ссылка
+//
+Функция ПолучитьДоступныеВидыДистрибутивовСборки(Знач ИмяСборки, Знач НомерСборки = "") Экспорт
+ Возврат ПровайдерДистрибутивовСборки.ПолучитьДоступныеВидыДистрибутивовСборки(ИмяСборки, НомерСборки);
+КонецФункции
+
+// Получить информацию о сборках веток и пул-реквестов, доступных к установке
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - Информация о доступных сборках:
+// * Алиас - Строка - Спецификация сборки для команды install (branch:develop, pr:1731)
+// * Путь - Строка - Полный адрес задания сборки на сервере сборок
+//
+Функция ПолучитьСписокДоступныхКУстановкеСборок() Экспорт
+ Возврат ПровайдерДистрибутивовСборки.ПолучитьСписокДоступныхКУстановкеСборок();
+КонецФункции
+
+// Префикс версии, обозначающий установку сборки пул-реквеста с сервера сборок
+//
+// Возвращаемое значение:
+// Строка - Префикс версии
+//
+Функция ПрефиксПулРеквеста() Экспорт
+ Возврат "pr:";
+КонецФункции
+
+// Префикс версии, обозначающий установку сборки ветки с сервера сборок
+//
+// Возвращаемое значение:
+// Строка - Префикс версии
+//
+Функция ПрефиксВетки() Экспорт
+ Возврат "branch:";
+КонецФункции
+
+// Проверить, что переданная версия описывает сборку с сервера сборок
+//
+// Параметры:
+// ПроверяемаяВерсия - Строка - Проверяемая версия
+//
+// Возвращаемое значение:
+// Булево - Версия описывает сборку с сервера сборок
+//
+Функция ЭтоСборкаСервераСборок(Знач ПроверяемаяВерсия) Экспорт
+
+ ВерсияВНижнемРегистре = НРег(Строка(ПроверяемаяВерсия));
+
+ Возврат СтрНачинаетсяС(ВерсияВНижнемРегистре, ПрефиксПулРеквеста())
+ Или СтрНачинаетсяС(ВерсияВНижнемРегистре, ПрефиксВетки());
+
+КонецФункции
+
+// Разобрать спецификацию сборки на имя задания и номер сборки
+//
+// Параметры:
+// ВерсияКУстановке - Строка - Спецификация сборки вида branch:develop, pr:1731 или branch:develop#777
+//
+// Возвращаемое значение:
+// Структура - Параметры сборки:
+// * ИмяСборки - Строка - Имя задания ветки или пул-реквеста на сервере сборок
+// * НомерСборки - Строка - Номер сборки. Пустая строка означает последнюю успешную сборку
+//
+Функция ПараметрыСборки(Знач ВерсияКУстановке) Экспорт
+
+ Если НЕ ЭтоСборкаСервераСборок(ВерсияКУстановке) Тогда
+ ВызватьИсключение СтрШаблон("Версия <%1> не является сборкой сервера сборок", ВерсияКУстановке);
+ КонецЕсли;
+
+ ЭтоПулРеквест = СтрНачинаетсяС(НРег(ВерсияКУстановке), ПрефиксПулРеквеста());
+ ДлинаПрефикса = СтрДлина(?(ЭтоПулРеквест, ПрефиксПулРеквеста(), ПрефиксВетки()));
+
+ Результат = ОтделитьНомерСборки(СокрЛП(Сред(ВерсияКУстановке, ДлинаПрефикса + 1)));
+
+ Если ЭтоПулРеквест Тогда
+ Результат.ИмяСборки = "PR-" + УдалитьПрефиксПулРеквеста(Результат.ИмяСборки);
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+// Проверить, что переданная версия является корректной спецификацией сборки
+//
+// Параметры:
+// ПроверяемаяВерсия - Строка - Проверяемая версия
+//
+// Возвращаемое значение:
+// Булево - Версия является корректной спецификацией сборки
+//
+Функция ЭтоКорректнаяСпецификацияСборки(Знач ПроверяемаяВерсия) Экспорт
+
+ Если НЕ ЭтоСборкаСервераСборок(ПроверяемаяВерсия) Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ ИмяСборки = ПараметрыСборки(ПроверяемаяВерсия).ИмяСборки;
+
+ Если СтрНачинаетсяС(НРег(ПроверяемаяВерсия), ПрефиксПулРеквеста()) Тогда
+ // Имя задания пул-реквеста на сервере сборок всегда PR-<номер>
+ Возврат ЭтоЦелоеЧисло(Сред(ИмяСборки, СтрДлина("PR-") + 1));
+ КонецЕсли;
+
+ Возврат ЗначениеЗаполнено(ИмяСборки);
+
+КонецФункции
+
+// Получить алиас (имя каталога установки) по умолчанию для указанной версии
+//
+// Параметры:
+// ВерсияКУстановке - Строка - Устанавливаемая версия или спецификация сборки
+//
+// Возвращаемое значение:
+// Строка - Алиас версии
+//
+Функция АлиасПоУмолчанию(Знач ВерсияКУстановке) Экспорт
+
+ Если НЕ ЭтоСборкаСервераСборок(ВерсияКУстановке) Тогда
+ Возврат ВерсияКУстановке;
+ КонецЕсли;
+
+ ПараметрыСборки = ПараметрыСборки(ВерсияКУстановке);
+
+ Алиас = СтрЗаменить(ПараметрыСборки.ИмяСборки, "/", "-");
+ Если ЗначениеЗаполнено(ПараметрыСборки.НомерСборки) Тогда
+ Алиас = Алиас + "-" + ПараметрыСборки.НомерСборки;
+ КонецЕсли;
+
+ Возврат Алиас;
+
+КонецФункции
+
+Функция ОтделитьНомерСборки(Знач Спецификация)
+
+ Результат = Новый Структура("ИмяСборки, НомерСборки", Спецификация, "");
+
+ ПозицияРазделителя = СтрНайти(Спецификация, "#", НаправлениеПоиска.СКонца);
+ Если ПозицияРазделителя = 0 Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ НомерСборки = Сред(Спецификация, ПозицияРазделителя + 1);
+
+ // Решетка может быть частью имени ветки, номером сборки считаем только число после нее
+ Если НЕ ЭтоЦелоеЧисло(НомерСборки) Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ Результат.ИмяСборки = Лев(Спецификация, ПозицияРазделителя - 1);
+ Результат.НомерСборки = НомерСборки;
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция ЭтоЦелоеЧисло(Знач ПроверяемаяСтрока)
+
+ РегулярноеВыражение = Новый РегулярноеВыражение("^\d+$");
+ РегулярноеВыражение.МногоСтрочный = Ложь;
+
+ Возврат РегулярноеВыражение.Совпадает(ПроверяемаяСтрока);
+
+КонецФункции
+
+Функция УдалитьПрефиксПулРеквеста(Знач ИмяСборки)
+
+ // Допускаем как pr:1731, так и pr:PR-1731
+ Если СтрНачинаетсяС(НРег(ИмяСборки), "pr-") Тогда
+ Возврат Сред(ИмяСборки, СтрДлина("pr-") + 1);
+ КонецЕсли;
+
+ Возврат ИмяСборки;
+
+КонецФункции
+
// <Описание функции>
//
// Возвращаемое значение:
diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213OVM.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213OVM.os"
index 878f2cd..1c73c9f 100644
--- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213OVM.os"
+++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213OVM.os"
@@ -3,6 +3,12 @@
&Деталька(Значение = "oscript.server", ЗначениеПоУмолчанию = "https://oscript.io")
Перем АдресСайтаОСкрипт;
+&Деталька(Значение = "build.server", ЗначениеПоУмолчанию = "https://build.oscript.io")
+Перем АдресСервераСборок; // Адрес сервера сборок
+
+&Деталька(Значение = "build.job", ЗначениеПоУмолчанию = "1Script")
+Перем ЗаданиеСервераСборок; // Имя многоветочного задания сборки OneScript
+
&Пластилин("ДетекторОкружения")
Перем Окружение;
@@ -40,6 +46,26 @@
Возврат АдресСайтаОСкрипт;
КонецФункции
+// Адрес сервера сборок OneScript (build.oscript.io)
+//
+// Возвращаемое значение:
+// Строка - Адрес сервера сборок
+//
+&Завязь(Тип = "Строка")
+Функция АдресСервераСборок() Экспорт
+ Возврат АдресСервераСборок;
+КонецФункции
+
+// Имя многоветочного задания сборки OneScript на сервере сборок
+//
+// Возвращаемое значение:
+// Строка - Имя задания сборки
+//
+&Завязь(Тип = "Строка")
+Функция ЗаданиеСервераСборок() Экспорт
+ Возврат ЗаданиеСервераСборок;
+КонецФункции
+
// Полный адрес к каталогу дистрибутивов OneScript
//
// Возвращаемое значение:
diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os"
index 74f5392..5b03725 100644
--- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os"
+++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os"
@@ -12,5 +12,5 @@
КонецФункции
Функция ВерсияПриложения() Экспорт
- Возврат "1.6.2";
+ Возврат "1.7.0";
КонецФункции
diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\276\320\262\320\241\320\261\320\276\321\200\320\272\320\270.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\276\320\262\320\241\320\261\320\276\321\200\320\272\320\270.os"
new file mode 100644
index 0000000..44cef26
--- /dev/null
+++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\224\320\270\321\201\321\202\321\200\320\270\320\261\321\203\321\202\320\270\320\262\320\276\320\262\320\241\320\261\320\276\321\200\320\272\320\270.os"
@@ -0,0 +1,298 @@
+&ЛогOVM
+Перем Лог; // Лог приложения
+
+&Пластилин
+Перем ФабрикаИнтернетСоединения; // Фабрика соединений с сервером сборок
+
+&Пластилин
+Перем АдресСервераСборок; // Адрес сервера сборок
+
+&Пластилин
+Перем ЗаданиеСервераСборок; // Имя многоветочного задания сборки OneScript
+
+&Желудь
+Процедура ПриСозданииОбъекта()
+КонецПроцедуры
+
+// Возвращает таблицу файлов дистрибутивов сборки ветки или пул-реквеста
+//
+// Параметры:
+// ИмяСборки - Строка - Имя ветки или пул-реквеста на сервере сборок (develop, PR-1731, feature/my-branch)
+// НомерСборки - Строка - Номер сборки. Если не указан, используется последняя успешная сборка
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - Вид,ИмяФайла,Архитектура,Ссылка
+// Вид: fdd,scd-win,scd-lin,osx-x64,osx-arm64
+// ИмяФайла: имя файла
+// Архитектура: x64,x86
+// Ссылка: ссылка на файл относительно адреса сервера сборок
+// См. также:
+// https://build.oscript.io/job/1Script/ - список веток и пул-реквестов
+//
+Функция ПолучитьДоступныеВидыДистрибутивовСборки(Знач ИмяСборки, Знач НомерСборки = "") Экспорт
+
+ АдресСборки = АдресСборки(ЗаданиеСервераСборок, ИмяСборки, НомерСборки);
+ Ресурс = АдресСборки + "/api/json?tree=artifacts%5BfileName,relativePath%5D";
+
+ Лог.Отладка("Сервер: %1. Ресурс: %2", АдресСервераСборок, Ресурс);
+
+ Соединение = ФабрикаИнтернетСоединения.Создать(АдресСервераСборок);
+ Ответ = Соединение.Получить(Новый HTTPЗапрос(Ресурс));
+
+ HTTP_OK = 200;
+ Если Ответ.КодСостояния <> HTTP_OK Тогда
+ ВызватьИсключение СтрШаблон(
+ "Не удалось найти сборку <%1> на сервере сборок %2: Статус: %3",
+ ПредставлениеСборки(ИмяСборки, НомерСборки),
+ АдресСервераСборок,
+ Ответ.КодСостояния);
+ КонецЕсли;
+
+ ПереченьФайлов = ДистрибутивыИзОписанияАртефактов(
+ Ответ.ПолучитьТелоКакСтроку(),
+ АдресСборки + "/artifact");
+
+ Если ПереченьФайлов.Количество() = 0 Тогда
+ ВызватьИсключение СтрШаблон(
+ "Сборка <%1> на сервере сборок %2 не содержит дистрибутивов OneScript",
+ ПредставлениеСборки(ИмяСборки, НомерСборки),
+ АдресСервераСборок);
+ КонецЕсли;
+
+ Возврат ПереченьФайлов;
+
+КонецФункции
+
+// Получить информацию о сборках веток и пул-реквестов, доступных к установке
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - Информация о доступных сборках:
+// * Алиас - Строка - Спецификация сборки для команды install (branch:develop, pr:1731)
+// * Путь - Строка - Полный адрес задания сборки на сервере сборок
+//
+Функция ПолучитьСписокДоступныхКУстановкеСборок() Экспорт
+
+ Ресурс = СтрШаблон(
+ "job/%1/api/json?tree=jobs%%5Bname,url,lastSuccessfulBuild%%5Bnumber%%5D%%5D",
+ ЗаданиеСервераСборок);
+
+ Лог.Отладка("Сервер: %1. Ресурс: %2", АдресСервераСборок, Ресурс);
+
+ Соединение = ФабрикаИнтернетСоединения.Создать(АдресСервераСборок);
+ Ответ = Соединение.Получить(Новый HTTPЗапрос(Ресурс));
+
+ HTTP_OK = 200;
+ Если Ответ.КодСостояния <> HTTP_OK Тогда
+ ВызватьИсключение СтрШаблон(
+ "Не удалось получить список сборок с сервера сборок %1. Код ошибки: %2",
+ АдресСервераСборок,
+ Ответ.КодСостояния);
+ КонецЕсли;
+
+ Возврат СборкиИзОписанияЗаданий(Ответ.ПолучитьТелоКакСтроку());
+
+КонецФункции
+
+// Отбирает сборки, доступные к установке, из ответа сервера сборок со списком заданий
+//
+// Параметры:
+// ТелоОтвета - Строка - Тело ответа api/json многоветочного задания со списком заданий веток
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - Алиас,Путь
+//
+Функция СборкиИзОписанияЗаданий(Знач ТелоОтвета) Экспорт
+
+ ДоступныеСборки = Новый ТаблицаЗначений;
+ ДоступныеСборки.Колонки.Добавить("Алиас");
+ ДоступныеСборки.Колонки.Добавить("Путь");
+
+ ЧтениеJSON = Новый ЧтениеJSON();
+ ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
+
+ ОписаниеЗадания = ПрочитатьJSON(ЧтениеJSON, Истина);
+ Задания = ОписаниеЗадания.Получить("jobs");
+
+ Если Задания = Неопределено Тогда
+ Возврат ДоступныеСборки;
+ КонецЕсли;
+
+ Для Каждого Задание Из Задания Цикл
+
+ // Задание без успешных сборок установить нельзя
+ Если Не ЗначениеЗаполнено(Задание.Получить("lastSuccessfulBuild")) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ // Jenkins отдает "/" в именах веток закодированным как %2F
+ ИмяСборки = РаскодироватьСтроку(Задание.Получить("name"), СпособКодированияСтроки.КодировкаURL);
+
+ ДоступнаяСборка = ДоступныеСборки.Добавить();
+ ДоступнаяСборка.Алиас = СпецификацияСборки(ИмяСборки);
+ ДоступнаяСборка.Путь = Задание.Получить("url");
+
+ КонецЦикла;
+
+ Возврат ДоступныеСборки;
+
+КонецФункции
+
+// Относительный адрес сборки ветки или пул-реквеста на сервере сборок
+//
+// Параметры:
+// ИмяЗадания - Строка - Имя многоветочного задания сборки (например, 1Script)
+// ИмяСборки - Строка - Имя ветки или пул-реквеста (например, develop или PR-1731)
+// НомерСборки - Строка - Номер сборки. Если не указан, используется последняя успешная сборка
+//
+// Возвращаемое значение:
+// Строка - Относительный адрес сборки
+//
+Функция АдресСборки(Знач ИмяЗадания, Знач ИмяСборки, Знач НомерСборки = "") Экспорт
+
+ // Jenkins хранит "/" в именах веток закодированным как %2F,
+ // поэтому в адресе задания он должен быть закодирован дважды.
+ ЗакодированноеИмяСборки = СтрЗаменить(
+ КодироватьСтроку(ИмяСборки, СпособКодированияСтроки.КодировкаURL),
+ "%2F",
+ "%252F");
+
+ Возврат СтрШаблон(
+ "job/%1/job/%2/%3",
+ ИмяЗадания,
+ ЗакодированноеИмяСборки,
+ ?(ЗначениеЗаполнено(НомерСборки), НомерСборки, "lastSuccessfulBuild"));
+
+КонецФункции
+
+Функция СпецификацияСборки(Знач ИмяСборки)
+
+ РегулярноеВыражение = Новый РегулярноеВыражение("^PR-(\d+)$");
+ РегулярноеВыражение.ИгнорироватьРегистр = Ложь;
+ РегулярноеВыражение.МногоСтрочный = Ложь;
+
+ Совпадения = РегулярноеВыражение.НайтиСовпадения(ИмяСборки);
+ Если Совпадения.Количество() = 1 Тогда
+ Возврат "pr:" + Совпадения[0].Группы[1].Значение;
+ КонецЕсли;
+
+ Возврат "branch:" + ИмяСборки;
+
+КонецФункции
+
+// Представление сборки для сообщений пользователю
+//
+// Параметры:
+// ИмяСборки - Строка - Имя ветки или пул-реквеста на сервере сборок
+// НомерСборки - Строка - Номер сборки. Если не указан, подразумевается последняя успешная сборка
+//
+// Возвращаемое значение:
+// Строка - Представление сборки
+//
+Функция ПредставлениеСборки(Знач ИмяСборки, Знач НомерСборки = "") Экспорт
+
+ Если Не ЗначениеЗаполнено(НомерСборки) Тогда
+ Возврат ИмяСборки;
+ КонецЕсли;
+
+ Возврат ИмяСборки + "#" + НомерСборки;
+
+КонецФункции
+
+// Отбирает дистрибутивы OneScript из ответа сервера сборок со списком артефактов
+//
+// Параметры:
+// ТелоОтвета - Строка - Тело ответа api/json сборки со списком артефактов
+// АдресАртефактов - Строка - Адрес каталога артефактов сборки, к которому дописывается путь файла
+//
+// Возвращаемое значение:
+// ТаблицаЗначений - Вид,ИмяФайла,Архитектура,Ссылка
+//
+Функция ДистрибутивыИзОписанияАртефактов(Знач ТелоОтвета, Знач АдресАртефактов) Экспорт
+
+ ТаблицаРезультата = Новый ТаблицаЗначений();
+ ТаблицаРезультата.Колонки.Добавить("Вид");
+ ТаблицаРезультата.Колонки.Добавить("ИмяФайла");
+ ТаблицаРезультата.Колонки.Добавить("Архитектура");
+ ТаблицаРезультата.Колонки.Добавить("Ссылка");
+
+ ЧтениеJSON = Новый ЧтениеJSON();
+ ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
+
+ ОписаниеСборки = ПрочитатьJSON(ЧтениеJSON, Истина);
+ Артефакты = ОписаниеСборки.Получить("artifacts");
+
+ Если Артефакты = Неопределено Тогда
+ Возврат ТаблицаРезультата;
+ КонецЕсли;
+
+ Для Каждого Артефакт Из Артефакты Цикл
+
+ ИмяФайла = Артефакт.Получить("fileName");
+ ОписаниеДистрибутива = ОписаниеДистрибутиваПоИмениФайла(ИмяФайла);
+
+ Если ОписаниеДистрибутива = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ СтрокаТаблицы = ТаблицаРезультата.Добавить();
+ СтрокаТаблицы.Вид = ОписаниеДистрибутива.Вид;
+ СтрокаТаблицы.Архитектура = ОписаниеДистрибутива.Архитектура;
+ СтрокаТаблицы.ИмяФайла = ИмяФайла;
+ СтрокаТаблицы.Ссылка = АдресАртефактов + "/" + Артефакт.Получить("relativePath");
+
+ КонецЦикла;
+
+ Возврат ТаблицаРезультата;
+
+КонецФункции
+
+// Определяет вид и архитектуру дистрибутива OneScript по имени файла артефакта
+//
+// Параметры:
+// ИмяФайла - Строка - Имя файла артефакта сборки
+//
+// Возвращаемое значение:
+// Структура, Неопределено - Неопределено, если файл не является дистрибутивом OneScript:
+// * Вид - Строка - Вид дистрибутива (fdd, scd-win, scd-lin, osx-x64, osx-arm64)
+// * Архитектура - Строка - Разрядность дистрибутива (x86, x64)
+//
+Функция ОписаниеДистрибутиваПоИмениФайла(Знач ИмяФайла) Экспорт
+
+ РегулярноеВыражение = Новый РегулярноеВыражение("^OneScript-.+-(fdd|win|linux|osx)-(x86|x64|arm64)\.zip$");
+ РегулярноеВыражение.ИгнорироватьРегистр = Ложь;
+ РегулярноеВыражение.МногоСтрочный = Ложь;
+
+ Совпадения = РегулярноеВыражение.НайтиСовпадения(ИмяФайла);
+ Если Совпадения.Количество() <> 1 Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Платформа = Совпадения[0].Группы[1].Значение;
+ Разрядность = Совпадения[0].Группы[2].Значение;
+
+ Результат = Новый Структура("Вид, Архитектура");
+
+ Если Платформа = "osx" Тогда
+ Результат.Вид = "osx-" + Разрядность;
+ // Дистрибутивы для macOS на сайте OneScript помечены архитектурой x64 независимо от вида
+ Результат.Архитектура = "x64";
+ Иначе
+ Результат.Вид = ВидДистрибутиваПоПлатформе(Платформа);
+ Результат.Архитектура = Разрядность;
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция ВидДистрибутиваПоПлатформе(Знач Платформа)
+
+ Если Платформа = "win" Тогда
+ Возврат "scd-win";
+ ИначеЕсли Платформа = "linux" Тогда
+ Возврат "scd-lin";
+ Иначе
+ Возврат Платформа;
+ КонецЕсли;
+
+КонецФункции
diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\321\211\320\270\320\272OneScript.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\321\211\320\270\320\272OneScript.os"
index 73a9999..e6e9541 100644
--- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\321\211\320\270\320\272OneScript.os"
+++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\321\211\320\270\320\272OneScript.os"
@@ -47,7 +47,9 @@
КонецФункции
// Установка указанной версии OneScript.
-// Допустимо использовать трех-разрядные номера версий и шорткаты dev и stable
+// Допустимо использовать трех-разрядные номера версий, шорткаты dev и stable,
+// а также сборки с сервера сборок в формате branch:<ветка> или pr:<номер>,
+// с необязательным номером сборки через решетку: branch:develop#777
//
// Параметры:
// ВерсияКУстановке - Строка - Имя версии, которую необходимо установить
@@ -68,17 +70,17 @@
ИспользоватьХ64 = ДополнительныеПараметры.ИспользоватьХ64;
ИспользоватьFDD = ДополнительныеПараметры.ИспользоватьFDD;
+ ПроверитьКорректностьПереданнойВерсии(ВерсияКУстановке);
+
Если ИспользоватьХ64 Тогда
ИспользоватьХ64 = ПроверитьВозможностьУстановкиX64(ВерсияКУстановке);
КонецЕсли;
Лог.Информация("Установка OneScript %1...", ВерсияКУстановке);
-
+
Если НЕ ЗначениеЗаполнено(АлиасВерсии) Тогда
- АлиасВерсии = ВерсияКУстановке;
+ АлиасВерсии = ВерсииOneScript.АлиасПоУмолчанию(ВерсияКУстановке);
КонецЕсли;
-
- ПроверитьКорректностьПереданнойВерсии(ВерсияКУстановке);
КаталогУстановки = ПараметрыOVM.КаталогУстановкиПоУмолчанию();
КаталогУстановкиВерсии = ОбъединитьПути(КаталогУстановки, АлиасВерсии);
@@ -115,12 +117,14 @@
Лог.Информация("Скачиваю установщик версии %1%2...", ВерсияКУстановке, ?(ИспользоватьХ64, "-x64", ""));
ПутьКСохраняемомуФайлу = ВременныеФайлы.НовоеИмяФайла("zip");
-
- Соединение = ФабрикаИнтернетСоединения.Создать();
-
- Ресурс = ПолучитьПутьКСкачиваниюФайла(ВерсияКУстановке, ИспользоватьХ64, ИспользоватьFDD);
+
+ ПараметрыСкачивания = ПолучитьПараметрыСкачиванияФайла(ВерсияКУстановке, ИспользоватьХ64, ИспользоватьFDD);
+
+ Соединение = ФабрикаИнтернетСоединения.Создать(ПараметрыСкачивания.Сервер);
+
+ Ресурс = ПараметрыСкачивания.Ресурс;
Запрос = Новый HTTPЗапрос(Ресурс);
-
+
Лог.Отладка("Сервер: %1. Ресурс: %2", Соединение.Сервер, Ресурс);
Ответ = Соединение.Получить(Запрос, ПутьКСохраняемомуФайлу);
@@ -260,44 +264,80 @@
Процедура ПроверитьКорректностьПереданнойВерсии(Знач ВерсияКУстановке)
Если НЕ ЭтоДопустимыйНомерВерсии(ВерсияКУстановке)
- И Не ВерсииOneScript.ДопустимыеАлиасы().СодержитКлюч(ВерсияКУстановке) Тогда
-
+ И Не ВерсииOneScript.ДопустимыеАлиасы().СодержитКлюч(ВерсияКУстановке)
+ И Не ВерсииOneScript.ЭтоКорректнаяСпецификацияСборки(ВерсияКУстановке) Тогда
+
Лог.Ошибка("Версия имеет некорректный формат");
ВызватьИсключение ВерсияКУстановке;
КонецЕсли;
КонецПроцедуры
-Функция ПолучитьПутьКСкачиваниюФайла(Знач ВерсияКУстановке, Знач ИспользоватьХ64, Знач ИспользоватьFDD)
+// Определяет сервер и ресурс, с которых необходимо скачать дистрибутив версии
+//
+// Параметры:
+// ВерсияКУстановке - Строка - Устанавливаемая версия или спецификация сборки
+// ИспользоватьХ64 - Булево - Устанавливать версию x64
+// ИспользоватьFDD - Булево - Устанавливать fdd дистрибутив
+//
+// Возвращаемое значение:
+// Структура - Параметры скачивания дистрибутива:
+// * Сервер - Строка - Адрес сервера, с которого скачивается дистрибутив
+// * Ресурс - Строка - Адрес файла дистрибутива относительно адреса сервера
+//
+Функция ПолучитьПараметрыСкачиванияФайла(Знач ВерсияКУстановке, Знач ИспользоватьХ64, Знач ИспользоватьFDD)
ОпределительДистрибутива = КоробочкаСОпределителями.Достать()
.ИспользоватьХ64(ИспользоватьХ64)
.ИспользоватьFDD(ИспользоватьFDD);
- Если ЭтоДопустимыйНомерВерсии(ВерсияКУстановке) Тогда
+ Если ВерсииOneScript.ЭтоСборкаСервераСборок(ВерсияКУстановке) Тогда
+
+ // Сервер сборок собирает только дистрибутивы OneScript 2.x
+ ОпределительДистрибутива.ЭтоДистрибутивНеткор(Истина);
- ИскомаяВерсия = ВерсияКУстановке;
- ОпределительДистрибутива.ЭтоДистрибутивНеткор(СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "2.0") >= 0);
+ ПараметрыСборки = ВерсииOneScript.ПараметрыСборки(ВерсияКУстановке);
+ ПереченьФайлов = ВерсииOneScript.ПолучитьДоступныеВидыДистрибутивовСборки(
+ ПараметрыСборки.ИмяСборки,
+ ПараметрыСборки.НомерСборки);
+
+ АдресСервера = ПараметрыOVM.АдресСервераСборок();
Иначе
- ДанныеВерсии = ВерсииOneScript.ДопустимыеАлиасы()
- .Получить(ВерсияКУстановке)
- .ИначеВызватьИсключение("Ошибка получения пути к файлу по версии");
+ Если ЭтоДопустимыйНомерВерсии(ВерсияКУстановке) Тогда
- ИскомаяВерсия = ДанныеВерсии.Метка;
+ ИскомаяВерсия = ВерсияКУстановке;
+ ОпределительДистрибутива.ЭтоДистрибутивНеткор(
+ СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "2.0") >= 0);
- КонецЕсли;
+ Иначе
- ПереченьФайлов = ВерсииOneScript.ПолучитьДоступныеВидыДистрибутивовВерсии(ИскомаяВерсия);
+ ДанныеВерсии = ВерсииOneScript.ДопустимыеАлиасы()
+ .Получить(ВерсияКУстановке)
+ .ИначеВызватьИсключение("Ошибка получения пути к файлу по версии");
- Возврат ОпределительДистрибутива.Выбрать(ПереченьФайлов);
+ ИскомаяВерсия = ДанныеВерсии.Метка;
+
+ КонецЕсли;
+
+ ПереченьФайлов = ВерсииOneScript.ПолучитьДоступныеВидыДистрибутивовВерсии(ИскомаяВерсия);
+
+ АдресСервера = ПараметрыOVM.АдресСайтаОСкрипт();
+
+ КонецЕсли;
+
+ Возврат Новый Структура(
+ "Сервер, Ресурс",
+ АдресСервера,
+ ОпределительДистрибутива.Выбрать(ПереченьФайлов));
КонецФункции
Функция ПроверитьВозможностьУстановкиX64(ВерсияКУстановке)
-
- Возврат ВерсииOneScript.ДопустимыеАлиасы().СодержитКлюч(ВерсияКУстановке)
+
+ Возврат ВерсииOneScript.ЭтоСборкаСервераСборок(ВерсияКУстановке)
+ Или ВерсииOneScript.ДопустимыеАлиасы().СодержитКлюч(ВерсияКУстановке)
Или СтроковыеФункции.СравнитьВерсии(ВерсияКУстановке, "1.2.0") >= 0;
КонецФункции
diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\230\320\275\321\202\320\265\321\200\320\275\320\265\321\202\320\241\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\230\320\275\321\202\320\265\321\200\320\275\320\265\321\202\320\241\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217.os"
index 6733265..8ee4b8e 100644
--- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\230\320\275\321\202\320\265\321\200\320\275\320\265\321\202\320\241\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217.os"
+++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\230\320\275\321\202\320\265\321\200\320\275\320\265\321\202\320\241\320\276\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217.os"
@@ -26,7 +26,19 @@
Процедура ПриСозданииОбъекта()
КонецПроцедуры
-Функция Создать() Экспорт
+// Создать соединение с указанным сервером
+//
+// Параметры:
+// АдресСервера - Строка - Адрес сервера. По умолчанию используется адрес сайта OneScript
+//
+// Возвращаемое значение:
+// HTTPСоединение - Соединение с сервером
+//
+Функция Создать(Знач АдресСервера = "") Экспорт
+ Если Не ЗначениеЗаполнено(АдресСервера) Тогда
+ АдресСервера = АдресСайтаОСкрипт;
+ КонецЕсли;
+
Если ИспользоватьПрокси = "true" Тогда
Если Не ЗначениеЗаполнено(ПроксиСервер) Тогда
@@ -63,7 +75,7 @@
Таймаут = 10;
Соединение = Новый HTTPСоединение(
- АдресСайтаОСкрипт,
+ АдресСервера,
,
,
,
diff --git a/tests/buildServerTests.os b/tests/buildServerTests.os
new file mode 100644
index 0000000..edae3c4
--- /dev/null
+++ b/tests/buildServerTests.os
@@ -0,0 +1,290 @@
+/////////////////////////////////////////////////////
+// Тесты установки сборок с сервера сборок (build.oscript.io)
+/////////////////////////////////////////////////////
+
+#Использовать "../src/core"
+
+Перем Версии;
+Перем Провайдер;
+
+// BSLLS:DuplicateStringLiteral-off
+
+#Область РазборСпецификацииСборки
+
+&ПараметризованныйТест
+&ИсточникЗначение("branch:develop", Истина)
+&ИсточникЗначение("branch:feature/my-branch", Истина)
+&ИсточникЗначение("BRANCH:develop", Истина)
+&ИсточникЗначение("pr:1731", Истина)
+&ИсточникЗначение("PR:1731", Истина)
+&ИсточникЗначение("branch:develop#777", Истина)
+&ИсточникЗначение("1.9.2", Ложь)
+&ИсточникЗначение("dev", Ложь)
+&ИсточникЗначение("", Ложь)
+Процедура ОпределяетЧтоВерсияЯвляетсяСборкойСервераСборок(Знач Версия, Знач Ожидание) Экспорт
+
+ Ожидаем.Что(Версии.ЭтоСборкаСервераСборок(Версия), Версия).Равно(Ожидание);
+
+КонецПроцедуры
+
+&ПараметризованныйТест
+&ИсточникЗначение("branch:develop", "develop", "")
+&ИсточникЗначение("branch:feature/my-branch", "feature/my-branch", "")
+&ИсточникЗначение("BRANCH: develop ", "develop", "")
+&ИсточникЗначение("pr:1731", "PR-1731", "")
+&ИсточникЗначение("pr:PR-1731", "PR-1731", "")
+&ИсточникЗначение("branch:develop#777", "develop", "777")
+&ИсточникЗначение("pr:1731#3", "PR-1731", "3")
+Процедура РазбираетСпецификациюСборкиНаИмяИНомер(Знач Версия, Знач ИмяСборки, Знач НомерСборки) Экспорт
+
+ ПараметрыСборки = Версии.ПараметрыСборки(Версия);
+
+ Ожидаем.Что(ПараметрыСборки.ИмяСборки, Версия).Равно(ИмяСборки);
+ Ожидаем.Что(ПараметрыСборки.НомерСборки, Версия).Равно(НомерСборки);
+
+КонецПроцедуры
+
+&Тест
+Процедура СчитаетРешеткуЧастьюИмениВеткиЕслиЗаНейНеНомер() Экспорт
+
+ ПараметрыСборки = Версии.ПараметрыСборки("branch:feature/issue#42-fix");
+
+ Ожидаем.Что(ПараметрыСборки.ИмяСборки).Равно("feature/issue#42-fix");
+ Ожидаем.Что(ПараметрыСборки.НомерСборки).Равно("");
+
+КонецПроцедуры
+
+&Тест
+Процедура ВыбрасываетИсключениеПриРазбореОбычнойВерсииКакСборки() Экспорт
+
+ ПараметрыДействия = Новый Массив;
+ ПараметрыДействия.Добавить("1.9.2");
+
+ Ожидаем.Что(Версии).Метод("ПараметрыСборки", ПараметрыДействия)
+ .ВыбрасываетИсключение("Версия <1.9.2> не является сборкой сервера сборок");
+
+КонецПроцедуры
+
+&ПараметризованныйТест
+&ИсточникЗначение("branch:develop", Истина)
+&ИсточникЗначение("branch:feature/my-branch", Истина)
+&ИсточникЗначение("branch:develop#777", Истина)
+&ИсточникЗначение("pr:1731", Истина)
+&ИсточникЗначение("pr:PR-1731", Истина)
+&ИсточникЗначение("pr:1731#3", Истина)
+// Имя задания пул-реквеста на сервере сборок всегда PR-<номер>
+&ИсточникЗначение("pr:abc", Ложь)
+&ИсточникЗначение("pr:PR-abc", Ложь)
+&ИсточникЗначение("pr:", Ложь)
+&ИсточникЗначение("branch:", Ложь)
+&ИсточникЗначение("1.9.2", Ложь)
+&ИсточникЗначение("dev", Ложь)
+Процедура ПроверяетКорректностьСпецификацииСборки(Знач Версия, Знач Ожидание) Экспорт
+
+ Ожидаем.Что(Версии.ЭтоКорректнаяСпецификацияСборки(Версия), Версия).Равно(Ожидание);
+
+КонецПроцедуры
+
+&ПараметризованныйТест
+&ИсточникЗначение("branch:develop", "develop")
+&ИсточникЗначение("branch:feature/my-branch", "feature-my-branch")
+&ИсточникЗначение("pr:1731", "PR-1731")
+&ИсточникЗначение("branch:develop#777", "develop-777")
+&ИсточникЗначение("pr:1731#3", "PR-1731-3")
+&ИсточникЗначение("1.9.2", "1.9.2")
+&ИсточникЗначение("dev", "dev")
+Процедура ВозвращаетАлиасУстановкиПоУмолчанию(Знач Версия, Знач Ожидание) Экспорт
+
+ Ожидаем.Что(Версии.АлиасПоУмолчанию(Версия), Версия).Равно(Ожидание);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область АдресаСборок
+
+&ПараметризованныйТест
+&ИсточникЗначение("develop", "", "job/1Script/job/develop/lastSuccessfulBuild")
+&ИсточникЗначение("PR-1731", "", "job/1Script/job/PR-1731/lastSuccessfulBuild")
+&ИсточникЗначение("feature/my-branch", "", "job/1Script/job/feature%252Fmy-branch/lastSuccessfulBuild")
+&ИсточникЗначение("develop", "777", "job/1Script/job/develop/777")
+&ИсточникЗначение("PR-1731", "3", "job/1Script/job/PR-1731/3")
+Процедура ФормируетАдресСборки(Знач ИмяСборки, Знач НомерСборки, Знач Ожидание) Экспорт
+
+ Ожидаем.Что(Провайдер.АдресСборки("1Script", ИмяСборки, НомерСборки), ИмяСборки).Равно(Ожидание);
+
+КонецПроцедуры
+
+&ПараметризованныйТест
+&ИсточникЗначение("develop", "", "develop")
+&ИсточникЗначение("develop", "777", "develop#777")
+&ИсточникЗначение("PR-1731", "3", "PR-1731#3")
+Процедура ФормируетПредставлениеСборкиДляСообщений(Знач ИмяСборки, Знач НомерСборки, Знач Ожидание) Экспорт
+
+ Ожидаем.Что(Провайдер.ПредставлениеСборки(ИмяСборки, НомерСборки), ИмяСборки).Равно(Ожидание);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ОпределениеВидаДистрибутива
+
+&ПараметризованныйТест
+&ИсточникЗначение("OneScript-2.2.0-dev+777-fdd-x86.zip", "fdd", "x86")
+&ИсточникЗначение("OneScript-2.2.0-dev+777-fdd-x64.zip", "fdd", "x64")
+&ИсточникЗначение("OneScript-2.2.0-dev+777-win-x86.zip", "scd-win", "x86")
+&ИсточникЗначение("OneScript-2.2.0-dev+777-win-x64.zip", "scd-win", "x64")
+&ИсточникЗначение("OneScript-2.2.0-dev+777-linux-x64.zip", "scd-lin", "x64")
+&ИсточникЗначение("OneScript-2.2.0-dev+777-osx-x64.zip", "osx-x64", "x64")
+&ИсточникЗначение("OneScript-2.2.0-dev+777-osx-arm64.zip", "osx-arm64", "x64")
+&ИсточникЗначение("OneScript-2.1.0-linux-x64.zip", "scd-lin", "x64")
+Процедура ОпределяетВидДистрибутиваПоИмениФайла(Знач ИмяФайла, Знач Вид, Знач Архитектура) Экспорт
+
+ ОписаниеДистрибутива = Провайдер.ОписаниеДистрибутиваПоИмениФайла(ИмяФайла);
+
+ Ожидаем.Что(ОписаниеДистрибутива, ИмяФайла).Существует();
+ Ожидаем.Что(ОписаниеДистрибутива.Вид, ИмяФайла).Равно(Вид);
+ Ожидаем.Что(ОписаниеДистрибутива.Архитектура, ИмяФайла).Равно(Архитектура);
+
+КонецПроцедуры
+
+&ПараметризованныйТест
+&ИсточникЗначение("oscript-debug-1.1.0.vsix")
+&ИсточникЗначение("syntax-helper.json")
+&ИсточникЗначение("OneScript.2.2.0-dev.nupkg")
+&ИсточникЗначение("tests.xml")
+Процедура НеОпределяетВидДистрибутиваДляПостороннихАртефактов(Знач ИмяФайла) Экспорт
+
+ Ожидаем.Что(Провайдер.ОписаниеДистрибутиваПоИмениФайла(ИмяФайла), ИмяФайла).ЭтоНеопределено();
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область РазборСпискаАртефактов
+
+&Тест
+Процедура ОтбираетДистрибутивыИзСпискаАртефактовСборки() Экспорт
+
+ ПереченьФайлов = Провайдер.ДистрибутивыИзОписанияАртефактов(
+ ОтветСоСпискомАртефактов(),
+ "job/1Script/job/develop/lastSuccessfulBuild/artifact"
+ );
+
+ Ожидаем.Что(ПереченьФайлов.Количество()).Равно(7);
+
+ КритерийПоиска = Новый Структура("Вид, Архитектура", "scd-lin", "x64");
+ НайденныеСтроки = ПереченьФайлов.НайтиСтроки(КритерийПоиска);
+
+ Ожидаем.Что(НайденныеСтроки.Количество()).Равно(1);
+ Ожидаем.Что(НайденныеСтроки[0].ИмяФайла).Равно("OneScript-2.2.0-dev+777-linux-x64.zip");
+ Ожидаем.Что(НайденныеСтроки[0].Ссылка).Равно(
+ "job/1Script/job/develop/lastSuccessfulBuild/artifact/built/OneScript-2.2.0-dev+777-linux-x64.zip"
+ );
+
+КонецПроцедуры
+
+&Тест
+Процедура ВозвращаетПустойПереченьФайловДляСборкиБезАртефактов() Экспорт
+
+ ПереченьФайлов = Провайдер.ДистрибутивыИзОписанияАртефактов("{""artifacts"": []}", "artifact");
+
+ Ожидаем.Что(ПереченьФайлов.Количество()).Равно(0);
+
+КонецПроцедуры
+
+&Тест
+Процедура ВозвращаетПустойПереченьФайловЕслиОтветБезКлючаАртефактов() Экспорт
+
+ ПереченьФайлов = Провайдер.ДистрибутивыИзОписанияАртефактов("{""number"": 777}", "artifact");
+
+ Ожидаем.Что(ПереченьФайлов.Количество()).Равно(0);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область РазборСпискаСборок
+
+&Тест
+Процедура ОтбираетДоступныеСборкиИзСпискаЗаданий() Экспорт
+
+ ДоступныеСборки = Провайдер.СборкиИзОписанияЗаданий(ОтветСоСпискомЗаданий());
+
+ // Задания без успешных сборок в список не попадают
+ Ожидаем.Что(ДоступныеСборки.Количество()).Равно(3);
+
+ Ожидаем.Что(ДоступныеСборки[0].Алиас).Равно("pr:1555");
+ Ожидаем.Что(ДоступныеСборки[0].Путь).Равно("https://build.oscript.io/job/1Script/job/PR-1555/");
+
+ Ожидаем.Что(ДоступныеСборки[1].Алиас).Равно("branch:develop");
+
+ // Косая черта в имени ветки приходит от Jenkins в закодированном виде
+ Ожидаем.Что(ДоступныеСборки[2].Алиас).Равно("branch:copilot/fix-debug-attach-issue");
+
+КонецПроцедуры
+
+&Тест
+Процедура ВозвращаетПустойСписокСборокЕслиОтветБезКлючаЗаданий() Экспорт
+
+ ДоступныеСборки = Провайдер.СборкиИзОписанияЗаданий("{""_class"": ""WorkflowMultiBranchProject""}");
+
+ Ожидаем.Что(ДоступныеСборки.Количество()).Равно(0);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+Функция ОтветСоСпискомАртефактов()
+
+ Возврат "{
+ | ""_class"": ""org.jenkinsci.plugins.workflow.job.WorkflowRun"",
+ | ""artifacts"": [
+ | {""fileName"": ""syntax-helper.json"", ""relativePath"": ""built/docs/json/syntax-helper.json""},
+ | {""fileName"": ""OneScript.2.2.0-dev.nupkg"", ""relativePath"": ""built/nuget/OneScript.2.2.0-dev.nupkg""},
+ | {""fileName"": ""OneScript-2.2.0-dev+777-fdd-x64.zip"", ""relativePath"": ""built/OneScript-2.2.0-dev+777-fdd-x64.zip""},
+ | {""fileName"": ""OneScript-2.2.0-dev+777-fdd-x86.zip"", ""relativePath"": ""built/OneScript-2.2.0-dev+777-fdd-x86.zip""},
+ | {""fileName"": ""OneScript-2.2.0-dev+777-linux-x64.zip"", ""relativePath"": ""built/OneScript-2.2.0-dev+777-linux-x64.zip""},
+ | {""fileName"": ""OneScript-2.2.0-dev+777-osx-arm64.zip"", ""relativePath"": ""built/OneScript-2.2.0-dev+777-osx-arm64.zip""},
+ | {""fileName"": ""OneScript-2.2.0-dev+777-osx-x64.zip"", ""relativePath"": ""built/OneScript-2.2.0-dev+777-osx-x64.zip""},
+ | {""fileName"": ""OneScript-2.2.0-dev+777-win-x64.zip"", ""relativePath"": ""built/OneScript-2.2.0-dev+777-win-x64.zip""},
+ | {""fileName"": ""OneScript-2.2.0-dev+777-win-x86.zip"", ""relativePath"": ""built/OneScript-2.2.0-dev+777-win-x86.zip""},
+ | {""fileName"": ""oscript-debug-1.1.0.vsix"", ""relativePath"": ""built/vscode/oscript-debug-1.1.0.vsix""}
+ | ]
+ |}";
+
+КонецФункции
+
+Функция ОтветСоСпискомЗаданий()
+
+ Возврат "{
+ | ""_class"": ""org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject"",
+ | ""jobs"": [
+ | {
+ | ""name"": ""PR-1555"",
+ | ""url"": ""https://build.oscript.io/job/1Script/job/PR-1555/"",
+ | ""lastSuccessfulBuild"": {""number"": 7}
+ | },
+ | {
+ | ""name"": ""PR-1566"",
+ | ""url"": ""https://build.oscript.io/job/1Script/job/PR-1566/"",
+ | ""lastSuccessfulBuild"": null
+ | },
+ | {
+ | ""name"": ""develop"",
+ | ""url"": ""https://build.oscript.io/job/1Script/job/develop/"",
+ | ""lastSuccessfulBuild"": {""number"": 777}
+ | },
+ | {
+ | ""name"": ""copilot%2Ffix-debug-attach-issue"",
+ | ""url"": ""https://build.oscript.io/job/1Script/job/copilot%252Ffix-debug-attach-issue/"",
+ | ""lastSuccessfulBuild"": {""number"": 1}
+ | }
+ | ]
+ |}";
+
+КонецФункции
+
+///////////////////////////
+Версии = Новый ВерсииOneScript;
+Провайдер = Новый ПровайдерДистрибутивовСборки;