diff --git a/Makefile b/Makefile index 4e4627b..0d4d35d 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ endif # Get rid of 'Entering directory' / 'Leaving directory' messages. MAKE_QUIETLY := MAKELEVEL= make -.PHONY: all $(MAKECMDGOALS) +.PHONY: all $(MAKECMDGOALS) frontend system supervisor all: help diff --git a/langs/abc.yaml b/langs/abc.yaml index 3e97bad..bf8cdb5 100644 --- a/langs/abc.yaml +++ b/langs/abc.yaml @@ -20,6 +20,7 @@ install: repl: | abc input: | + DELAY: 1 WRITE 123 * 234 main: "main.abc" diff --git a/lib/yaml.js b/lib/yaml.js index 1b9a1b7..b68f02b 100644 --- a/lib/yaml.js +++ b/lib/yaml.js @@ -2,6 +2,7 @@ import { promises as fs } from "fs"; import path from "path"; import { validate as validateJSONSchema } from "jsonschema"; +import _ from "lodash"; import YAML from "yaml"; // The build scripts in the language configs assume a specific build @@ -120,7 +121,7 @@ export async function readSharedDepConfig(lang) { // Given a language config JSON, return a list of the Riju shared // dependency names, or an empty list if none are configured for this -// language. +// language. The return value is sorted. export async function getSharedDepsForLangConfig(langConfig) { - return (langConfig.install && langConfig.install.riju) || []; + return [...(langConfig.install && langConfig.install.riju) || []].sort(); } diff --git a/packer/provision.bash b/packer/provision.bash index 046b79e..192dded 100644 --- a/packer/provision.bash +++ b/packer/provision.bash @@ -3,6 +3,7 @@ set -euo pipefail : ${ADMIN_PASSWORD} +: ${AWS_REGION} : ${S3_BUCKET} : ${SUPERVISOR_ACCESS_TOKEN} @@ -23,9 +24,9 @@ ubuntu_name="$(lsb_release -cs)" sudo tee -a /etc/apt/sources.list.d/custom.list >/dev/null < fs.readFile(`build/shared/${name}/install.bash`), + )); + const allInstallContents = [].concat.apply([installContents], sharedInstallContents); const hash = await hashDockerfile( "lang", { @@ -41,13 +46,15 @@ async function main() { langHash: await getDebHash(`build/lang/${lang}/riju-lang-${lang}.deb`), sharedHashes: ( await Promise.all( - (await getSharedDepsForLangConfig(await readLangConfig(lang))).map( + sharedDeps.map( async (name) => await getDebHash(`build/shared/${name}/riju-shared-${name}.deb`) ) ) ).sort(), - installHash: crypto.createHash("sha1").update(installContents).digest("hex"), + installHash: allInstallContents.map( + (c) => crypto.createHash("sha1").update(c).digest("hex"), + ).join(""), }, } ); diff --git a/tools/depgraph.js b/tools/depgraph.js index 807ee5b..0760c29 100644 --- a/tools/depgraph.js +++ b/tools/depgraph.js @@ -124,12 +124,18 @@ async function getImageArtifact({ tag, isBaseImage, isLangImage }) { `build/lang/${isLangImage.lang}/install.bash`, "utf-8" ); + const sharedInstallContents = await Promise.all(isLangImage.sharedDeps.map( + async (name) => fs.readFile(`build/shared/${name}/install.bash`), + )); + const allInstallContents = [].concat.apply([installContents], sharedInstallContents); salt = { langHash: dependencyHashes[`deb:lang-${isLangImage.lang}`], sharedHashes: isLangImage.sharedDeps.map( (name) => dependencyHashes[`deb:shared-${name}`] ), - installHash: crypto.createHash("sha1").update(installContents).digest("hex"), + installHash: allInstallContents.map( + (c) => crypto.createHash("sha1").update(c).digest("hex"), + ).join(""), }; } return await hashDockerfile(name, dependentDockerHashes, { salt }); diff --git a/tools/packer-build.bash b/tools/packer-build.bash index ba77614..f52e12b 100755 --- a/tools/packer-build.bash +++ b/tools/packer-build.bash @@ -4,7 +4,7 @@ set -euo pipefail export AWS_REGION="${AWS_REGION:-$(aws configure get region)}" -if [[ -n "${AWS_REGION}" ]]; then +if [[ -z "${AWS_REGION}" ]]; then echo >&2 "no default AWS region specified, and AWS_REGION unset" exit 1 fi