Skip to content

saby/builder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
Служебный пользователь Инц №52255
Jun 8, 2023
b3f7f85 · Jun 8, 2023

History

1 Commit
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023
Jun 8, 2023

Repository files navigation

Builder

Ответственные:

  • Колбешин Ф.А.
  • Крылов М.А.

Builder - утилита для сборки клиентского кода проектов на платформе СБИС3. Сборка - процесс преобразования исходного кода в работающее приложение. Ответственны

Пользовательская документация

Техническая документация

Участок работ

Задачи npm

Описаны в package.json. Запускаются из корневого каталога:

    npm run <имя команды>

Перед любым запуском нужно выполнить

npm run fastInstall

Данная команда делает то же самое, что и "npm install", но выкачивает дополнительно через git платформенные репозитории, необходимые для работы шаблонизатора в билдере.

Т.к. в проекте есть .npmrc, то о флагах обычно можно не думать.

Задачи npm для CI/CD

  1. build - основная задача сборки проекта. Запускает build:verify и build:only. Артефакты: папка dest (готовый builder для SDK), файл eslint-report.log (отчёт ESLint только об ошибках), xunit.log и xunit-result.xml (резултьтат тестирования)
  2. build:only - копирует нужные исходники в папку dest и устанавливает зависимости.
  3. build:verify - проверка кода через ESLint(build:lint) и юнит тесты(build:test). Артефакты: файл eslint-report.log, xunit.log и xunit-result.xml.

Задачи npm для разработки

  1. test - запустить юнит тесты.
  2. test:coverage - узнать % покрытия кода юниттестами. Артефакт: файл отчёта coverage/index.html.
  3. lint - запустить ESLint. Если ESLint упал - точно будут проблемы при сборке. Варнинги можно игнорировать, но лучше поправить.
  4. lint:fix - запустить ESLint с флагом --fix. Поправит самые простые ошибки.
  5. lint:errors - выведет только ошибки, что уронят сборку.

Про .npmrc

Флаг --legacy-bundling нужен для корректной установки зависимостей пакета sbis3-json-generator.

Про package-lock.json

package-lock.json нужен для фиксации конкретных версий пакетов для всего дерева зависимостей. Это нужно для:

  1. Повторяемой сборки
  2. Безопасности при обновлении минорных пакетов в глубине дерева зависимостей.
  3. Быстрой установки зависимости через "npm ci" (NPM 6+)

Подробнее:

Использование Builder'а

Задача build

Основная задача сборки статики проекта.

Выполнить из папки builder'а:

    node ./node_modules/gulp/bin/gulp.js --gulpfile ./gulpfile.js build --config=custom_config.json

Где custom_config.json - путь до JSON конфигурации в формате:

  {
     "cache": "путь до папки с кешем",
     "output": "путь до папки с ресурсами статики стенда",
     "localization": ["ru-RU", "en-US"] | false,            //опционально. список локализаций
     "default-localization": "ru-RU",                       //опционально, если нет "localization"
     "logs": "путь до папки для записи логов",              //опционально, используется для записи builder_report.json
     "multi-service": false|true,                           //опционально. по умолчанию false. Собираем один сервис или несколько. От этого зависит будем ли мы менять константы в статических html и пакетах.
     "url-service-path": "путь до текущего сервиса",        //опционально. по умолчанию "/"
     "typescript": true|false,                              //опционально, по умолчанию false. Задача компиляции TypeScript в модули AMD-формата.
     "modules": [                                           //сортированный по графу зависимостей список модулей
        {
          "name": "имя модуля",
          "path": "путь до папки модуля",
          "responsible": "ответственный",
          "preload_urls": ["url1", "url2"]
        }
     ]
  }

После сборки в папке с кешем создаётся файл "last_build_gulp_config.json" - копия последнего оригинального файла конфигурации.

Полный список флагов для настройки сборщика(указываются в custom_config.json):

1) typescript

Компиляция typescript в модули AMD-формата.
Принимаемые значения: false/true
Значение по умолчанию: false.
Для набора исходников(на примере модуля Data)результат работы сборщика будет иметь вид: GitHub Logo

2) less

Компиляция less в css.
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере Controls/Button)результат работы сборщика будет иметь вид: GitHub Logo

3) presentationServiceMeta

Генерация базовых мета-файлов сборщика, необходимых для работы Сервиса Представлений:

  1. "navigation-modules.json" -набор модулей для Серверного конфигурирования правого аккордеона
  2. "routes-info.json" -информация для работы роутинга на Сервисе Представлений
  3. "static_templates.json" -информация для корректной отдачи статических html в Сервисе Представлений

Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере модуля Data)результат работы сборщика будет иметь вид: GitHub Logo

4) contents

Генерация мета-файла contents.json, необходимого для работы приложения.
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере модуля Data)результат работы сборщика будет иметь вид: GitHub Logo

5) compress

Генерация архивированных версий для каждого файла статики (для раздачи Диспетчером). Архивированные версии файла будут созданы только для минифицированных исходников(результат работы флага "minimize")
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере модуля WS.Core) результат работы сборщика будет иметь вид: GitHub Logo

6) deprecatedWebPageTemplates

Сборка статических html, задаваемых через механизм webPage.
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере PersonalCertificates)результат работы сборщика будет иметь вид: GitHub Logo

7) htmlWml

Cборка статических html на VDOM.
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере TestPlatform/TestsPlatform/File/Page)результат работы сборщика будет иметь вид: GitHub Logo

8) minimize

Минификация модулей AMD-формата.
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере Controls/Application/TouchDetector) результат работы сборщика будет иметь вид: GitHub Logo

9) wml

Компиляция динамических(tmpl, wml) шаблонов.
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере Controls/Application/TouchDetector) результат работы сборщика будет иметь вид: GitHub Logo .min.wml содержит скомпилированный и минифицированный шаблон.

10) deprecatedXhtml

Компиляция динамических устаревших шаблонов xhtml.
Принимаемые значения: false/true.
Значение по умолчанию: false.
Результат работы сборщика аналогичен опции wml.

11) deprecatedOwnDependencies

Упаковка вместе с компонентов его собственных шаблонных зависимостей.
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере Controls/Tabs)результат работы сборщика будет иметь вид: GitHub Logo .min.js содержит компонент с запакованными в него собственными шаблонными зависимостями.
.min.original.js содержит оригинальное содержимое компонента до паковки.\

12) deprecatedStaticHtml

Паковка статических html-страниц. Выполняется по аналогии с runtime-паковкой на Сервисе Представлений(rtpackage)
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере PersonalCertificates) результат работы сборщика будет иметь вид: GitHub Logo static_packages содержит пакеты для каждой построенной статической html.\

13) customPack

Паковка по созданной разработчиком пользовательской конфигурации - файл формата package.json
Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере модуля WS.Core)результат работы сборщика будет иметь вид: GitHub Logo

14) dependenciesGraph

Генерация дерева AMD-зависимостей.\ Где используется:

  1. runtime паковка на Сервисе Представлений(rtpackage).
  2. Работа Chrome-плагина по анализу зависимостей SBIS Denendency Tree.

Принимаемые значения: false/true.
Значение по умолчанию: false.
Для набора исходников(на примере модуля WS.Core) результат работы сборщика будет иметь вид: GitHub Logo

15) sources

Копируем исходный код файлов в конечную директорию.
Принимаемые значения: false/true.
Значение по умолчанию: true.
Для набора исходников(на примере модуля View) результат работы сборщика будет иметь следующий вид:
Флаг установлен в значение false: GitHub Logo Флаг установлен в значение true: GitHub Logo

16) symlinks

Создаём символические ссылки для исходного кода проекта.
Принимаемые значения: false/true.
Значение по умолчанию: true.
Для набора исходников(на примере модуля Types) результат работы сборщика будет иметь следующий вид:
Флаг установлен в значение false: GitHub Logo Флаг установлен в значение true: GitHub Logo

17) sourceMaps

Создаём sourceMaps для ts/js/wml/tmpl/xhtml файлов. Примечание: sourceMaps на текущем этапе создаются только для минифицированного кода:
Принимаемые значения: false/true.
Значение по умолчанию: false.
Флаг установлен в значение false: GitHub Logo Флаг установлен в значение true: GitHub Logo

18) tsc

Выполнение в сборке проекта команды компилятора typescript - tsc с флагом --noEmit (компиляция typescript без сохранения результатов компиляции - для выявления ошибок в typescript-исходниках вашего проекта)
Принимаемые значения: false/true.
Значение по умолчанию: false.\

19) staticServer

Адрес сервера статики, для которого сборщик сформирует POST-запрос со списком всех измененных файлов в рамках текущего проекта. Принимаемые значения: адрес хоста в виде строки. Пример: "localhost:8080".
Значение по умолчанию: false.\

20) checkConfig

Указывает сборщику, нужно ли проверять gulp_config на совместимость с текущим кэшем сборки. При несовместимости весь кеш будет сброшен. Принимаемые значения: false/true.
Значение по умолчанию: true.\

21) themes

С помощью этого флага можно задать, какие темы надо собирать в рамках текущего проекта. Пример: Флаг themes: ["default__dark"] указывает билдеру, что во всех Интерфейсных модулях с темой default нужно собрать только less внутри директории dark. Флаг themes: ["default"] указывает билдеру, что во всех Интерфейсных модулях с темой default нужно собрать все less. Флаг themes: true указывает билдеру, что нужно собрать все less во всех Интерфейсных модулях во всех темах. Принимаемые значения: false/true/[<список тем, включая их модификаторы>].
Значение по умолчанию: true.\

Задача buildOnChange

Задача по обновлению одного файла в развёрнутом локальном стенде. Обычно вызывается из WebStorm.

Выполнить из папки builder'а:

    node ./node_modules/gulp/bin/gulp.js --gulpfile ./gulpfile.js buildOnChange --config=last_build_gulp_config.json --filePath="FilePath"

Где last_build_gulp_config.json - путь до JSON конфигурации последней сборки, FilePath - файл который мы хотим обновить.

Задача runTypescript

Задача по запуску typescript для модулей, описанных в gulp_config.

Выполнить из папки builder'а:

    node ./node_modules/gulp/bin/gulp.js --gulpfile ./gulpfile.js runTypescript --config=gulp_config.json

Где gulp_config.json - путь до JSON конфигурации сборки, используемой в основной задаче сборки "build"

Задача collectWordsForLocalization

Задача сборa фраз для локализации статики. Нужно для genie.sbis.ru и wi.sbis.ru.

Выполнить из папки builder'а:

    node ./node_modules/gulp/bin/gulp.js --gulpfile ./gulpfile.js collectWordsForLocalization --config=custom_config.json

Где custom_config.json - путь до JSON конфигурации в формате:

  {
     "cache": "путь до папки с кешем",
     "output": "путь до результирующего json файла",
     "modules": [{                                          //сортированный по графу зависимостей список модулей
        "name": "имя модуля",
        "path": "путь до папки модуля",
        "responsible": "ответственный"
     }]
  }

Тестирование

Builder тестируем через модульные тесты с помощью mocha и chai. Для локальной отладки тестов нужно настроить среду разработки на запуск mochа в папке test. Нужно обязательно указать параметр "--timeout 600000". Такой огромный таймаут нужен по двум причинам:

  1. тесты на MacOS идут дольше, чем на windows и centos
  2. интеграционные тесты тоже пишем в терминах mocha. Возможно, это не совсем корректно и нужно переделать.

Style guide

Стандарт разработки на JavaScript описан тут.

Чтобы эти требования соблюдались, написан конфиг для ESLint - файл ".eslintrc" в корне проекта. В конфиге нулевая толерантность к несоответствию style guide. Причины описаны тут и тут

Также не пренебрегайте функцией Inspect Code в WebStorm.

Логирование и вывод ошибок

Логирование и вывод ошибок осуществляется через универсальный логгер: sbis3-builder/lib/logger.js Пример использования:

    const logger = require('./lib/logger').logger();
    logger.debug('Сообщение не будет видно пользователям, но будет в логах');
    logger.info('Сообщение будет видно пользователям и будет в логах');
    logger.warning('Текст предупреждения');
    logger.error('Текст ошибки');
    logger.error({ //аналогично можно вызывать logger.warning.
        message: 'Текст ошибки', //если не задать, то будет выведено error.message
        filePath: filePath, //полный путь до файла, крайне желательно
        moduleInfo: moduleInfo, // экземпляр класса ModuleInfo, если есть. актуально для Gulp.
        error: error //пойманное исключение, если есть
    });

Вывод сообщений уровня debug включается при запуске утилиты с флагом -LLLL. Побробнее тут.

При запуске утилиты с флагом --log-level можно настроить уровень логгирования:

  1. info - выводить все сообщения, предупреждения и ошибки при работе утилиты.
  2. warning - выводить предупреждения и ошибки при работе утилиты.
  3. error - выводить только ошибки при работе утилиты.

По умолчанию выставляется уровень логгирования info. Пример запуска с логгированием исключительно ошибок:

    node ./node_modules/gulp/bin/gulp.js --gulpfile=./gulpfile.js build --config=custom_config.json --log-level=error

После сборки записывается builder_report.json - отчёт об ошибках и предупреждениях сборки для автоматизации оформления ошибок в системе CI/CD. Флаг --log-level не влияет на builder_report.json, он будет содержать в себе все предупреждения и ошибки независимо от значения флага --log-level.

Также при работе Gulp записывает результаты работы каждого своего шага. Пример:

    [12:32:33] Using gulpfile ~/work/repos/saby/Builder/gulpfile.js
    [12:32:33] Starting 'build'...
    ..............................
    [12:32:35] Finished 'build' after 1.56 s

Чтобы выключить запись таких логов, выполняйте запуск утилиты с флагом --silent.

Подключение и использование в виде npm-пакета.

1) Для подключения Builder в ваш проект необходимо в package.json в секции dependencies прописать

    "sbis3-builder": "git+https://git.sbis.ru/saby/Builder.git#rc-20.1000"

P.S. не забывайте об актуализации ветки Builder, обновлять её необходимо вручную.

2) Выполните npm run fastInstall

3) Создайте в корне проекта файл builder.json. Это конфигурационный файл, по которому Builder будет собирать ваш проект.

Стандартная конфигурация имеет вид:

{
    "cache": <путь до директории с кэшем сборщика>,
    "output": <путь до директории с результатом сборки>,
    "logs": <путь до папки с логами сборки>,
    "modules": [
        {
            "name": <ммя интерфейсного модуля>,
            "path": <путь до интерфейсного модуля>
        }
    ]
}

Остаётся добавить нужные для решения ваших задач флаги Builder. Пример: при задании подобной конфигурации для сборки

{
    "cache": ./.builder/cache,
    "output": ./application,
    "logs": ./.builder/logs,
    "typescript": true,
    "modules": [
        {
            "name": "Types",
            "path": "./node_modules/saby-types/Types"
        }
    ]
}

будет собран весь TypeScript-код интерфейсного модуля Types. Пример задания builder.json смотрите также здесь

4) Запустите Builder с помощью команды

    node node_modules/gulp/bin/gulp build --gulpfile=gulpfile.js --config=../../builder.json

Примечание 1: Путь до builder.json необходимо указывать относительно директории npm-пакета sbis3-builder
Примечание 2: выполнять данную команду необходимо в корне вашего проекта.
Примечание 3: Чтобы каждый раз не выполнять длинную команду для Builder, вы можете описать её один раз в виде npm-скрипта

"build": "node node_modules/gulp/bin/gulp build --gulpfile=gulpfile.js --config=../../builder.json"

Пример подобного задания можете посмотреть здесь.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages