|
1 | 1 | import EventSource from 'eventsource' |
2 | 2 |
|
3 | 3 | import { validate } from './validate' |
4 | | -import { buildUrlHeaders } from './request-builder' |
| 4 | +import { tryParseJson, errors, buildUrlHeaders } from './utils' |
| 5 | +import { logger, workflowLogger } from './logger' |
| 6 | + |
| 7 | +const { EventSourceError } = errors |
5 | 8 |
|
6 | 9 | /** |
7 | 10 | * Take (CF_ prefixed) Env variables and perform http/s request (SSE) to app-proxy for image-report with CF_ENRICHERS |
8 | 11 | */ |
9 | | -async function mainProcess(argv, env): Promise<void> { |
| 12 | +async function main(argv, env): Promise<void> { |
10 | 13 | const verbose = argv.includes('verbose') || env['VERBOSE'] |
11 | 14 | if (verbose) { |
12 | | - console.debug('Running with verbose log') |
| 15 | + logger.debug('running with verbose log') |
13 | 16 | } |
14 | 17 | const payload = validate(env) |
15 | 18 | const { url, headers } = buildUrlHeaders(payload) |
16 | 19 | if (verbose) { |
17 | | - console.debug(`Payload: ${JSON.stringify(payload, null, 2)}`) |
18 | | - console.debug(`Sending request: ${url}, headers: ${JSON.stringify(headers)}`) |
| 20 | + logger.debug(`payload: ${JSON.stringify(payload, null, 2)}`) |
| 21 | + logger.debug(`sending request: ${url}, headers: ${JSON.stringify(headers)}`) |
19 | 22 | } |
20 | 23 | if (payload['CF_CI_TYPE'] && payload['CF_WORKFLOW_URL']) { |
21 | | - console.info(`Running ${payload['CF_CI_TYPE']} URL: ${payload['CF_WORKFLOW_URL']}`) |
| 24 | + logger.info(`CI provider: ${payload['CF_CI_TYPE']}, job URL: ${payload['CF_WORKFLOW_URL']}`) |
22 | 25 | } |
23 | | - const waitFor = new Promise((resolve, reject) => { |
24 | | - const eventSource = new EventSource(url, { headers }) |
| 26 | + const eventSource = new EventSource(url, { headers }) |
| 27 | + const waitFor = new Promise<void>((resolve, reject) => { |
| 28 | + |
25 | 29 | eventSource.addEventListener('report', function (event) { |
26 | | - console.info(`report =>`, JSON.stringify(JSON.parse(event.data), null, 2)) |
| 30 | + logger.info(JSON.stringify(JSON.parse(event.data), null, 2)) |
27 | 31 | }) |
28 | 32 | eventSource.addEventListener('info', function (event) { |
29 | | - console.info(`\t\t${JSON.stringify(event.data)}`) |
| 33 | + logger.info(event.data) |
30 | 34 | }) |
31 | 35 | eventSource.addEventListener('warn', function (event) { |
32 | | - console.warn(`Warning:\t${JSON.stringify(event.data)}`) |
| 36 | + logger.warn(event.data) |
33 | 37 | }) |
34 | | - eventSource.addEventListener('error', (err) => { |
| 38 | + eventSource.addEventListener('workflow-log', function (event) { |
| 39 | + const log = tryParseJson(event.data) |
| 40 | + if (typeof log === 'object' && log.content && log.podName) { |
| 41 | + workflowLogger.info({ pod: log.podName, message: log.content }) |
| 42 | + } else { |
| 43 | + workflowLogger.info(event.data) |
| 44 | + } |
| 45 | + }) |
| 46 | + eventSource.addEventListener('error', (errorEvent) => { |
35 | 47 | eventSource.close() |
36 | | - reject(err) |
| 48 | + |
| 49 | + const error = tryParseJson(errorEvent.data) |
| 50 | + let name |
| 51 | + let message |
| 52 | + if (typeof error === 'string') { |
| 53 | + message = error |
| 54 | + } else if (typeof error === 'object') { |
| 55 | + if (typeof error.message === 'string') { |
| 56 | + message = error.message |
| 57 | + } |
| 58 | + if (typeof error.name === 'string') { |
| 59 | + name = error.name |
| 60 | + } |
| 61 | + } else { |
| 62 | + message = errorEvent.message || 'Unknown error. Something went wrong.' |
| 63 | + } |
| 64 | + reject(new EventSourceError(message, name)) |
37 | 65 | }) |
38 | | - eventSource.addEventListener('end', (ev) => { |
| 66 | + eventSource.addEventListener('end', (event) => { |
39 | 67 | eventSource.close() |
40 | | - resolve(ev) |
| 68 | + logger.info(event.data) |
| 69 | + resolve() |
41 | 70 | }) |
42 | 71 | }) |
43 | 72 | await waitFor |
44 | 73 | } |
45 | 74 |
|
46 | | -async function main(argv, env): Promise<void> { |
47 | | - try { |
48 | | - await mainProcess(argv, env) |
49 | | - } catch (error) { |
50 | | - console.error(error) |
51 | | - if (error.type=='error' && error.status===500) { |
52 | | - const tokenStart = (env['CF_API_KEY'] || '').slice(0, 6) |
53 | | - const tokenEnd = (env['CF_API_KEY'] || '').slice(-6) |
54 | | - console.info(`Error 500 are usually caused by providing an invalid CF_API_KEY, please check that the validity of the provided codefresh api token ${tokenStart}..${tokenEnd}`) |
55 | | - } |
56 | | - throw error |
57 | | - } |
58 | | -} |
59 | | - |
60 | 75 | /** |
61 | 76 | * calling main with process argv and env. Exit code 1 on error |
62 | 77 | */ |
63 | 78 | export async function mainErrorHandling() { |
64 | 79 | try { |
65 | 80 | await main(process.argv, process.env) |
66 | | - } catch { |
67 | | - // Catchall for general errors |
| 81 | + } catch (error) { |
| 82 | + logger.error(error.toString()) |
68 | 83 | process.exit(1) |
69 | 84 | } |
70 | 85 | } |
71 | | - |
72 | | - |
73 | | - |
|
0 commit comments