114 lines
3.8 KiB
JavaScript
114 lines
3.8 KiB
JavaScript
|
/* Inspired from the Lix setup.
|
||
|
* Original-Author: puckipedia
|
||
|
*/
|
||
|
Gerrit.install((plugin) => {
|
||
|
// TODO: can we just use `plugin.serverInfo().plugin` and control the settings over there.
|
||
|
const configuration = {
|
||
|
baseUri: @BASE_URI@,
|
||
|
supportedProjects: @SUPPORTED_PROJECTS@,
|
||
|
};
|
||
|
|
||
|
function makeBuildbotUri(suffix) {
|
||
|
return `${configuration.baseUri}/${suffix}`;
|
||
|
}
|
||
|
|
||
|
let builders = [];
|
||
|
let fetchBuilders = async () => {
|
||
|
if (builders.length > 0) return;
|
||
|
let data = await (await fetch(makeBuildbotUri(`api/v2/builders`), { credentials: 'include' })).json();
|
||
|
builders = data.builders;
|
||
|
};
|
||
|
|
||
|
|
||
|
let checksProvider;
|
||
|
checksProvider = {
|
||
|
async fetch({ repo, patchsetSha, changeNumber, patchsetNumber }, runBefore = false) {
|
||
|
if (!configuration.supportedProjects.includes(repo)) {
|
||
|
return { responseCode: 'OK' };
|
||
|
}
|
||
|
|
||
|
let num = changeNumber.toString(10);
|
||
|
|
||
|
let branch = `refs/changes/${num.substr(-2)}/${num}/${patchsetNumber}`;
|
||
|
|
||
|
let changeFetch = await fetch(makeBuildbotUri(`api/v2/changes?limit=1&order=-changeid&revision=${patchsetSha}&branch=${branch}`), { credentials: 'include' });
|
||
|
if (changeFetch.status == 400) {
|
||
|
if ((await changeFetch.json()).error === 'invalid origin' && !runBefore) {
|
||
|
return await checksProvider.fetch({ repo, patchsetSha, changeNumber, patchsetNumber }, true);
|
||
|
}
|
||
|
|
||
|
return { responseCode: 'OK' };
|
||
|
} else if (changeFetch.status === 403) {
|
||
|
return { responseCode: 'NOT_LOGGED_IN', loginCallback() {
|
||
|
window.open(configuration.baseUri);
|
||
|
} };
|
||
|
}
|
||
|
|
||
|
let changes = await changeFetch.json();
|
||
|
if (changes.meta.total === 0) {
|
||
|
return { responseCode: 'OK' };
|
||
|
}
|
||
|
|
||
|
let { changeid } = changes.changes[0];
|
||
|
let { builds } = await (await fetch(makeBuildbotUri(`api/v2/changes/${changeid}/builds?property=owners&property=workername`), { credentials: 'include' })).json();
|
||
|
await fetchBuilders();
|
||
|
let links = [];
|
||
|
let runs = [];
|
||
|
for (let build of builds) {
|
||
|
let name = `unknown builder ${build.builderid}`;
|
||
|
for (let builder of builders) {
|
||
|
if (builder.builderid === build.builderid) {
|
||
|
name = builder.name;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (name === `${repo}/nix-eval`) {
|
||
|
links.push({
|
||
|
url: makeBuildbotUri(`#/builders/${build.builderid}/builds/${build.number}`),
|
||
|
primary: true,
|
||
|
icon: 'external',
|
||
|
});
|
||
|
}
|
||
|
|
||
|
let checkrun = {
|
||
|
attempt: build.buildrequestid,
|
||
|
// FIXME: generalize this accordingly once auto-discovery is available.
|
||
|
checkName: name.replace(/^hydraJobs\./, ''),
|
||
|
externalId: build.buildrequestid.toString(),
|
||
|
status: build.complete ? 'COMPLETED' : (typeof build.started_at !== 'number' ? 'SCHEDULED' : 'RUNNING'),
|
||
|
checkLink: makeBuildbotUri(`#/builders/${build.builderid}/builds/${build.number}`),
|
||
|
labelName: 'Verified',
|
||
|
results: [],
|
||
|
links: [{
|
||
|
url: makeBuildbotUri(`#/builders/${build.builderid}/builds/${build.number}`),
|
||
|
primary: true,
|
||
|
icon: 'external',
|
||
|
}],
|
||
|
};
|
||
|
|
||
|
if (build.started_at !== null) {
|
||
|
checkrun.startedTimestamp = new Date(build.started_at * 1000);
|
||
|
}
|
||
|
|
||
|
if (build.complete_at !== null) {
|
||
|
checkrun.finishedTimestamp = new Date(build.complete_at * 1000);
|
||
|
}
|
||
|
|
||
|
if (build.results !== null) {
|
||
|
checkrun.results = [{
|
||
|
category: build.results < 2 ? 'SUCCESS' : 'ERROR',
|
||
|
summary: build.state_string,
|
||
|
}];
|
||
|
}
|
||
|
|
||
|
runs.push(checkrun);
|
||
|
}
|
||
|
|
||
|
return { responseCode: 'OK', runs, links };
|
||
|
}
|
||
|
};
|
||
|
|
||
|
plugin.checks().register(checksProvider);
|
||
|
});
|