Pull to refresh

Comments 29

Так о чем статья? как сложно устанавливать линт?
Где тогда описание использования утилиты в команде и т.п.?
Статья о том, как его интегрировать с учётом инфраструктуры и потребностей команды.
Использование в команде на текущем этапе не сильно отличается от индивидуального использования. Когда добавим его в наш CI, то, конечно, новые интересные вещи появятся. Но там всё более-менее прозрачно.
UFO just landed and posted this here
Взять и установить линтер — просто. Установить с учётом особенностей окружения — сложнее. А интегрировать с CI действительно несложно. Если у вас уже есть в CI автотесты, то просто добавляется ещё один скрипт, который должен возвратить 0. На примере Jenkins или Travis — это действительно элементарно.

Естественно должны быть хуки. Но читайте внимательнее — это будет чуть дальше. На текущий момент нужно было хотя бы дать разработчиком возможность использовать сам линтер. Хотя бы чтобы было время спокойно отрефакторить код до добавления хуков — а не блокировать всю разработку тем, что внезапно код перестал уходить в репозиторий.
>Третий вариант неплох, но до сих пор мы как-то обходились без таск менеджеров. Добавлять их в проекты ради такой задачи это явный overkill.

Вы уж меня простите, но вы там командой чтоли лендинги какие-то пилите? В 2017 году без таск-раннеров и линтинга со старта это жесть какая-та.

В любом нормальном проекте линтер должен прогонятся после каждого изменения кода, + обязательный прогон перед пушем (вместе с тестами), чтобы не пропустить никакую фигню. И для такого не обязательно иметь большую и серьезную команду, уже с двумя разработчиками жизнь без таких вещей превращается в ад.
Не лендинги, ровно наоборот. Микросервисы без всякого визуального обвеса. Отлично обходимся без таск раннеров.

А отсутствие линтера обусловлено банальным наследованием легаси и большой загрузкой. Вернуться в прошлое и добавить линтер, к сожалению, не представляется возможным. Новые проекты, естественно, стартуют уже с линтером.

Не понял часть про PCI DSS: зачем соблюдать PCI DSS на тестовых серверах, и еще зачем для этого все шифровать? Прошу прощения за такой вопрос, мои знания о PCI DSS очень поверхностные.

Увы, это вопрос к нашим прокачанным по этой теме девопсам. Кажется, у них есть задача обеспечения идентичности работы тестовой и боевой среды.

А шифровать для PCI DSS зачем все? Я по диагонали читал материалы о PCI DSS, но там вроде о тотальном шифровании кода и всех зависимостей вообще не говорится. Или я пропустил, это все такая занудная и плохо структурированная тема, читал скорее для общего развития, чем из необходимости.

Шифруется весь трафик, проходящий между серверами. В том числе код при выкатке.
UFO just landed and posted this here
Естественно, туда передаётся архивированная информация. Это архив со всем добром занимает 200 мегабайт. Подозреваю, что архивации используется с малой степенью компрессии. Ну тут выбор — экономия трафика или CPU. Логичнее использовать второе.
А с ростом объёма зависимостей мы успешно боремся. Со временем их становится меньше.
UFO just landed and posted this here
По месту смогу точно сказать в первый следующий рабочий день — у меня почему-то гораздо больше вышло.
Но наши микросервисы занимают каждый не более 30 мегабайт, так что даже если так, то экономия выходит в два раза.
Как написано в статье, хочу быть как крутые ребята, и уже поставил в задачи внедрить его в CI, поэтому не парюсь и ставлю все зависимости в devDep. Это не сильно увеличивает время сборки проекта при деплое, около ~15 секунд (это было посчитано нашими деплойками).

Правда коллеги приводят довод, что если какой аврал будет, то из — за этого линтера не получится в срочном порядке вылить изменения на прод, а я фыркаю на них…
Ну как же так. Обязательно нужно иметь возможность в срочном порядке вылить баг на прод!

Бывшие C#-овцы. Используем TypeScript и TSlint и горя не знаем. И вам рекомендуем. :)
А для прогона кода между серверами у нас гит с https.

Видимо, у вас нету билд сервера. С ним всё несколько интереснее выходит — но на мой взгляд его наличие оправдано.

Билд сервер — не нужен. Все собираеться за 6-8 секунд и пушиться в гит, откуда его забирает сервер. Мы билд сервер держим только для Android и Quartus, и то потому что иметь 64 Гб памяти на ноутбуках разработчиков невозможно.

Еще у фронтендеров на билд сервере сжатие картинок.

Мне не совсем понятна ваша проблема с devDependency. Правильно ли я понимаю, что в продакшн у вас улетает пакет со всем, что лежит в dependency и devDependency? Если так, то это достаточно странно.

Если вы гоняете автотесты на престейбле, то возможно логичнее выделить тестраннер в отдельный пакет, и все его зависимости перенести в dependency этого пакета. Это должно сэкономить вам еще драгоценное место.

devDependency как мне кажется должны использоваться для другого. В рамках продакш пакета это то место, где вы можете позволить себе указывать неточные версии модулей, потому что знаете, что эти модули не утекут в продакшн.

К слову, если вы заботитесь о надежности сборки пакета, то наиболее надежным подходом будет установка через shrinkwrap из локальной директории. В этом случае вы сможете выкатить хотфикс, даже если npm сломан.
В продакшн, конечно, devDependency не улетает. Как я писал, речь идёт о тестовых серверах.

Выделять тесты в отдельный пакет, который будет в отдельном проекте и репозитории — это нарушать целостность кода. Кроме того, если мы его ставим как devDependency, то он прилетает со всеми своими вложенными devDependency.
Upd. Пардон, попутал, рекурсивная установка devDependencies была багом в некий момент. Но всё равно не хочется тесты в отдельный пакет выделять. А если под тест раннером вы имеете в виду не сами тесты, а окружение для из выполнения, то тут тоже всё не так просто — разные микросервисы могут иметь разный набор требуемых пакетов для тестирования. И придётся либо делать один мега-раннер, в котором собирать всё-всё-всё, либо по раннеру на каждый пакет.

В данном случае я не предлагал вам уносить тесты из проекта, только тестраннер.


Предположим вы используете какой-нибудь стандартный стек тестирования (karma + mocha + chai + istanbul) для project.
Хотя, раз речь идет о микросервисах, вероятно вы обходитесь без karma.
Определенно именно такая связка у вас должна запускаться в dev окружении. Но в продакшн вам не нужен istanbul, а значит и устанавливать его не имеет смысла.


Создаем еще один пакет project-testrunner и собираем у него в зависимостях все, что нужно для тестирования в продакшн.
Для project прописываем в некотором postinst (уж не знаю, какие именно у вас пакеты):


# Плохой пример поиска пакета. Лучше поставить этот пакет как глобальный npm модуль.
if [ -d ../project-testrunner ]; then
    ../project-testrunner/bin/test project/test
else
    echo "Осмысленная ошибка о том, что пакет тестраннера не установлен на машину"
fi

Т.е. мы все так же прогоняем тесты над директорией project/test, но делаем это с помощью внешнего пакета.
Для dev мы можем указать project-testrunner как devDependency и запускать например так:


#package.json

"devDependencies": {
    "project-testrunner": "*"
},
"scripts": {
    "test": "project-testrunner ./test --coverage"
}

Конечно придется ручками написать скрипт testrunner, но это всяко лучше, чем использовать peerDependency не по назначению.
При этом istanbul можно указать как devDependency для project-testrunner

Ммм, а сам testrunner при этом где будет прописан в зависимостях? В devDependencoes его вы вроде предложили не класть.Если в dependencies, то по месту это ничего не меняет — наоборот, эта зависимость начнёт уходить на продакшн. А если он не прописан нигде и стоит на билд сервере, то это усложняет логику тестирования и приводит к неожиданным последствиям в случае разности локального и серверного testrunner'a.

Насчёт зависимостей для тестов — есть ещё одна хорошая issue, в которой предлагают ввести секцию testDependencies, что имхо правильно, но пока что документация по package.json говорит о том, что тесты должны быть в devDependencies.
"lint": "./node_modules/eslint/bin/eslint.js app.js routes modules test App.js"


Лучше написать так:

"lint": "eslint app.js routes modules test App.js"

Это если eslint глобально стоит или привязан симлинком. Мы решили, что лучше использовать локальный eslint — чтобы исключить расхождение по версиям.
UFO just landed and posted this here
npm env = shell $PATH + node executables stuff via npm
Sign up to leave a comment.

Articles