-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget-circleci-insights.ts
77 lines (71 loc) · 3.24 KB
/
get-circleci-insights.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { transformToCSV } from "./transform-to-csv.ts"
import { Client, ReportingWindow, WorkflowJob, JobDetails } from "./circleci.ts"
const TOKEN = Deno.env.get("CIRCLECI_TOKEN")!
const ORGS = Deno.env.get("GITHUB_ORG")!.split(",")
const DEBUG = Deno.env.get("DEBUG") === "true"
const client = new Client(TOKEN, DEBUG)
async function getCircleCIInsights() {
const worfklowData = []
const jobData = []
for (const org of ORGS) {
console.log(`# ${org}`)
const orgSummaryData = await client.getOrgSummaryData(org, ReportingWindow.LAST_90_DAYS)
const projects = orgSummaryData['all_projects']
for (const project of projects) {
console.log(`## ${project}`)
const projectBySlug = await client.getProjectBySlug(org, project)
for (const reportingWindow of [ReportingWindow.LAST_30_DAYS, ReportingWindow.LAST_60_DAYS, ReportingWindow.LAST_90_DAYS]) {
console.log(`### ${reportingWindow}`)
for (const allBranches of [true, false]) {
console.log(`#### ${allBranches ? "All Branches" : "Default Branch"}`)
const projectWorkflowMetrics = await client.getProjectWorkflowMetrics(org, project, allBranches, reportingWindow)
for (const {name: workflow, metrics} of projectWorkflowMetrics) {
console.log(`##### ${workflow}`)
// Workflow data
if (metrics !== undefined) {
worfklowData.push({
org,
project,
workflow,
metrics,
resourceUsage: `https://bff.circleci.com/private/insights/resource-usage/${projectBySlug.organization_id}/${projectBySlug.id}/workflows/${workflow}/jobs/?allBranches=${allBranches}&reporting-window=${reportingWindow}`,
allBranches,
reportingWindow
})
}
// Job data
const projectWorkflowRuns = await client.getProjectWorkflowRuns(org, project, workflow, allBranches, reportingWindow)
const projectWorkflowJobMetrics = await client.getProjectWorkflowJobMetrics(org, project, workflow, allBranches, reportingWindow)
const workflowJobs: WorkflowJob[] = []
const run = projectWorkflowRuns.find(run => run.status === 'success')
if (run != undefined) {
workflowJobs.push(...(await client.listWorkflowJobs(run.id)))
}
for (const {name: job, metrics} of projectWorkflowJobMetrics) {
console.log(`###### ${job}`)
const jobDetails: JobDetails[] = await Promise.all(workflowJobs.filter(workflowJob => workflowJob.name === job).map(workflowJob => workflowJob.job_number).map(jobNumber => client.getJobDetails(org, project, `${jobNumber}`)))
const executor = jobDetails.pop()?.executor
jobData.push({
org,
project,
workflow,
job,
executor,
metrics,
allBranches,
reportingWindow
})
}
}
}
}
}
}
console.log(`# Workflow Data`)
console.log(transformToCSV(worfklowData))
console.log(`# Job Data`)
console.log(transformToCSV(jobData))
}
if (import.meta.main) {
await getCircleCIInsights()
}