# idsync — 飞书 → OpenLDAP 同步器 # 宿主未安装 Go,所有 Go 操作都在 podman 容器内执行。 # 注意:容器必须 --network=host,否则容器内的 127.0.0.1 指向容器自身,无法访问宿主代理。 GO_IMAGE := docker.io/library/golang:1.26-trixie NODE_IMAGE := docker.io/library/node:20-alpine PROXY := http://127.0.0.1:10808 PODMAN := podman run --rm --pull=never --network=host \ -e http_proxy=$(PROXY) -e https_proxy=$(PROXY) \ -v $(PWD):/app -w /app \ -v idsync-gomod:/go/pkg/mod \ -v idsync-gocache:/root/.cache/go-build .PHONY: default default: help .PHONY: deps deps: $(PODMAN) $(GO_IMAGE) go mod download $(PODMAN) $(GO_IMAGE) go mod tidy .PHONY: build build: $(PODMAN) -e CGO_ENABLED=0 $(GO_IMAGE) go build -trimpath -o bin/idsync . .PHONY: test test: $(PODMAN) $(GO_IMAGE) go test ./... .PHONY: vet vet: $(PODMAN) $(GO_IMAGE) go vet ./... # 集成测试对真实 OpenLDAP 运行;容器内需能访问宿主的 slapd, # 因此用 host.containers.internal 并放行 no_proxy,避免流量被代理拦走。 LDAP_TEST ?= ldap://host.containers.internal:3899 .PHONY: test-integration test-integration: podman run --rm --pull=never --network=host \ --add-host host.containers.internal:host-gateway \ -e no_proxy=127.0.0.1,localhost,host.containers.internal \ -e NO_PROXY=127.0.0.1,localhost,host.containers.internal \ -e LDAP_TEST_URL=$(LDAP_TEST) \ -v $(PWD):/app -w /app \ -v idsync-gomod:/go/pkg/mod \ -v idsync-gocache:/root/.cache/go-build \ $(GO_IMAGE) go test -tags=integration ./internal/... -v .PHONY: fmt fmt: $(PODMAN) $(GO_IMAGE) gofmt -l -w . .PHONY: css css: sh scripts/build-webui.sh .PHONY: run run: $(PODMAN) $(GO_IMAGE) go run . -config config.yml .PHONY: shell shell: podman run --rm -it --network=host \ -e http_proxy=$(PROXY) -e https_proxy=$(PROXY) \ -v $(PWD):/app -w /app \ -v idsync-gomod:/go/pkg/mod \ -v idsync-gocache:/root/.cache/go-build \ $(GO_IMAGE) bash .PHONY: clean clean: rm -rf bin .PHONY: help help: @echo "目标:" @echo " deps 下载并整理 Go 依赖" @echo " build 构建 bin/idsync" @echo " test 运行单元测试" @echo " test-integration 对真实 OpenLDAP 运行集成测试" @echo " vet go vet" @echo " fmt 格式化" @echo " css 构建 WebUI 样式(node 容器)" @echo " run 本地运行" @echo " shell 进入构建容器" @echo " clean 清理产物"