diff --git a/taskfile.yaml b/taskfile.yaml index cca2a76d..82302511 100644 --- a/taskfile.yaml +++ b/taskfile.yaml @@ -3,6 +3,7 @@ version: "3" includes: build: "taskfiles/build.yaml" deps: "taskfiles/deps.yaml" + docker: "taskfiles/docker.yaml" docs: "taskfiles/docs.yaml" lint: "taskfiles/lint.yaml" test: "taskfiles/test.yaml" diff --git a/taskfiles/docker.yaml b/taskfiles/docker.yaml new file mode 100644 index 00000000..d08e457f --- /dev/null +++ b/taskfiles/docker.yaml @@ -0,0 +1,23 @@ +version: "3" + +vars: + G_BUILD_SCRIPT: "{{.ROOT_DIR}}/tools/docker/build.sh" + +tasks: + build: + cmds: + - task: "build-storage" + - task: "build-scheduler" + - task: "build-worker" + + build-storage: + deps: [":init"] + cmd: "'{{.G_BUILD_SCRIPT}}' storage" + + build-scheduler: + deps: [":init"] + cmd: "'{{.G_BUILD_SCRIPT}}' scheduler" + + build-worker: + deps: [":init"] + cmd: "'{{.G_BUILD_SCRIPT}}' worker" diff --git a/tools/docker/build.sh b/tools/docker/build.sh new file mode 100755 index 00000000..77d65d59 --- /dev/null +++ b/tools/docker/build.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +service="${1:?Usage: build.sh }" + +remove_temp_file_and_prev_image() { + rm -f "$temp_iid_file" + + if [[ -z "$new_image_id" ]]; then + rm -f "$iid_file" + elif [[ "$prev_image_id" == "$new_image_id" ]]; then + return + fi + + [[ -z "$prev_image_id" ]] && return + + docker image inspect "$prev_image_id" >/dev/null 2>&1 || return + + echo "Removing previous image $prev_image_id." + docker image remove "$prev_image_id" || true +} +trap remove_temp_file_and_prev_image EXIT + +script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +repo_root="${script_dir}/../../" +iid_file="${repo_root}/build/spider-${service}-image.id" + +prev_image_id="" +if [[ -f "$iid_file" ]]; then + prev_image_id=$(<"$iid_file") +fi + +temp_iid_file="$(mktemp)" +new_image_id="" + +docker build \ + --pull \ + --target "$service" \ + --iidfile "$temp_iid_file" \ + --file "${script_dir}/Dockerfile" \ + "$repo_root" + +if [[ -s "$temp_iid_file" ]]; then + new_image_id="$(<"$temp_iid_file")" + echo "$new_image_id" > "$iid_file" + + user="${USER:-$(whoami 2>/dev/null)}" \ + || user=$(id -un 2>/dev/null) \ + || user=$(id -u 2>/dev/null) \ + || user="unknown"; + short_id="${new_image_id#sha256:}" + short_id="${short_id:0:4}" + docker tag "$new_image_id" "spider-${service}:dev-${user}-${short_id}" +fi