Compare commits

..

19 commits

Author SHA1 Message Date
Thomas Hobson
e6a1fd06a9
pkg(deno): Added deno version 1.7.5
Closes issue #119
2021-02-28 01:42:23 +13:00
Thomas Hobson
a27638b06b
pkg(common): helpers extract into directories 2021-02-28 01:39:19 +13:00
Thomas Hobson
bd920b19b9
api: add /runtimes endpoint 2021-02-28 01:25:10 +13:00
Thomas Hobson
870a4c1282
api: fix compile stage
runtime.compiled always returned false as it was undefined.
This made the code think it's a run-only language, and never called the compile script.
2021-02-28 01:18:04 +13:00
Thomas Hobson
7d3777aef8
cli: fix ppman install output 2021-02-28 01:16:33 +13:00
Thomas Hobson
55f481e465
repo: build all 2021-02-28 01:16:11 +13:00
Thomas Hobson
12dc93435d
api,repo: Switch to debian base image 2021-02-28 01:15:52 +13:00
Thomas Hobson
b91ff42bb8
api: fix validators 2021-02-27 23:10:54 +13:00
Thomas Hobson
3ab6aefe05
pkg(common): build pkg-info.json 2021-02-27 22:43:02 +13:00
Thomas Hobson
09913d9e40
pkg(csharp-mono): Added version 6.12.0.122 2021-02-27 22:22:03 +13:00
Thomas Hobson
687085a99d
pkg(python): use proper prefix 2021-02-27 22:07:44 +13:00
Thomas Hobson
0159891ed9
pkg(common): Add prefix variable
Prefix is used for autoconf based projects so that absolute paths can be used.
2021-02-27 21:53:42 +13:00
Thomas Hobson
99dee4c904
pkg(python): remove forced -j64 in favor of MAKEFLAGS 2021-02-27 20:47:33 +13:00
Thomas Hobson
cf67bd94e9
pkg(common): disallow running top level build in parallel 2021-02-27 20:46:29 +13:00
Thomas Hobson
d75d38f226
pkg(Makefile): Always call with VERSION set 2021-02-27 20:26:58 +13:00
Thomas Hobson
da51de09b3
pkg(Makefile): allow hyphen in language names 2021-02-27 19:51:13 +13:00
Thomas Hobson
bc0b9741cf
pkg(common): add tar.xz helper 2021-02-27 19:50:23 +13:00
Thomas Hobson
fb8ce57b60
pkg(common): remove tgz helper 2021-02-27 19:43:58 +13:00
Thomas Hobson
f786a7def0
pkg(python): use proper extension for tar.gz archives 2021-02-27 19:43:25 +13:00
15 changed files with 119 additions and 40 deletions

View file

@ -1,7 +1,9 @@
FROM node:15.8.0-alpine3.13 FROM node:15.8.0-buster-slim
RUN apk add --no-cache gnupg tar bash coreutils shadow util-linux RUN dpkg-reconfigure -p critical dash
RUN userdel -r node RUN apt-get update && apt-get install -y gnupg tar coreutils util-linux \
RUN for i in $(seq 1000 1500); do \ && rm -rf /var/lib/apt/lists/*
RUN for i in $(seq 1001 1500); do \
groupadd -g $i runner$i && \ groupadd -g $i runner$i && \
useradd -M runner$i -g $i -u $i ; \ useradd -M runner$i -g $i -u $i ; \
done done

View file

@ -131,9 +131,11 @@ class Job {
if(this.state != job_states.PRIMED) throw new Error('Job must be in primed state, current state: ' + this.state.toString()); if(this.state != job_states.PRIMED) throw new Error('Job must be in primed state, current state: ' + this.state.toString());
logger.info(`Executing job uuid=${this.uuid} uid=${this.uid} gid=${this.gid} runtime=${this.runtime.toString()}`); logger.info(`Executing job uuid=${this.uuid} uid=${this.uid} gid=${this.gid} runtime=${this.runtime.toString()}`);
logger.debug('Compiling'); logger.debug('Compiling');
const compile = this.runtime.compiled && await this.safe_call( var compile = undefined;
if(this.runtime.compiled)
compile = await this.safe_call(
path.join(this.runtime.pkgdir, 'compile'), path.join(this.runtime.pkgdir, 'compile'),
[this.main, ...this.files], this.files.map(x=>x.name),
this.timeouts.compile); this.timeouts.compile);
logger.debug('Running'); logger.debug('Running');

View file

@ -10,7 +10,8 @@ module.exports = {
body('language') body('language')
.isString(), // eslint-disable-line snakecasejs/snakecasejs .isString(), // eslint-disable-line snakecasejs/snakecasejs
body('version') body('version')
.isSemVer(), // eslint-disable-line snakecasejs/snakecasejs .isString(), // eslint-disable-line snakecasejs/snakecasejs
// isSemVer requires it to be a version, not a selector
body('files') body('files')
.isArray(), // eslint-disable-line snakecasejs/snakecasejs .isArray(), // eslint-disable-line snakecasejs/snakecasejs
body('files.*.name') body('files.*.name')
@ -20,7 +21,9 @@ module.exports = {
.contains('/'), .contains('/'),
body('files.*.content') body('files.*.content')
.isString(), // eslint-disable-line snakecasejs/snakecasejs .isString(), // eslint-disable-line snakecasejs/snakecasejs
body('*_timeout') body('compile_timeout')
.isNumeric(), // eslint-disable-line snakecasejs/snakecasejs
body('run_timeout')
.isNumeric(), // eslint-disable-line snakecasejs/snakecasejs .isNumeric(), // eslint-disable-line snakecasejs/snakecasejs
body('stdin') body('stdin')
.isString(), // eslint-disable-line snakecasejs/snakecasejs .isString(), // eslint-disable-line snakecasejs/snakecasejs

View file

@ -93,11 +93,17 @@ const app = express();
app.get ('/repos/:repo_slug/packages', ppman_routes.repo_packages_validators, validate, ppman_routes.repo_packages); app.get ('/repos/:repo_slug/packages', ppman_routes.repo_packages_validators, validate, ppman_routes.repo_packages);
app.get ('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_info); app.get ('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_info);
app.post ('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_install); app.post ('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_install);
app.delete('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_uninstall); //TODO app.delete('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_uninstall);
const executor_routes = require('./executor/routes'); const executor_routes = require('./executor/routes');
app.post ('/jobs', executor_routes.run_job_validators, validate, executor_routes.run_job); app.post ('/jobs', executor_routes.run_job_validators, validate, executor_routes.run_job);
app.get ('/runtimes', (_, res) => res.json_success({runtimes: runtime.map(rt=>({
language: rt.language,
version: rt.version.raw,
author: rt.author
}))}))
logger.debug('Calling app.listen'); logger.debug('Calling app.listen');
const [address,port] = config.bind_address.split(':'); const [address,port] = config.bind_address.split(':');

View file

@ -52,7 +52,7 @@ module.exports = {
body('url') body('url')
.notEmpty() // eslint-disable-line snakecasejs/snakecasejs .notEmpty() // eslint-disable-line snakecasejs/snakecasejs
.bail() .bail()
.isURL({require_protocol: true}) // eslint-disable-line snakecasejs/snakecasejs .isURL({require_host: false, require_protocol: true, protocols: ['http','https','file']}) // eslint-disable-line snakecasejs/snakecasejs
], ],
async repo_add(req, res){ async repo_add(req, res){

View file

@ -48,7 +48,7 @@ class Runtime {
return res; return res;
} }
get compile(){ get compiled(){
if(this.#compiled === undefined) this.#compiled = fss.exists_sync(path.join(this.pkgdir, 'compile')); if(this.#compiled === undefined) this.#compiled = fss.exists_sync(path.join(this.pkgdir, 'compile'));
return this.#compiled; return this.#compiled;
} }

View file

@ -7,8 +7,8 @@ exports.describe = 'Installs the named package'
const msg_format = { const msg_format = {
'color': p => `${p.success ? chalk.green.bold('✓') : chalk.red.bold('❌')} Installation ${p.success ? "succeeded" : "failed: " + p.message}`, 'color': p => `${p.language ? chalk.green.bold('✓') : chalk.red.bold('❌')} Installation ${p.language ? "succeeded" : "failed: " + p.message}`,
'monochrome': p => `Installation ${p.success ? "succeeded" : "failed: " + p.message}`, 'monochrome': p => `Installation ${p.language ? "succeeded" : "failed: " + p.message}`,
'json': JSON.stringify 'json': JSON.stringify
} }

View file

@ -2,20 +2,19 @@
# Variables # Variables
PKG_FILES=$(filter-out common.mk,$(wildcard *.mk)) PKG_FILES=$(filter-out common.mk,$(wildcard *.mk))
PKG_SLUGS=$(foreach pkg, ${PKG_FILES}, $(addprefix $(shell make -f ${pkg} name)-, $(shell make -f ${pkg} versions))) PKG_SLUGS=$(foreach pkg, ${PKG_FILES}, $(addprefix $(shell make -f ${pkg} name VERSION=UNKNOWN)-, $(shell make -f ${pkg} versions VERSION=UNKNOWN)))
# Functions # Functions
define pkg_info define pkg_info
$(eval PKG_SLUG=$(patsubst $1-%,%,$2)) $(eval PKG_SLUG=$(patsubst $1-%,%,$2))
$(eval PKG_PARTS=$(subst -, ,${PKG_SLUG})) $(eval PKG_VERSION=$(lastword $(subst -, ,${PKG_SLUG})))
$(eval PKG_NAME=$(word 1,${PKG_PARTS})) $(eval PKG_NAME=$(patsubst %-${PKG_VERSION},%,${PKG_SLUG}))
$(eval PKG_VERSION=$(word 2,${PKG_PARTS}))
$(eval PKG_FILE=$(shell grep '^VERSIONS\s*=.*${PKG_VERSION}' $(shell grep "NAME\s*=\s*${PKG_NAME}" ${PKG_FILES} -l) -l)) $(eval PKG_FILE=$(shell grep '^VERSIONS\s*=.*${PKG_VERSION}' $(shell grep "NAME\s*=\s*${PKG_NAME}" ${PKG_FILES} -l) -l))
endef endef
# Targets # Targets
build: $(foreach pkg, ${PKG_FILES}, $(addprefix build-$(shell make -f ${pkg} name)-, $(lastword $(shell make -f ${pkg} versions)))) build: $(foreach pkg, ${PKG_FILES}, $(addprefix build-$(shell make -f ${pkg} name VERSION=UNKNOWN)-, $(lastword $(shell make -f ${pkg} versions VERSION=UNKNOWN))))
$(addprefix build-, ${PKG_SLUGS}): $(addprefix build-, ${PKG_SLUGS}):
$(call pkg_info,build,$@) $(call pkg_info,build,$@)
@ -23,7 +22,7 @@ $(addprefix build-, ${PKG_SLUGS}):
clean: $(foreach pkg, ${PKG_FILES}, $(addprefix clean-$(shell make -f ${pkg} name)-, $(shell make -f ${pkg} versions))) clean: $(foreach pkg, ${PKG_FILES}, $(addprefix clean-$(shell make -f ${pkg} name VERSION=UNKNOWN)-, $(shell make -f ${pkg} versions VERSION=UNKNOWN)))
rm -rf build/ rm -rf build/
$(addprefix clean-, ${PKG_SLUGS}): $(addprefix clean-, ${PKG_SLUGS}):
$(call pkg_info,clean,$@) $(call pkg_info,clean,$@)

View file

@ -6,7 +6,8 @@ BIN_DIR=${BUILD_DIR}${PKG_SLUG}/
RUN_FILE=${BUILD_DIR}run RUN_FILE=${BUILD_DIR}run
COMPILE_FILE=${BUILD_DIR}compile COMPILE_FILE=${BUILD_DIR}compile
ENV_FILE=${BIN_DIR}environment ENV_FILE=${BIN_DIR}environment
INFO_FILE=${BUILD_DIR}pkg-info.jq INFO_FILE=${BUILD_DIR}pkg-info.json
PREFIX=/piston/packages/${NAME}/${VERSION}/${PKG_SLUG}
PKG_FILE=${PKG_SLUG}.pkg.tar.gz PKG_FILE=${PKG_SLUG}.pkg.tar.gz
@ -31,7 +32,10 @@ versions:
name: name:
@echo ${NAME} @echo ${NAME}
.NOTPARALLEL: build
build: ${BUILD_DIR} ${PKG_FILE} build: ${BUILD_DIR} ${PKG_FILE}
clean: clean:
rm -rf ${BUILD_DIR} rm -rf ${BUILD_DIR}
rm -f ${PKG_FILE} rm -f ${PKG_FILE}
@ -49,7 +53,7 @@ endif
${PKG_FILE}: ${PKG_TARGETS} ${PKG_FILE}: ${PKG_TARGETS}
tar -czC ${BUILD_DIR} -f $@ ${patsubst ${BUILD_DIR}%,%,$?} tar -czC ${BUILD_DIR} -f $@ ${patsubst ${BUILD_DIR}%,%,$?}
${INFO_FILE}: $(patsubst %.json,%.jq,${INFO_FILE}):
echo '.language="${NAME}"' > $@ echo '.language="${NAME}"' > $@
echo '.version="${VERSION}"' >> $@ echo '.version="${VERSION}"' >> $@
echo '.author="${AUTHOR}"' >> $@ echo '.author="${AUTHOR}"' >> $@
@ -60,11 +64,14 @@ ${INFO_FILE}:
# Helpers # Helpers
%/: %.tgz
cd ${BUILD_DIR} && tar xzf $(patsubst ${BUILD_DIR}%,%,$<)
%/: %.tar.gz %/: %.tar.gz
cd ${BUILD_DIR} && tar xzf $(patsubst ${BUILD_DIR}%,%,$<) mkdir -p $@
tar xzf $< --strip-components=1 -C $@
%/: %.tar.xz
mkdir -p $@
tar xf $< --strip-components=1 -C $@
%/: %.zip
mkdir -p $@
unzip $< -d $@
%.json: %.jq %.json: %.jq
jq '$(shell tr '\n' '|' < $<).' <<< "{}" > $@ jq '$(shell tr '\n' '|' < $<).' <<< "{}" > $@

34
packages/csharp-mono.mk Normal file
View file

@ -0,0 +1,34 @@
NAME=csharp-mono
AUTHOR=Thomas Hobson <thomas@hexf.me>
DEPENDENCIES=
COMPILED=true
VERSIONS=6.12.0
include common.mk
VERSION_6.12.0_FULL=6.12.0.122
VERSION_FULL=${VERSION_${VERSION}_FULL}
${RUN_FILE}:
echo 'CODE=$${1/cs/exe}' > $@
echo 'shift' >> $@
echo 'mono $$CODE $$*' >> $@
${COMPILE_FILE}:
echo 'csc $$*' > $@
${ENV_FILE}:
echo 'export PATH=$$PWD/bin:$$PATH' > $@
${BIN_DIR}: ${BUILD_DIR}mono-${VERSION_FULL}/
$(eval TMP_DIR=${PWD}/${BUILD_DIR}tmpout/)
cd $< && ./configure --prefix ${PREFIX}
$(MAKE) -j64 -C $<
DESTDIR=${TMP_DIR} $(MAKE) -C $< install
mv ${TMP_DIR}${PREFIX} ${BIN_DIR} && rm -r ${TMP_DIR}
${BUILD_DIR}mono-${VERSION_FULL}.tar.xz:
curl "https://download.mono-project.com/sources/mono/mono-${VERSION_FULL}.tar.xz" -o $@

22
packages/deno.mk Normal file
View file

@ -0,0 +1,22 @@
NAME=deno
AUTHOR=Thomas Hobson <thomas@hexf.me>
DEPENDENCIES=
COMPILED=false
VERSIONS=1.7.5
include common.mk
${RUN_FILE}:
echo 'deno run $$*' > $@
${ENV_FILE}:
echo 'export PATH=$$PWD:$$PATH' > $@
${BIN_DIR}: ${BUILD_DIR}deno-x86_64-unknown-linux-gnu/
mkdir -p $@
mv $</deno $@
chmod +x $@/deno
${BUILD_DIR}deno-x86_64-unknown-linux-gnu.zip:
curl -L "https://github.com/denoland/deno/releases/download/v${VERSION}/deno-x86_64-unknown-linux-gnu.zip" -o $@

View file

@ -14,9 +14,12 @@ ${ENV_FILE}:
echo 'export PATH=$$PWD/bin:$$PATH' > $@ echo 'export PATH=$$PWD/bin:$$PATH' > $@
${BIN_DIR}: ${BUILD_DIR}Python-${VERSION}/ ${BIN_DIR}: ${BUILD_DIR}Python-${VERSION}/
cd $< && ./configure --prefix / $(eval TMP_DIR=${PWD}/${BUILD_DIR}tmpout/)
$(MAKE) -j64 -C $< cd $< && ./configure --prefix ${PREFIX}
DESTDIR=../${PKG_SLUG} $(MAKE) -j64 -C $< altinstall || true $(MAKE) -C $<
DESTDIR=${TMP_DIR} $(MAKE) -C $< altinstall
mv ${TMP_DIR}${PREFIX} ${BIN_DIR} && rm -rf ${TMP_DIR}
${BUILD_DIR}Python-${VERSION}.tgz:
${BUILD_DIR}Python-${VERSION}.tar.gz:
curl "https://www.python.org/ftp/python/${VERSION}/Python-${VERSION}.tgz" -o $@ curl "https://www.python.org/ftp/python/${VERSION}/Python-${VERSION}.tgz" -o $@

View file

@ -1,7 +1,8 @@
FROM alpine:3.13 FROM debian:buster-slim
RUN apk add --no-cache python3 py3-pip gnupg jq zlib zlib-dev cmake cmake-doc extra-cmake-modules extra-cmake-modules-doc build-base gcc abuild binutils binutils-doc gcc-doc yq bash coreutils util-linux pciutils usbutils coreutils binutils findutils grep && \ RUN apt-get update && apt-get install -y bc curl git linux-headers-amd64 perl xz-utils python3 python3-pip gnupg jq zlib1g-dev cmake cmake-doc extra-cmake-modules build-essential gcc binutils bash coreutils util-linux pciutils usbutils coreutils binutils findutils grep && \
ln -sf /bin/bash /bin/sh && \ ln -sf /bin/bash /bin/sh && \
pip3 install 'yq==2.12.0' pip3 install 'yq==2.12.0' && \
rm -rf /var/lib/apt/lists/*
CMD [ "bash", "/repo/make.sh" ] CMD [ "bash", "/repo/make.sh" ]

View file

@ -3,8 +3,8 @@
cd /repo cd /repo
# Make packages # Make packages
pushd ../packages/python pushd ../packages/
make build VERSIONS=3.9.1 make -j16
popd popd

View file

@ -3,7 +3,7 @@ echo "baseurl: file://$PWD" >> index.yaml
echo "keys: []" >> index.yaml echo "keys: []" >> index.yaml
echo "packages: []" >> index.yaml echo "packages: []" >> index.yaml
yq -yi '.keys[0] = "0x107DA02C7AE97B084746564B9F1FD9D87950DB6F"' index.yaml #yq -yi '.keys[0] = "0x107DA02C7AE97B084746564B9F1FD9D87950DB6F"' index.yaml
i=-1 i=-1
@ -15,12 +15,12 @@ do
PKGFILENAME=$(echo $PKGFILE | sed 's/\.pkg\.tar\.gz//g') PKGFILENAME=$(echo $PKGFILE | sed 's/\.pkg\.tar\.gz//g')
PKGNAME=$(echo $PKGFILENAME | grep -oP '^\K.+(?=-)') PKGNAME=$(echo $PKGFILENAME | grep -oP '^\K.+(?=-)')
PKGVERSION=$(echo $PKGFILENAME | grep -oP '^.+-\K.+') PKGVERSION=$(echo $PKGFILENAME | grep -oP '^.+-\K.+')
BUILDFILE=https://github.com/engineer-man/piston/tree/v3/packages/python/ BUILDFILE=https://github.com/engineer-man/piston/tree/v3/packages/
SIZE=$(tar tzvf $PKGFILE | sed 's/ \+/ /g' | cut -f3 -d' ' | sed '2,$s/^/+ /' | paste -sd' ' | bc) SIZE=$(tar tzvf $PKGFILE | sed 's/ \+/ /g' | cut -f3 -d' ' | sed '2,$s/^/+ /' | paste -sd' ' | bc)
tar xzf $PKGFILE pkg-info.json tar xzf $PKGFILE pkg-info.json
yq -yi ".packages[$i] = {} | .packages[$i].signature = \"$(cat ${pkg}.asc)\" | .packages[$i].buildfile = \"$BUILDFILE\" | .packages[$i].size = $SIZE | .packages[$i].download = \"$PKGFILE\" | .packages[$i].dependencies = $(jq .dependencies -r pkg-info.json) | .packages[$i].author = $(jq .author pkg-info.json) | .packages[$i].language =\"$PKGNAME\" | .packages[$i].version = \"$PKGVERSION\" | .packages[$i].checksums = {} | .packages[$i].checksums.sha256 = \"$(sha256sum $PKGFILE | awk '{print $1}')\"" index.yaml yq -yi ".packages[$i] = {} | .packages[$i].signature = \"\" | .packages[$i].buildfile = \"$BUILDFILE\" | .packages[$i].size = $SIZE | .packages[$i].download = \"$PKGFILE\" | .packages[$i].dependencies = $(jq .dependencies -r pkg-info.json) | .packages[$i].author = $(jq .author pkg-info.json) | .packages[$i].language =\"$PKGNAME\" | .packages[$i].version = \"$PKGVERSION\" | .packages[$i].checksums = {} | .packages[$i].checksums.sha256 = \"$(sha256sum $PKGFILE | awk '{print $1}')\"" index.yaml
rm pkg-info.json rm pkg-info.json
done done