workflow.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import path from 'path';
  2. import fs from 'fs';
  3. import { JobInfo, WorkflowInfo, CoverageInfo, TestResultsInfo } from './types';
  4. import { getBuildNumber, getCiFolder } from './env';
  5. export const agregateWorkflowInfo = (): WorkflowInfo => {
  6. const now = Date.now();
  7. const workflow: WorkflowInfo = {
  8. jobs: [],
  9. startTime: now,
  10. endTime: now,
  11. workflowId: process.env.CIRCLE_WORKFLOW_ID,
  12. repo: process.env.CIRCLE_PROJECT_REPONAME,
  13. user: process.env.CIRCLE_PROJECT_USERNAME,
  14. buildNumber: getBuildNumber(),
  15. elapsed: 0,
  16. };
  17. const jobsFolder = path.resolve(getCiFolder(), 'jobs');
  18. if (fs.existsSync(jobsFolder)) {
  19. const files = fs.readdirSync(jobsFolder);
  20. if (files && files.length) {
  21. files.forEach(file => {
  22. const p = path.resolve(jobsFolder, file, 'job.json');
  23. if (fs.existsSync(p)) {
  24. const job = require(p) as JobInfo;
  25. workflow.jobs.push(job);
  26. if (job.startTime < workflow.startTime) {
  27. workflow.startTime = job.startTime;
  28. }
  29. if (job.endTime > workflow.endTime) {
  30. workflow.endTime = job.endTime;
  31. }
  32. } else {
  33. console.log('Missing Job info: ', p);
  34. }
  35. });
  36. } else {
  37. console.log('NO JOBS IN: ', jobsFolder);
  38. }
  39. }
  40. workflow.elapsed = workflow.endTime - workflow.startTime;
  41. return workflow;
  42. };
  43. export const agregateCoverageInfo = (): CoverageInfo[] => {
  44. const coverage: CoverageInfo[] = [];
  45. const ciDir = getCiFolder();
  46. const jobsFolder = path.resolve(ciDir, 'jobs');
  47. if (fs.existsSync(jobsFolder)) {
  48. const files = fs.readdirSync(jobsFolder);
  49. if (files && files.length) {
  50. files.forEach(file => {
  51. const dir = path.resolve(jobsFolder, file, 'coverage');
  52. if (fs.existsSync(dir)) {
  53. const s = path.resolve(dir, 'coverage-summary.json');
  54. const r = path.resolve(dir, 'lcov-report', 'index.html');
  55. if (fs.existsSync(s)) {
  56. const raw = require(s);
  57. const info: CoverageInfo = {
  58. job: file,
  59. summary: raw.total,
  60. };
  61. if (fs.existsSync(r)) {
  62. info.report = r.substring(ciDir.length);
  63. }
  64. coverage.push(info);
  65. }
  66. }
  67. });
  68. } else {
  69. console.log('NO JOBS IN: ', jobsFolder);
  70. }
  71. }
  72. return coverage;
  73. };
  74. export const agregateTestInfo = (): TestResultsInfo[] => {
  75. const tests: TestResultsInfo[] = [];
  76. const ciDir = getCiFolder();
  77. const jobsFolder = path.resolve(ciDir, 'jobs');
  78. if (fs.existsSync(jobsFolder)) {
  79. const files = fs.readdirSync(jobsFolder);
  80. if (files && files.length) {
  81. files.forEach(file => {
  82. if (file.startsWith('test')) {
  83. const summary = path.resolve(jobsFolder, file, 'results.json');
  84. if (fs.existsSync(summary)) {
  85. tests.push(require(summary) as TestResultsInfo);
  86. }
  87. }
  88. });
  89. } else {
  90. console.log('NO Jobs IN: ', jobsFolder);
  91. }
  92. }
  93. return tests;
  94. };