-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMakefile
More file actions
228 lines (191 loc) · 8.26 KB
/
Copy pathMakefile
File metadata and controls
228 lines (191 loc) · 8.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
.PHONY: help \
build build-release check check-lib install clean run run-batch-capped run-mcp run-mcp-http \
docker-build docker-build-no-cache docker-build-dev \
docker-push-dev docker-push-dev-hub docker-push-dev-ghcr-personal docker-push-dev-ghcr-itc \
docker-push-release docker-push-release-hub \
docker-push-release-ghcr-personal docker-push-release-ghcr-itc \
docker-pull-dev docker-run docker-run-detached docker-run-dev docker-stop docker-inspect \
docker-run-cli docker-run-mcp docker-run-mcp-http \
version-show
# evaluator - developer targets
APP_NAME ?= evaluator
HUB_IMAGE ?= interchouette/evaluator
GHCR_PERSONAL_IMAGE ?= ghcr.io/groussac/evaluator
GHCR_WORKER_IMAGE ?= ghcr.io/interchouette/evaluator
GHCR_ORG_IMAGE ?= ghcr.io/interchouette-itc/evaluator
TAG ?= latest
APP_VERSION ?= $(shell node -p "require('./www/package.json').version")
DOCKERFILE ?= docker/Dockerfile
DOCKER_BUILDKIT ?= 1
CI ?= 0
COMPOSE_PROD ?= docker/docker-compose.yml
WWW ?= www
# Host Rust CLI / MCP
CARGO_BIN ?= cargo
CARGO = $(CARGO_BIN)
CARGO_FLAGS ?= --features apps
CLI_MANIFEST ?= rust/Cargo.toml
CLI_BIN ?= evaluator
.DEFAULT_GOAL := help
help:
@echo "evaluator targets"
@echo ""
@echo "Host CLI / MCP (no Docker):"
@echo " make build cargo build $(CARGO_FLAGS) → evaluator + evaluator-mcp"
@echo " make build-release cargo build --release $(CARGO_FLAGS)"
@echo " make check / check-lib cargo check (apps) / lean lib"
@echo " make install cargo install --path rust --features apps"
@echo " make run ARGS='…' cargo run --bin evaluator --features apps -- …"
@echo " e.g. make run ARGS='evaluate --url http://127.0.0.1:8765/demo1shop.html --fn window.eval'"
@echo " make run-batch-capped same as run, wrapped in systemd --scope MemoryMax=$(MEMORY_MAX)"
@echo " e.g. make run-batch-capped ARGS='batch -p archive/test.csv -f window.eval'"
@echo " make run-mcp cargo run --bin evaluator-mcp (stdio)"
@echo " make run-mcp-http cargo run --bin evaluator-mcp -- --http"
@echo " (needs: cd www && npm run build + Chromium / PUPPETEER_EXECUTABLE_PATH)"
@echo ""
@echo "Docker:"
@echo " make docker-pull-dev Pull Hub :dev (preferred local test)"
@echo " make docker-run Web :4000 + MCP HTTP :9790 (ENABLE_MCP=1)"
@echo " make docker-run-detached Same, detached"
@echo " make docker-build-dev All-in-one build + :dev + :latest tags (CI)"
@echo " make docker-build All-in-one :$(TAG) + :$(APP_VERSION)"
@echo " make docker-run-cli ARGS='evaluate --url …' or 'batch -p /data/…'"
@echo " make docker-run-mcp MCP stdio (Rust evaluator-mcp)"
@echo " make docker-stop"
@echo " make version-show"
@echo ""
@echo "Images: $(HUB_IMAGE) | $(GHCR_ORG_IMAGE)"
@echo "Overrides: HUB_IMAGE=... APP_VERSION=... CI=0|1 TAG=... ARGS=..."
# --- Host Rust CLI / MCP ---
build:
$(CARGO) build --manifest-path $(CLI_MANIFEST) $(CARGO_FLAGS)
build-release:
$(CARGO) build --manifest-path $(CLI_MANIFEST) --release $(CARGO_FLAGS)
check:
$(CARGO) check --manifest-path $(CLI_MANIFEST) --all-targets $(CARGO_FLAGS)
check-lib:
$(CARGO) check --manifest-path $(CLI_MANIFEST) --lib
install:
$(CARGO) install --path rust --force --features apps
clean:
$(CARGO) clean --manifest-path $(CLI_MANIFEST)
run:
cd rust && $(CARGO) run $(CARGO_FLAGS) --bin $(CLI_BIN) -- $(if $(strip $(ARGS)),$(ARGS),--help)
# Cap batch RAM so the OOM killer hits the job scope, not Cursor/desktop.
MEMORY_MAX ?= 4G
run-batch-capped:
@test -n "$(strip $(ARGS))" || (echo 'usage: make run-batch-capped ARGS="batch -p …"' >&2; exit 2)
systemd-run --user --scope -p MemoryMax=$(MEMORY_MAX) --quiet -- \
$(MAKE) run ARGS='$(ARGS)'
run-mcp:
cd rust && $(CARGO) run $(CARGO_FLAGS) --bin evaluator-mcp -- $(ARGS)
run-mcp-http:
cd rust && $(CARGO) run $(CARGO_FLAGS) --bin evaluator-mcp -- --http $(ARGS)
version-show:
@echo "www/package.json version: $(APP_VERSION)"
@echo "suggested tags: $(HUB_IMAGE):$(APP_VERSION) $(HUB_IMAGE):latest $(HUB_IMAGE):dev"
docker-build:
DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) docker build --pull \
-t $(APP_NAME):$(TAG) \
-t $(HUB_IMAGE):$(TAG) \
-t $(HUB_IMAGE):$(APP_VERSION) \
-f $(DOCKERFILE) \
.
docker-build-no-cache:
DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) docker build --pull --no-cache \
-t $(APP_NAME):$(TAG) \
-t $(HUB_IMAGE):$(TAG) \
-t $(HUB_IMAGE):$(APP_VERSION) \
-f $(DOCKERFILE) \
.
docker-build-dev:
DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) docker build --pull \
-t $(APP_NAME):dev \
-t $(APP_NAME):latest \
-t $(HUB_IMAGE):dev \
-t $(HUB_IMAGE):latest \
-t $(GHCR_PERSONAL_IMAGE):dev \
-t $(GHCR_PERSONAL_IMAGE):latest \
-t $(GHCR_WORKER_IMAGE):dev \
-t $(GHCR_WORKER_IMAGE):latest \
-t $(GHCR_ORG_IMAGE):dev \
-t $(GHCR_ORG_IMAGE):latest \
-f $(DOCKERFILE) \
.
docker-push-dev-hub:
docker push $(HUB_IMAGE):dev
docker push $(HUB_IMAGE):latest
docker-push-dev-ghcr-personal:
docker push $(GHCR_PERSONAL_IMAGE):dev
docker push $(GHCR_PERSONAL_IMAGE):latest
docker-push-dev-ghcr-itc:
docker push $(GHCR_WORKER_IMAGE):dev
docker push $(GHCR_WORKER_IMAGE):latest
docker push $(GHCR_ORG_IMAGE):dev
docker push $(GHCR_ORG_IMAGE):latest
docker-push-dev:
@if [ "$(CI)" = "1" ]; then \
echo "Use docker-push-dev-hub / docker-push-dev-ghcr-personal / docker-push-dev-ghcr-itc in CI"; \
exit 1; \
fi
@echo "Logging in to Docker Hub..."; \
docker login || { echo "Docker Hub login failed"; exit 1; }
$(MAKE) docker-push-dev-hub
@echo "Logging in to GHCR (personal)..."; \
docker login ghcr.io || { echo "Skipping personal GHCR"; exit 0; }
$(MAKE) docker-push-dev-ghcr-personal
@echo "Logging in to GHCR (org)..."; \
docker login ghcr.io || { echo "Skipping org GHCR"; exit 0; }
$(MAKE) docker-push-dev-ghcr-itc
docker-push-release-hub:
docker push $(HUB_IMAGE):$(APP_VERSION)
docker push $(HUB_IMAGE):latest
docker-push-release-ghcr-personal:
docker tag $(HUB_IMAGE):$(APP_VERSION) $(GHCR_PERSONAL_IMAGE):$(APP_VERSION)
docker tag $(HUB_IMAGE):latest $(GHCR_PERSONAL_IMAGE):latest
docker push $(GHCR_PERSONAL_IMAGE):$(APP_VERSION)
docker push $(GHCR_PERSONAL_IMAGE):latest
docker-push-release-ghcr-itc:
docker tag $(HUB_IMAGE):$(APP_VERSION) $(GHCR_WORKER_IMAGE):$(APP_VERSION)
docker tag $(HUB_IMAGE):latest $(GHCR_WORKER_IMAGE):latest
docker tag $(HUB_IMAGE):$(APP_VERSION) $(GHCR_ORG_IMAGE):$(APP_VERSION)
docker tag $(HUB_IMAGE):latest $(GHCR_ORG_IMAGE):latest
docker push $(GHCR_WORKER_IMAGE):$(APP_VERSION)
docker push $(GHCR_WORKER_IMAGE):latest
docker push $(GHCR_ORG_IMAGE):$(APP_VERSION)
docker push $(GHCR_ORG_IMAGE):latest
docker-push-release: docker-push-release-hub docker-push-release-ghcr-personal docker-push-release-ghcr-itc
docker-pull-dev:
docker pull $(HUB_IMAGE):dev
docker tag $(HUB_IMAGE):dev $(APP_NAME):dev
docker tag $(HUB_IMAGE):dev $(HUB_IMAGE):latest
docker tag $(HUB_IMAGE):dev $(APP_NAME):latest
docker-run:
docker compose -f $(COMPOSE_PROD) --profile web down --remove-orphans 2>/dev/null || true
docker rm -f $(APP_NAME) 2>/dev/null || true
docker compose -f $(COMPOSE_PROD) --profile web up --force-recreate --pull always
docker-run-detached:
docker compose -f $(COMPOSE_PROD) --profile web down --remove-orphans 2>/dev/null || true
docker rm -f $(APP_NAME) 2>/dev/null || true
docker compose -f $(COMPOSE_PROD) --profile web up -d --force-recreate --pull always
docker-run-dev:
@echo "Starting evaluator (foreground, compose --build). UI: http://localhost:4000 MCP: :9790"
@echo "Prefer: make docker-pull-dev && make docker-run"
docker compose -f $(COMPOSE_PROD) --profile web down --remove-orphans 2>/dev/null || true
docker rm -f $(APP_NAME) 2>/dev/null || true
docker compose -f $(COMPOSE_PROD) --profile web up --build --force-recreate
docker-run-cli:
docker run --rm --network host \
-v $(CURDIR)/evaluator:/data:ro \
$(HUB_IMAGE):dev evaluator $(ARGS)
docker-run-mcp:
docker run --rm -i --network host \
$(HUB_IMAGE):dev mcp
docker-run-mcp-http:
@echo "MCP HTTP is published on :9790 when ENABLE_MCP=1 (default with make docker-run)"
@echo "Or: docker run --rm -p 9790:9790 $(HUB_IMAGE):dev mcp --http"
docker-stop:
docker compose -f $(COMPOSE_PROD) --profile web down --remove-orphans
docker rm -f $(APP_NAME) 2>/dev/null || true
docker-inspect:
docker image inspect $(HUB_IMAGE):$(TAG)