UNPKG

@netlify/build

Version:
84 lines (83 loc) 3.42 kB
import { handleBuildError } from '../error/handle.js'; import { logStatuses } from '../log/messages/status.js'; import { removeStatusesColors } from './colors.js'; // Report plugin statuses to the console and API export const reportStatuses = async function ({ statuses, childEnv, api, mode, pluginsOptions, netlifyConfig, errorMonitor, deployId, logs, debug, sendStatus, testOpts, }) { const finalStatuses = getFinalStatuses({ statuses, pluginsOptions }); if (finalStatuses.length === 0) { return; } const statusesA = removeStatusesColors(finalStatuses); printStatuses({ statuses: statusesA, mode, logs }); await sendApiStatuses({ statuses: statusesA, childEnv, api, mode, netlifyConfig, errorMonitor, deployId, logs, debug, sendStatus, testOpts, }); }; // Some plugins might not have completed due to a build error. // In that case, we add a dummy plugin run with state "skipped". // This allows the API to know both plugins that have completed and only started const getFinalStatuses = function ({ statuses = [], pluginsOptions }) { return pluginsOptions.map(({ packageName }) => getPluginStatus(packageName, statuses)); }; const getPluginStatus = function (packageName, statuses) { const pluginStatus = statuses.find((status) => status.packageName === packageName); if (pluginStatus !== undefined) { return pluginStatus; } return { packageName, state: 'skipped' }; }; // When not in production, print statuses to console. // Only print successful ones, since errors are logged afterwards. const printStatuses = function ({ statuses, mode, logs }) { if (mode === 'buildbot') { return; } const successStatuses = statuses.filter(shouldPrintStatus); if (successStatuses.length === 0) { return; } logStatuses(logs, successStatuses); }; const shouldPrintStatus = function ({ state, summary }) { return state === 'success' && summary !== undefined; }; // In production, send statuses to the API const sendApiStatuses = async function ({ statuses, childEnv, api, mode, netlifyConfig, errorMonitor, deployId, logs, debug, sendStatus, testOpts, }) { if ((mode !== 'buildbot' && !sendStatus) || api === undefined || !deployId) { return; } await Promise.all(statuses.map((status) => sendApiStatus({ api, status, childEnv, mode, netlifyConfig, errorMonitor, deployId, logs, debug, testOpts }))); }; const sendApiStatus = async function ({ api, status: { packageName, version, state, event, title, summary, text, extraData }, childEnv, mode, netlifyConfig, errorMonitor, deployId, logs, debug, testOpts, }) { try { await api.createPluginRun({ deploy_id: deployId, body: { package: packageName, version, state, reporting_event: event, title, summary, text, extra_data: extraData, }, }); // Bitballoon API randomly fails with 502. // Builds should be successful when this API call fails, but we still want // to report the error both in logs and in error monitoring. } catch (error) { await handleBuildError(error, { errorMonitor, netlifyConfig, childEnv, mode, logs, debug, testOpts }); } };