From a7cb08f93d96dcc7cfe055f4d5dea1fa5c74f3b2 Mon Sep 17 00:00:00 2001 From: Jef Roosens Date: Fri, 25 Feb 2022 21:47:28 +0100 Subject: [PATCH] Containers now check whether package should be rebuilt --- src/build.v | 16 ++++++++++++---- src/docker/containers.v | 2 ++ src/server/routes.v | 12 +++++++++++- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/build.v b/src/build.v index d299d39a..167b492f 100644 --- a/src/build.v +++ b/src/build.v @@ -81,9 +81,15 @@ fn build() ? { image_id := create_build_image() ? for repo in repos { + // TODO what to do with PKGBUILDs that build multiple packages? commands := [ - "su builder -c 'git clone --single-branch --depth 1 --branch $repo.branch $repo.url /build/repo'" - 'su builder -c \'cd /build/repo && MAKEFLAGS="-j\$(nproc)" makepkg -s --noconfirm --needed && for pkg in \$(ls -1 *.pkg*); do curl -XPOST -T "\$pkg" -H "X-API-KEY: \$API_KEY" $conf.address/publish; done\'' + "git clone --single-branch --depth 1 --branch $repo.branch $repo.url repo" + 'cd repo' + "makepkg --nobuild --nodeps" + 'source PKGBUILD' + // The build container checks whether the package is already present on the server + "curl --head --fail $conf.address/\$pkgname-\$pkgver-\$pkgrel-\$(uname -m).pkg.tar.zst && exit 0" + 'MAKEFLAGS="-j\$(nproc)" makepkg -s --noconfirm --needed && for pkg in \$(ls -1 *.pkg*); do curl -XPOST -T "\$pkg" -H "X-API-KEY: \$API_KEY" $conf.address/publish; done' ] // We convert the list of commands into a base64 string, which then gets @@ -94,7 +100,9 @@ fn build() ? { image: '$image_id' env: ['BUILD_SCRIPT=$cmds_str', 'API_KEY=$conf.api_key'] entrypoint: ['/bin/sh', '-c'] - cmd: ['echo \$BUILD_SCRIPT | base64 -d | /bin/sh -e'] + cmd: ['echo \$BUILD_SCRIPT | base64 -d | /bin/bash -e'] + work_dir: '/build' + user: 'builder:builder' } id := docker.create_container(c) ? @@ -112,7 +120,7 @@ fn build() ? { time.sleep(5000000000) } - docker.remove_container(id) ? + // docker.remove_container(id) ? } // Finally, we remove the builder image diff --git a/src/docker/containers.v b/src/docker/containers.v index a6df3459..37ff5162 100644 --- a/src/docker/containers.v +++ b/src/docker/containers.v @@ -20,6 +20,8 @@ pub struct NewContainer { entrypoint []string [json: Entrypoint] cmd []string [json: Cmd] env []string [json: Env] + work_dir string [json: WorkingDir] + user string [json: User] } struct CreatedContainer { diff --git a/src/server/routes.v b/src/server/routes.v index 7a0ee387..0090666e 100644 --- a/src/server/routes.v +++ b/src/server/routes.v @@ -6,6 +6,7 @@ import repo import time import rand import util +import net.http // healthcheck just returns a string, but can be used to quickly check if the // server is still responsive. @@ -15,7 +16,7 @@ pub fn (mut app App) healthcheck() web.Result { } // get_root handles a GET request for a file on the root -['/:filename'; get] +['/:filename'; get; head] fn (mut app App) get_root(filename string) web.Result { mut full_path := '' @@ -27,6 +28,15 @@ fn (mut app App) get_root(filename string) web.Result { full_path = os.join_path_single(app.repo.pkg_dir, filename) } + // Scuffed way to respond to HEAD requests + if app.req.method == http.Method.head { + if os.exists(full_path) { + return app.ok('') + } + + return app.not_found() + } + return app.file(full_path) }