diff --git a/backend/test-runner.js b/backend/test-runner.js index 4d7b4da..bd6f589 100644 --- a/backend/test-runner.js +++ b/backend/test-runner.js @@ -637,6 +637,13 @@ async function writeLog(lang, type, result, log) { ); } +async function getImageHash(tag) { + const output = (await run(["docker", "inspect", `riju:${tag}`], console.error, { + suppressOutput: true, + })).output; + return JSON.parse(output)[0].Config.Labels["riju.image-hash"]; +} + async function main() { if (process.env.HOSTNAME !== "runtime") { throw new Error("tests should be run in runtime container"); @@ -656,13 +663,11 @@ async function main() { const langHashes = Object.fromEntries( await Promise.all( _.uniq(tests.map(({ lang }) => lang)).map(async (lang) => { - const output = (await run(["docker", "inspect", `riju:lang-${lang}`], console.error, { - suppressOutput: true, - })).output; - return [lang, JSON.parse(output)[0].Config.Labels["riju.image-hash"]]; + return [lang, await getImageHash(`lang-${lang}`)]; }) ) ); + const runtimeHash = await getImageHash("runtime"); console.error(`Running ${tests.length} test${tests.length !== 1 ? "s" : ""}`); const lintSeen = new Set(); let lintPassed = new Set(); @@ -772,7 +777,7 @@ async function main() { await fs.mkdir(`build/test-hashes/lang`, { recursive: true }); await fs.writeFile( `build/test-hashes/lang/${lang}`, - await getTestHash(lang, langHashes[lang]), + await getTestHash(lang, runtimeHash, langHashes[lang]), ); } process.exit(failed.size > 0 ? 1 : 0); diff --git a/lib/hash-test.js b/lib/hash-test.js index 27cbca1..02b196b 100644 --- a/lib/hash-test.js +++ b/lib/hash-test.js @@ -66,9 +66,6 @@ async function getTestRunnerHash() { .digest("hex") ); } - hashes.push((await util.promisify(child_process.exec)( - `docker inspect riju:runtime -f '{{ index .Config.Labels "riju.image-hash" }}'`, - )).stdout.trim()); return crypto.createHash("sha1").update(hashes.join(",")).digest("hex"); } @@ -81,11 +78,11 @@ async function getTestConfigHash(lang) { return crypto.createHash("sha1").update(JSON.stringify(config)).digest("hex"); } -export async function getTestHash(lang, imageHash) { +export async function getTestHash(lang, runtimeImageHash, langImageHash) { return crypto .createHash("sha1") .update( - `${await testRunnerHash},${await getTestConfigHash(lang)},${imageHash}` + `${await testRunnerHash},${await getTestConfigHash(lang)},${runtimeImageHash},${langImageHash}` ) .digest("hex"); } diff --git a/system/src/riju-system-privileged.c b/system/src/riju-system-privileged.c index 1263edc..dbbaf81 100644 --- a/system/src/riju-system-privileged.c +++ b/system/src/riju-system-privileged.c @@ -111,7 +111,7 @@ void session(char *uuid, char *lang, char *imageHash) "--memory", "100m", "--memory-swap", "900m", image, "bash", "-c", - "cat /var/run/riju/sentinel/fifo | while read -t2; do :; done", + "cat /var/run/riju/sentinel/fifo | ( while read -t2; do :; done; pkill -g0 )", NULL, }; execvp(argv[0], argv); diff --git a/tools/depgraph.js b/tools/depgraph.js index 3fdee15..6fe740b 100644 --- a/tools/depgraph.js +++ b/tools/depgraph.js @@ -228,7 +228,11 @@ async function getLanguageTestArtifact({ lang }) { return s3TestHashes[lang] || null; }, getDesiredHash: async (dependencyHashes) => { - return await getTestHash(lang, dependencyHashes[`image:lang-${lang}`]); + return await getTestHash( + lang, + dependencyHashes[`image:runtime`], + dependencyHashes[`image:lang-${lang}`], + ); }, buildLocally: async () => { await runCommand(`make shell I=runtime CMD="make test L=${lang}"`); @@ -531,6 +535,9 @@ async function executeDepGraph({ const seen = new Set(); for (const target of priorityTargets) { for (const dep of artifacts[target].dependencies) { + if (seen.has(dep)) { + continue; + } if (artifacts[target].publishTarget) { if (statuses[dep] === "publishToRegistry") { plan.push({ @@ -546,9 +553,6 @@ async function executeDepGraph({ }); } } - if (seen.has(dep)) { - continue; - } seen.add(dep); } if (statuses[target]) {