|
2 | 2 | override blackbox/:=* |
3 | 3 |
|
4 | 4 | ifeq ($(origin .FEATURES),undefined) |
5 | | - $(error `make` executable version "$(MAKE_VERSION)" is not supported. GNU Make 3.82 or above is required) |
6 | | -endif |
7 | | - |
8 | | -override SHELL:=/bin/bash |
9 | | - |
10 | | -ifneq ($(value SHELL),$(shell echo $$BASH)) |
11 | | - $(error current shell executable is not supported. GNU Bash 4.3 or above is required) |
| 5 | + $(error `make` executable version `$(MAKE_VERSION)` is not supported. GNU Make 4.3 or above is required) |
12 | 6 | endif |
13 | 7 |
|
14 | 8 | ifeq ($(words $(MAKEFILE_LIST)),1) |
15 | | - $(error `Makefile.blackbox` should be included, direct usage is not allowed) |
| 9 | + $(error `Makefile` should be included, direct usage is not allowed) |
16 | 10 | endif |
17 | 11 |
|
18 | | -BLACKBOX_FLAG__DEBUG_MODE:=no |
19 | | -BLACKBOX_FLAG__STEP_PROVISION:=yes |
20 | | -BLACKBOX_FLAG__STEP_BUILD:=yes |
21 | | -BLACKBOX_FLAG__STEP_EVALUATE:=yes |
| 12 | +ifeq ($(shell which gawk),) |
| 13 | + $(error `gawk` executable is required) |
| 14 | +endif |
22 | 15 |
|
23 | | -ifneq ($(BLACKBOX_DIR),$(abspath $(dir $(lastword $(MAKEFILE_LIST))))) |
24 | | - $(error `BLACKBOX_DIR` configuration is not valid) |
| 16 | +ifeq ($(shell which vagrant),) |
| 17 | + $(error `vagrant` executable is required) |
25 | 18 | endif |
26 | 19 |
|
27 | | -BLACKBOX_HOST:=blackbox-$(shell basename $(PWD) | cut -c 1-36) |
28 | | -BLACKBOX_SPAWN:=blackbox-spawn-$(shell basename $(PWD) | cut -c 1-36) |
29 | | -BLACKBOX_USER?=$(shell id -u):$(shell id -g) |
30 | | -BLACKBOX_USER_NAME:=ubuntu |
31 | | -BLACKBOX_USER_HOME:=/home/$(BLACKBOX_USER_NAME) |
32 | | -BLACKBOX_USER_QUESTION_DIR=$(BLACKBOX_USER_HOME)/$(shell basename $(call blackbox/pwd)) |
33 | | -BLACKBOX_VERSION:=2404 |
| 20 | +override SHELL:=/usr/bin/env bash -e +o pipefail |
34 | 21 |
|
35 | | -BLACKBOX_AWS_DEFAULT_REGION:="us-east-1" |
36 | | -BLACKBOX_AWS_ACCESS_KEY_ID:=$(shell base64 -d <(base64 -d <<<"UVV0SlFWSTJUemRIU2s1WVdVSk1RVXBGTlRNSwo=")) |
37 | | -BLACKBOX_AWS_SECRET_ACCESS_KEY:=$(shell base64 -d <(base64 -d <<<"UVVaNFZUVXJWMEZoYml0eWVWUnpVSGhuY1ZWTk56VXlPVlp5Umt0Q1JFTkxRMHBFY3pKSFV3bz0K")) |
| 22 | +ifeq ($(shell echo $$BASH),) |
| 23 | + $(error current shell executable is not supported. GNU Bash 5.1 or above is required) |
| 24 | +endif |
38 | 25 |
|
39 | | -define blackbox/pwd= |
40 | | -$(abspath $(dir $(firstword $(MAKEFILE_LIST)))/$(1)) |
41 | | -endef |
| 26 | +override blackbox/debug:=$(if $(filter debug,$(MAKECMDGOALS)),yes,no) |
| 27 | +override blackbox/host/blackbox/path:=$(abspath $(dir $(lastword $(MAKEFILE_LIST)))) |
| 28 | +override blackbox/host/question/path:=$(abspath $(dir $(firstword $(MAKEFILE_LIST)))) |
| 29 | +override blackbox/spawn/blackbox/path:=/blackbox |
| 30 | +override blackbox/spawn/question/path:=/question |
| 31 | +override blackbox/spawn/id:=blackbox-$(shell basename $(blackbox/host/question/path) | cut --characters="1-36") |
| 32 | +override blackbox/spawn/cpu/limit=$(if $(filter yes,$(blackbox/debug)),$(shell nproc),4) |
| 33 | +override blackbox/spawn/memory/limit=$(if $(filter yes,$(blackbox/debug)),$(shell awk '/MemTotal/ { printf "%.0f\n", $$2 / 1024 }' /proc/meminfo),4096) |
| 34 | +override blackbox/spawn/disk/limit:=20G |
| 35 | +override blackbox/spawn/username:=ubuntu |
| 36 | + |
| 37 | +export VAGRANT_DEBUG=$(blackbox/debug) |
| 38 | +export VAGRANT_HOST_BLACKBOX_PATH=$(blackbox/host/blackbox/path) |
| 39 | +export VAGRANT_HOST_QUESTION_PATH=$(blackbox/host/question/path) |
| 40 | +export VAGRANT_SPAWN_ID=$(blackbox/spawn/id) |
| 41 | +export VAGRANT_SPAWN_BLACKBOX_PATH=$(blackbox/spawn/blackbox/path) |
| 42 | +export VAGRANT_SPAWN_QUESTION_PATH=$(blackbox/spawn/question/path) |
| 43 | +export VAGRANT_CPU_LIMIT=$(blackbox/spawn/cpu/limit) |
| 44 | +export VAGRANT_MEMORY_LIMIT=$(blackbox/spawn/memory/limit) |
| 45 | +export VAGRANT_VAGRANTFILE=$(blackbox/host/blackbox/path)/Vagrantfile |
| 46 | + |
| 47 | +BLACKBOX_FLAG__DEBUG_MODE=$(blackbox/debug) |
| 48 | +BLACKBOX_FLAG__STEP_PROVISION:=yes |
| 49 | +BLACKBOX_FLAG__STEP_BUILD:=yes |
| 50 | +BLACKBOX_FLAG__STEP_EVALUATE:=yes |
42 | 51 |
|
43 | 52 | debug: ;@: |
44 | | - $(eval BLACKBOX_FLAG__DEBUG_MODE:=yes) |
45 | | - $(foreach variable,BLACKBOX_FLAG__DEBUG_MODE BLACKBOX_FLAG__STEP_PROVISION BLACKBOX_FLAG__STEP_BUILD BLACKBOX_FLAG__STEP_EVALUATE,$(info $(shell printf "\033[0;37m%s = %s\033[0m" "$(variable)" "$($(variable))"))) |
| 53 | + $(foreach variable,$(filter blackbox/%,$(sort $(.VARIABLES))),$(info $(shell printf "\033[0;37m%s = %s\033[0m" "$(variable)" "$($(variable))"))) |
46 | 54 | $(info $(shell printf "\033[0;37m%s\033[0m" \\)) |
47 | | - $(foreach variable,$(filter-out BLACKBOX_FLAG__%,$(filter BLACKBOX_%,$(sort $(.VARIABLES)))),$(info $(shell printf "\033[0;37m%s = %s\033[0m" "$(variable)" "$($(variable))"))) |
| 55 | + $(foreach variable,$(filter VAGRANT_%,$(sort $(.VARIABLES))),$(info $(shell printf "\033[0;37m%s = %s\033[0m" "$(variable)" "$($(variable))"))) |
| 56 | + $(info $(shell printf "\033[0;37m%s\033[0m" \\)) |
| 57 | + $(foreach variable,BLACKBOX_FLAG__DEBUG_MODE BLACKBOX_FLAG__STEP_PROVISION BLACKBOX_FLAG__STEP_BUILD BLACKBOX_FLAG__STEP_EVALUATE,$(info $(shell printf "\033[0;37m%s = %s\033[0m" "$(variable)" "$($(variable))"))) |
48 | 58 | $(if $(and $(filter-out $(words $(MAKECMDGOALS)),0),$(filter-out $(words $(MAKECMDGOALS)),1)),$(info $(shell printf "\033[0;37m%s\033[0m" --))) |
49 | 59 |
|
50 | | -all: uninstall install setup solve check |
| 60 | +all: uninstall install setup save solve check restore check |
| 61 | + |
| 62 | +up: uninstall install setup save |
| 63 | + |
| 64 | +100: restore solve check |
| 65 | + |
| 66 | +0: restore check |
51 | 67 |
|
52 | 68 | install: |
53 | | - docker login --username AWS --password-stdin 134148934511.dkr.ecr.us-east-1.amazonaws.com < <(docker run -it --env="AWS_DEFAULT_REGION=$(BLACKBOX_AWS_DEFAULT_REGION)" --env="AWS_ACCESS_KEY_ID=$(BLACKBOX_AWS_ACCESS_KEY_ID)" --env="AWS_SECRET_ACCESS_KEY=$(BLACKBOX_AWS_SECRET_ACCESS_KEY)" --rm amazon/aws-cli:2.11.25 ecr get-login-password) |
54 | | - cat <(echo FROM 134148934511.dkr.ecr.us-east-1.amazonaws.com/hr/blackbox_2404:abstract) <(echo RUN groupadd docker) | docker buildx build --build-arg="BLACKBOX_USER=$(BLACKBOX_USER)" --build-arg="BLACKBOX_USER_NAME=$(BLACKBOX_USER_NAME)" --build-arg="BLACKBOX_USER_HOME=$(BLACKBOX_USER_HOME)" --build-arg="BLACKBOX_VERSION=$(BLACKBOX_VERSION)" --network="host" --progress="plain" --tag="blackbox:$(BLACKBOX_HOST)" - |
55 | | - docker run -di --group-add docker --hostname="blackbox" --name="$(BLACKBOX_HOST)" --privileged --cgroupns=host $(if $(filter debug,$(MAKECMDGOALS)),--volume="$(BLACKBOX_DIR):/blackbox:ro") --volume="$(call blackbox/pwd)/setup.sh:$(BLACKBOX_USER_HOME)/setup.sh:ro" --volume="$(call blackbox/pwd)/check.sh:$(BLACKBOX_USER_HOME)/check.sh:ro" --volume="$(call blackbox/pwd)/solve.sh:$(BLACKBOX_USER_HOME)/solve.sh:ro" --volume="$(call blackbox/pwd)/evaluate.sh:$(BLACKBOX_USER_HOME)/evaluate.sh:ro" blackbox:$(BLACKBOX_HOST) >/dev/null |
| 69 | + vagrant --no-color up $(blackbox/spawn/id) |
| 70 | + vagrant --no-color snapshot save -f $(blackbox/spawn/id) install |
| 71 | + |
| 72 | +reinstall: |
| 73 | + vagrant --no-color snapshot restore $(blackbox/spawn/id) install |
56 | 74 |
|
57 | 75 | setup: |
58 | | - docker exec -it --env="BLACKBOX_FLAG__DEBUG_MODE=$(BLACKBOX_FLAG__DEBUG_MODE)" --env="BLACKBOX_FLAG__STEP_PROVISION=$(BLACKBOX_FLAG__STEP_PROVISION)" --env="BLACKBOX_USER_QUESTION_DIR=$(BLACKBOX_USER_QUESTION_DIR)" --env="BLACKBOX_VERSION=$(BLACKBOX_VERSION)" $(BLACKBOX_HOST) $(SHELL) setup.sh |
| 76 | + vagrant ssh --command="sudo BLACKBOX_FLAG__DEBUG_MODE=$(BLACKBOX_FLAG__DEBUG_MODE) bash $(blackbox/spawn/question/path)/setup.sh" $(blackbox/spawn/id) |
59 | 77 |
|
60 | | -solve: |
61 | | - docker exec -it --user="$(BLACKBOX_USER)" $(BLACKBOX_HOST) $(SHELL) solve.sh |
62 | | - docker exec -it -w $(BLACKBOX_USER_QUESTION_DIR) --user="$(BLACKBOX_USER)" $(BLACKBOX_HOST) $(SHELL) -c "source /blackbox/blackbox &>/dev/null; solve" |
| 78 | +save: |
| 79 | + vagrant --no-color snapshot save -f $(blackbox/spawn/id) latest |
63 | 80 |
|
64 | | -evaluate: |
65 | | - docker exec -it $(BLACKBOX_HOST) $(SHELL) evaluate.sh |
| 81 | +restore: |
| 82 | + vagrant --no-color snapshot restore $(blackbox/spawn/id) latest |
| 83 | + |
| 84 | +solve: |
| 85 | + vagrant ssh --command="sudo bash $(blackbox/spawn/question/path)/solve.sh" $(blackbox/spawn/id) |
66 | 86 |
|
67 | 87 | check: |
68 | | - docker exec -it --env="BLACKBOX_SPAWN=$(BLACKBOX_SPAWN)" --env="BLACKBOX_USER_QUESTION_DIR=$(BLACKBOX_USER_QUESTION_DIR)" --env="BLACKBOX_FLAG__DEBUG_MODE=$(BLACKBOX_FLAG__DEBUG_MODE)" --env="BLACKBOX_FLAG__STEP_PROVISION=$(BLACKBOX_FLAG__STEP_PROVISION)" --env="BLACKBOX_FLAG__STEP_BUILD=$(BLACKBOX_FLAG__STEP_BUILD)" --env="BLACKBOX_FLAG__STEP_EVALUATE=$(BLACKBOX_FLAG__STEP_EVALUATE)" --env="BLACKBOX_VERSION=$(BLACKBOX_VERSION)" $(BLACKBOX_HOST) $(SHELL) check.sh |
| 88 | + vagrant ssh --command="sudo BLACKBOX_FLAG__DEBUG_MODE=$(BLACKBOX_FLAG__DEBUG_MODE) BLACKBOX_FLAG__STEP_PROVISION=$(BLACKBOX_FLAG__STEP_PROVISION) BLACKBOX_FLAG__STEP_BUILD=$(BLACKBOX_FLAG__STEP_BUILD) BLACKBOX_FLAG__STEP_EVALUATE=$(BLACKBOX_FLAG__STEP_EVALUATE) bash $(blackbox/spawn/question/path)/check.sh" $(blackbox/spawn/id) | tee >(awk '/Partial Credit/ { if (!reset) { reset = 1; next }; total_score += $$3; ok += ($$3 > 0); failed += ($$3 == 0) } END { printf("\n--\nSuccess: %d\nFail: %d\n\nTotal: %d\n--\n\nTotal Credit: %d\n", ok, failed, ok + failed, total_score) }') |
69 | 89 |
|
70 | 90 | check\:evaluate: |
71 | | - $(MAKE) BLACKBOX_FLAG__STEP_PROVISION=no BLACKBOX_FLAG__STEP_BUILD=no BLACKBOX_FLAG__STEP_EVALUATE=yes check |
| 91 | + $(eval BLACKBOX_FLAG__STEP_PROVISION:=no) |
| 92 | + $(eval BLACKBOX_FLAG__STEP_BUILD:=no) |
| 93 | + $(MAKE) check |
72 | 94 |
|
73 | 95 | shell: |
74 | | - docker exec -it -w $(BLACKBOX_USER_QUESTION_DIR) --user="$(BLACKBOX_USER)" $(BLACKBOX_HOST) $(SHELL) |
75 | | - |
76 | | -hr: |
77 | | - cat <(xargs -r xdg-open 2>/dev/null < <(grep -o 'https://www.hackerrank.com.*' README.md)) |
78 | | - |
79 | | -gh: |
80 | | - cat <(xargs -r xdg-open 2>/dev/null < <(grep -o 'https://github.com.*' README.md)) |
81 | | - |
82 | | -shell\:spawn: |
83 | | - docker exec -it $(BLACKBOX_HOST) $(SHELL) -c "docker exec -it -w $(BLACKBOX_USER_QUESTION_DIR) $(BLACKBOX_SPAWN) $(SHELL)" |
| 96 | + vagrant ssh $(blackbox/spawn/id) --command="sudo su - $(blackbox/spawn/username)" |
84 | 97 |
|
85 | 98 | uninstall: |
86 | | - xargs -r docker rm -f >/dev/null < <(docker ps -aq -f "name=$(BLACKBOX_HOST)") |
87 | | - docker rmi blackbox:$(BLACKBOX_HOST) 2>/dev/null || true |
| 99 | + vagrant destroy -f |
| 100 | + rm -rf .vagrant |
88 | 101 |
|
89 | | -prune: |
90 | | - xargs -r docker stop >/dev/null < <(docker ps -aq -f "name=blackbox-") |
91 | | - docker system prune -a --volumes |
| 102 | +gh: |
| 103 | + grep -o "https://github.com.*" "$(blackbox/host/question/path)/README.md" | xargs -r xdg-open &>/dev/null |
92 | 104 |
|
93 | | -ifeq ($(filter debug,$(MAKECMDGOALS)),) |
94 | | -.SILENT: |
95 | | -endif |
| 105 | +hr: |
| 106 | + grep -o "https://www.hackerrank.com.*" "$(blackbox/host/question/path)/README.md" | xargs -r xdg-open &>/dev/null |
0 commit comments