in src/GitHubStatusDisplay.js [184:255]
async addJenkinsResults(builds) {
// Adds Jenkins results to builds array
// Step 1. Fetch info via GraphQL
//
// STOP. You want more results? You may have noticed that on
// Google, people suggest using allBuilds with {0,n} to make use
// of Jenkins pagination. However, if you do this, it will *DOS our Jeenkins
// instance*; even when pagination is requested, Jenkins will
// still load ALL builds into memory before servicing your
// request. I've filed this at https://issues.jenkins-ci.org/browse/JENKINS-49908
let jenkins_data = await jenkins.job(`pytorch-${this.props.branch}`, {
tree: `builds[
url,
number,
duration,
timestamp,
result,
actions[parameters[name,value],
causes[shortDescription]],
changeSet[items[commitId,comment,msg]],
subBuilds[
result,jobName,url,duration,
build[
subBuilds[
result,jobName,url,duration,
build[
subBuilds[result,jobName,url,duration]
]
]
]
]
]`.replace(/\s+/g, ""),
});
// Step 2: Build commit to build idx map
const commitIdxMap = new Map();
builds.forEach((build, idx) => {
commitIdxMap[build.id] = idx;
});
// Step 3: Add jenkins jobs
if (jenkins_data) {
jenkins_data.builds.forEach((topBuild) => {
if (topBuild.changeSet.items.length !== 1) {
return;
}
const buildCommitId = topBuild.changeSet.items[0].commitId;
if (!(buildCommitId in commitIdxMap)) {
return;
}
const buildIdx = commitIdxMap[buildCommitId];
function go(subBuild) {
if (
subBuild.build &&
subBuild.build._class ===
"com.tikal.jenkins.plugins.multijob.MultiJobBuild"
) {
subBuild.build.subBuilds.forEach(go);
} else {
builds[buildIdx].sb_map.set(
getJenkinsJobName(subBuild),
Object.fromEntries([
["status", subBuild.result],
["build_url", jenkins.link(subBuild.url + "/console")],
])
);
}
}
topBuild.subBuilds.forEach(go);
});
}
}