forked from Wei-Shaw/sub2api
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
129 lines (115 loc) · 5.17 KB
/
Makefile
File metadata and controls
129 lines (115 loc) · 5.17 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
.PHONY: build build-backend build-frontend sync-local-container docker-build-c5mc docker-push-c5mc docker-prune-local build-datamanagementd test test-backend test-frontend test-datamanagementd secret-scan
LOCAL_CONTAINER ?= sub2api-local
LOCAL_BINARY ?= /tmp/sub2api-local-hot
LOCAL_HEALTH_URL ?= http://127.0.0.1:18081/
LOCAL_GOCACHE ?= $(CURDIR)/backend/.gocache/sync-local-container
DOCKER_REPO ?= docker.c5mc.cn/weishaw/sub2api
DOCKER_VERSION ?= $(shell tr -d '\r\n' < backend/cmd/server/VERSION)
DOCKER_COMMIT ?= $(shell git rev-parse --short=8 HEAD)
DOCKER_DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
DOCKER_TIME ?= $(shell date +%y%m%d%H%M%S)
DOCKER_VERSION_TAG ?= $(DOCKER_VERSION)-local
DOCKER_COMMIT_TAG ?= $(DOCKER_VERSION)-$(DOCKER_COMMIT)-local
DOCKER_TIME_TAG ?= $(DOCKER_VERSION)-$(DOCKER_TIME)-local
DOCKER_VERSION := $(DOCKER_VERSION)
DOCKER_COMMIT := $(DOCKER_COMMIT)
DOCKER_DATE := $(DOCKER_DATE)
DOCKER_TIME := $(DOCKER_TIME)
DOCKER_VERSION_TAG := $(DOCKER_VERSION_TAG)
DOCKER_COMMIT_TAG := $(DOCKER_COMMIT_TAG)
DOCKER_TIME_TAG := $(DOCKER_TIME_TAG)
NODE_IMAGE ?= docker.1ms.run/library/node:24-alpine
GOLANG_IMAGE ?= docker.1ms.run/library/golang:1.26.2-alpine
ALPINE_IMAGE ?= docker.1ms.run/library/alpine:3.21
POSTGRES_IMAGE ?= docker.1ms.run/library/postgres:18-alpine
GOPROXY ?= https://goproxy.cn,direct
GOSUMDB ?= sum.golang.google.cn
DOCKER_BUILDX_MAX_USED_SPACE ?= 15gb
DOCKER_SKIP_LOCAL_TAG_PRUNE ?= 0
DOCKER_SKIP_BUILDX_PRUNE ?= 0
# 一键编译前后端
build: build-backend build-frontend
# 编译后端(复用 backend/Makefile)
build-backend:
@$(MAKE) -C backend build
# 编译前端(需要已安装依赖)
build-frontend:
@pnpm --dir frontend run build
# 本地构建并同步到运行中的本地容器,不额外保留容器备份
sync-local-container:
@set -eu; \
mkdir -p "$(LOCAL_GOCACHE)"; \
TMP_INDEX_HTML="$$(mktemp /tmp/sub2api-local-index.XXXXXX.html)"; \
cleanup() { \
rm -f "$(LOCAL_BINARY)" "$$TMP_INDEX_HTML" frontend/tsconfig.tsbuildinfo frontend/tsconfig.node.tsbuildinfo; \
rm -rf backend/internal/web/dist; \
mkdir -p backend/internal/web/dist; \
touch backend/internal/web/dist/.keep; \
}; \
trap cleanup EXIT INT TERM; \
$(MAKE) build-frontend; \
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOCACHE="$(LOCAL_GOCACHE)" go -C backend build -tags embed -trimpath -ldflags "-s -w -X main.Commit=$$(git rev-parse --short HEAD) -X main.Date=$$(date -u +%Y-%m-%dT%H:%M:%SZ) -X main.BuildType=local" -o "$(LOCAL_BINARY)" ./cmd/server; \
if [ "$$(docker inspect -f '{{.State.Running}}' "$(LOCAL_CONTAINER)")" = "true" ]; then \
docker stop "$(LOCAL_CONTAINER)" >/dev/null; \
fi; \
docker cp "$(LOCAL_BINARY)" "$(LOCAL_CONTAINER):/app/sub2api"; \
docker cp backend/resources/. "$(LOCAL_CONTAINER):/app/resources/"; \
docker start "$(LOCAL_CONTAINER)" >/dev/null; \
STATUS=""; \
for i in $$(seq 1 60); do \
STATUS="$$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' "$(LOCAL_CONTAINER)")"; \
if [ "$$STATUS" = "healthy" ]; then \
break; \
fi; \
if [ "$$STATUS" = "exited" ] || [ "$$STATUS" = "dead" ]; then \
docker logs --tail 100 "$(LOCAL_CONTAINER)"; \
exit 1; \
fi; \
sleep 2; \
done; \
test "$$STATUS" = "healthy"; \
HTTP_CODE="$$(curl -s -o "$$TMP_INDEX_HTML" -w '%{http_code}' "$(LOCAL_HEALTH_URL)")"; \
test "$$HTTP_CODE" = "200"; \
printf 'container=%s\nstatus=%s\nurl=%s\nhttp_code=%s\n' "$(LOCAL_CONTAINER)" "$$STATUS" "$(LOCAL_HEALTH_URL)" "$$HTTP_CODE"
# 构建 docker.c5mc.cn 镜像,并在构建后清理旧的本地标签与过量 BuildKit 缓存
docker-build-c5mc:
@DOCKER_REPO="$(DOCKER_REPO)" \
VERSION="$(DOCKER_VERSION)" \
COMMIT_SHORT="$(DOCKER_COMMIT)" \
TIME_TAG="$(DOCKER_TIME)" \
DATE="$(DOCKER_DATE)" \
NODE_IMAGE="$(NODE_IMAGE)" \
GOLANG_IMAGE="$(GOLANG_IMAGE)" \
ALPINE_IMAGE="$(ALPINE_IMAGE)" \
POSTGRES_IMAGE="$(POSTGRES_IMAGE)" \
GOPROXY="$(GOPROXY)" \
GOSUMDB="$(GOSUMDB)" \
DOCKER_BUILDX_MAX_USED_SPACE="$(DOCKER_BUILDX_MAX_USED_SPACE)" \
DOCKER_SKIP_LOCAL_TAG_PRUNE="$(DOCKER_SKIP_LOCAL_TAG_PRUNE)" \
DOCKER_SKIP_BUILDX_PRUNE="$(DOCKER_SKIP_BUILDX_PRUNE)" \
bash ./deploy/build_image.sh
# 推送 docker.c5mc.cn 镜像,按版本标签、提交标签、时间标签、latest 顺序推送
docker-push-c5mc: docker-build-c5mc
@set -eu; \
for tag in "$(DOCKER_VERSION_TAG)" "$(DOCKER_COMMIT_TAG)" "$(DOCKER_TIME_TAG)" latest; do \
docker push "$(DOCKER_REPO):$$tag"; \
done
# 清理当前仓库的悬空镜像,并给 BuildKit 缓存设置软上限
docker-prune-local:
@docker image prune -f --filter "label=org.opencontainers.image.source=https://github.com/Wei-Shaw/sub2api" >/dev/null || true
@docker buildx prune -f --max-used-space "$(DOCKER_BUILDX_MAX_USED_SPACE)" >/dev/null || true
@docker system df
# 编译 datamanagementd(宿主机数据管理进程)
build-datamanagementd:
@cd datamanagement && go build -o datamanagementd ./cmd/datamanagementd
# 运行测试(后端 + 前端)
test: test-backend test-frontend
test-backend:
@$(MAKE) -C backend test
test-frontend:
@pnpm --dir frontend run lint:check
@pnpm --dir frontend run typecheck
test-datamanagementd:
@cd datamanagement && go test ./...
secret-scan:
@python3 tools/secret_scan.py