Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Принудительно завершать сборку #420

Open
teux opened this issue Dec 9, 2015 · 8 comments
Open

Принудительно завершать сборку #420

teux opened this issue Dec 9, 2015 · 8 comments
Labels

Comments

@teux
Copy link

teux commented Dec 9, 2015

Запускаю сборку нескольких нод через API. Одна нода выбрасывает исключение, и управление приходит сюда. Логично ожидать, что сборка остальных нод прервется, но они продолжают собираться.

Если это особенность архитектуры, можно ли принудительно остановить сборку в таком случае?

@levonet
Copy link

levonet commented Dec 15, 2015

\cc @blond

@blond
Copy link
Member

blond commented Dec 21, 2015

@teux, а можешь написать пример как вызываешь сборку нескольких нод?

@teux
Copy link
Author

teux commented Dec 21, 2015

Через API:

var makeApi = require('enb/lib/api/make');

module.exports = co.wrap(function* (config) {
    try {
        yield makeApi(nodes.build, {
            mode: config.mode,
            cache: config.cache,
            graph: config.graph,
            config: function (enbConfig) {
                //...
            }
        });
    } catch (e) {
        console.log(chalk.red('An error occured:\n%s'), e.toString());
    }
});

@blond
Copy link
Member

blond commented Dec 21, 2015

Кейс понял.

Да, действительно ENB так всегда и работало (и через API, и через CLI), что собирало все ноды максимально независимо и поэтому при ошибке в одной продолжает собирать остальные.

Сейчас никаких способов повлиять на это нету.

Можешь подробнее рассказать про свой случай, почему ожидаешь остановки? Я пока не уверен, что такое поведение нужно делать по умолчанию.

@teux
Copy link
Author

teux commented Dec 21, 2015

Хочу собрать ошибки со всех нод и вывести их в консоль как общий результат сборки.

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

Получается, для второй и последующих "плохих" нод внешний код не получает ошибки. И даже ошибка первой ноды, выведенная в консоль, перекроется сообщениями от здоровых нод.

@blond
Copy link
Member

blond commented Dec 21, 2015

Хочу собрать ошибки со всех нод и вывести их в консоль как общий результат сборки.

Хорошее желание :)

Видимо, этот vow.all режектится, как только любая нода кидает исключение.

Да, именно так работает метод vow.all. Чтобы дождаться выполнения всех промисов нужно использовать vow.allResolved. Документация — http://dfilatov.github.io/vow/.

Я бы предложил всегда дожидаться сборки всех таргетов. В случае успеха, как и прежде, отдавать разрезолвленный промис с информацией о собранных таргетах. А вот в случае ошибки возвращать специальный объект ошибки с дополнительными полями/методами с информацией о всех ошибках.

Например:

var error = new BuildTargetsError();

error.failedTargets // ['desktop.bundles/index']
error.targetErrors // [{ target: 'desktop.bundles/index', error: '[TargetNotFoundError]' }]

Это можно сделать не сломав обратную совместимость. Такое решение устроит?

Получается, для второй и последующих "плохих" нод внешний код не получает ошибки. И даже ошибка первой ноды, выведенная в консоль, перекроется сообщениями от здоровых нод.

Давай про логгер думать отдельно.

@teux
Copy link
Author

teux commented Dec 22, 2015

Не уверен. что мы говорим об одном и том же ) Знать про ошибку в конкретном таргете конкретной ноды - хорошо. Но еще лучше получить ошибки по всем нодам.

Вот как мне видится удобный подход. ENB ждет сборку всех нод (allResolved вместо all), анализирует результаты в этом then, и если имеются ошибки, выкидывает BuildNodesError:

throw new BuildNodesError({
    failedNodes: ['desktop.bundles/index'],
    nodeErrors: {
        'desktop.bundles/index': BuildTargetsError
    }]
})```

@blond
Copy link
Member

blond commented Dec 24, 2015

Я на самом деле это же и предлагал :)

Под error.failedTargets имел ввиду таргеты со всех нод, без группировки по нодам.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants