246 lines
6.2 KiB
Makefile
246 lines
6.2 KiB
Makefile
|
|
# TYAPI Server Makefile
|
||
|
|
|
||
|
|
# 应用信息
|
||
|
|
APP_NAME := tyapi-server
|
||
|
|
VERSION := 1.0.0
|
||
|
|
BUILD_TIME := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||
|
|
GIT_COMMIT := $(shell git rev-parse --short HEAD)
|
||
|
|
GO_VERSION := $(shell go version | awk '{print $$3}')
|
||
|
|
|
||
|
|
# 构建参数
|
||
|
|
LDFLAGS := -ldflags "-X main.version=$(VERSION) -X main.commit=$(GIT_COMMIT) -X main.date=$(BUILD_TIME)"
|
||
|
|
BUILD_DIR := bin
|
||
|
|
MAIN_PATH := cmd/api/main.go
|
||
|
|
|
||
|
|
# Go 相关
|
||
|
|
GOCMD := go
|
||
|
|
GOBUILD := $(GOCMD) build
|
||
|
|
GOCLEAN := $(GOCMD) clean
|
||
|
|
GOTEST := $(GOCMD) test
|
||
|
|
GOGET := $(GOCMD) get
|
||
|
|
GOMOD := $(GOCMD) mod
|
||
|
|
GOFMT := $(GOCMD) fmt
|
||
|
|
|
||
|
|
# Docker 相关
|
||
|
|
DOCKER_IMAGE := $(APP_NAME):$(VERSION)
|
||
|
|
DOCKER_LATEST := $(APP_NAME):latest
|
||
|
|
|
||
|
|
# 默认目标
|
||
|
|
.DEFAULT_GOAL := help
|
||
|
|
|
||
|
|
## 显示帮助信息
|
||
|
|
help:
|
||
|
|
@echo "TYAPI Server Makefile"
|
||
|
|
@echo ""
|
||
|
|
@echo "使用方法: make [目标]"
|
||
|
|
@echo ""
|
||
|
|
@echo "可用目标:"
|
||
|
|
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
||
|
|
|
||
|
|
## 安装依赖
|
||
|
|
deps:
|
||
|
|
@echo "安装依赖..."
|
||
|
|
$(GOMOD) download
|
||
|
|
$(GOMOD) tidy
|
||
|
|
|
||
|
|
## 代码格式化
|
||
|
|
fmt:
|
||
|
|
@echo "格式化代码..."
|
||
|
|
$(GOFMT) ./...
|
||
|
|
|
||
|
|
## 代码检查
|
||
|
|
lint:
|
||
|
|
@echo "代码检查..."
|
||
|
|
@if command -v golangci-lint >/dev/null 2>&1; then \
|
||
|
|
golangci-lint run; \
|
||
|
|
else \
|
||
|
|
echo "golangci-lint 未安装,跳过代码检查"; \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 运行测试
|
||
|
|
test:
|
||
|
|
@echo "运行测试..."
|
||
|
|
$(GOTEST) -v -race -coverprofile=coverage.out ./...
|
||
|
|
|
||
|
|
## 生成测试覆盖率报告
|
||
|
|
coverage: test
|
||
|
|
@echo "生成覆盖率报告..."
|
||
|
|
$(GOCMD) tool cover -html=coverage.out -o coverage.html
|
||
|
|
@echo "覆盖率报告已生成: coverage.html"
|
||
|
|
|
||
|
|
## 构建应用 (开发环境)
|
||
|
|
build:
|
||
|
|
@echo "构建应用..."
|
||
|
|
@mkdir -p $(BUILD_DIR)
|
||
|
|
$(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME) $(MAIN_PATH)
|
||
|
|
|
||
|
|
## 构建生产版本
|
||
|
|
build-prod:
|
||
|
|
@echo "构建生产版本..."
|
||
|
|
@mkdir -p $(BUILD_DIR)
|
||
|
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -a -installsuffix cgo -o $(BUILD_DIR)/$(APP_NAME)-linux-amd64 $(MAIN_PATH)
|
||
|
|
|
||
|
|
## 交叉编译
|
||
|
|
build-all:
|
||
|
|
@echo "交叉编译..."
|
||
|
|
@mkdir -p $(BUILD_DIR)
|
||
|
|
# Linux AMD64
|
||
|
|
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-linux-amd64 $(MAIN_PATH)
|
||
|
|
# Linux ARM64
|
||
|
|
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-linux-arm64 $(MAIN_PATH)
|
||
|
|
# macOS AMD64
|
||
|
|
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-darwin-amd64 $(MAIN_PATH)
|
||
|
|
# macOS ARM64
|
||
|
|
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-darwin-arm64 $(MAIN_PATH)
|
||
|
|
# Windows AMD64
|
||
|
|
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GOBUILD) $(LDFLAGS) -o $(BUILD_DIR)/$(APP_NAME)-windows-amd64.exe $(MAIN_PATH)
|
||
|
|
|
||
|
|
## 运行应用
|
||
|
|
run: build
|
||
|
|
@echo "启动应用..."
|
||
|
|
./$(BUILD_DIR)/$(APP_NAME)
|
||
|
|
|
||
|
|
## 开发模式运行 (热重载)
|
||
|
|
dev:
|
||
|
|
@echo "开发模式启动..."
|
||
|
|
@if command -v air >/dev/null 2>&1; then \
|
||
|
|
air; \
|
||
|
|
else \
|
||
|
|
echo "air 未安装,使用普通模式运行..."; \
|
||
|
|
$(GOCMD) run $(MAIN_PATH); \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 运行数据库迁移
|
||
|
|
migrate: build
|
||
|
|
@echo "运行数据库迁移..."
|
||
|
|
./$(BUILD_DIR)/$(APP_NAME) -migrate
|
||
|
|
|
||
|
|
## 显示版本信息
|
||
|
|
version: build
|
||
|
|
@echo "版本信息:"
|
||
|
|
./$(BUILD_DIR)/$(APP_NAME) -version
|
||
|
|
|
||
|
|
## 健康检查
|
||
|
|
health: build
|
||
|
|
@echo "执行健康检查..."
|
||
|
|
./$(BUILD_DIR)/$(APP_NAME) -health
|
||
|
|
|
||
|
|
## 清理构建文件
|
||
|
|
clean:
|
||
|
|
@echo "清理构建文件..."
|
||
|
|
$(GOCLEAN)
|
||
|
|
rm -rf $(BUILD_DIR)
|
||
|
|
rm -f coverage.out coverage.html
|
||
|
|
|
||
|
|
## 创建 .env 文件
|
||
|
|
env:
|
||
|
|
@if [ ! -f .env ]; then \
|
||
|
|
echo "创建 .env 文件..."; \
|
||
|
|
cp env.example .env; \
|
||
|
|
echo ".env 文件已创建,请根据需要修改配置"; \
|
||
|
|
else \
|
||
|
|
echo ".env 文件已存在"; \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 设置开发环境
|
||
|
|
setup: deps env
|
||
|
|
@echo "设置开发环境..."
|
||
|
|
@echo "1. 依赖已安装"
|
||
|
|
@echo "2. .env 文件已创建"
|
||
|
|
@echo "3. 请确保 PostgreSQL 和 Redis 正在运行"
|
||
|
|
@echo "4. 运行 'make migrate' 创建数据库表"
|
||
|
|
@echo "5. 运行 'make dev' 启动开发服务器"
|
||
|
|
|
||
|
|
## 构建 Docker 镜像
|
||
|
|
docker-build:
|
||
|
|
@echo "构建 Docker 镜像..."
|
||
|
|
docker build -t $(DOCKER_IMAGE) -t $(DOCKER_LATEST) .
|
||
|
|
|
||
|
|
## 运行 Docker 容器
|
||
|
|
docker-run:
|
||
|
|
@echo "运行 Docker 容器..."
|
||
|
|
docker run -d --name $(APP_NAME) -p 8080:8080 --env-file .env $(DOCKER_LATEST)
|
||
|
|
|
||
|
|
## 停止 Docker 容器
|
||
|
|
docker-stop:
|
||
|
|
@echo "停止 Docker 容器..."
|
||
|
|
docker stop $(APP_NAME) || true
|
||
|
|
docker rm $(APP_NAME) || true
|
||
|
|
|
||
|
|
## 推送 Docker 镜像
|
||
|
|
docker-push:
|
||
|
|
@echo "推送 Docker 镜像..."
|
||
|
|
docker push $(DOCKER_IMAGE)
|
||
|
|
docker push $(DOCKER_LATEST)
|
||
|
|
|
||
|
|
## 启动开发依赖服务 (Docker Compose)
|
||
|
|
services-up:
|
||
|
|
@echo "启动开发依赖服务..."
|
||
|
|
@if [ -f docker-compose.dev.yml ]; then \
|
||
|
|
docker-compose -f docker-compose.dev.yml up -d; \
|
||
|
|
else \
|
||
|
|
echo "docker-compose.dev.yml 不存在"; \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 停止开发依赖服务
|
||
|
|
services-down:
|
||
|
|
@echo "停止开发依赖服务..."
|
||
|
|
@if [ -f docker-compose.dev.yml ]; then \
|
||
|
|
docker-compose -f docker-compose.dev.yml down; \
|
||
|
|
else \
|
||
|
|
echo "docker-compose.dev.yml 不存在"; \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 查看服务日志
|
||
|
|
logs:
|
||
|
|
@echo "查看应用日志..."
|
||
|
|
@if [ -f logs/app.log ]; then \
|
||
|
|
tail -f logs/app.log; \
|
||
|
|
else \
|
||
|
|
echo "日志文件不存在"; \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 生成 API 文档
|
||
|
|
docs:
|
||
|
|
@echo "生成 API 文档..."
|
||
|
|
@if command -v swag >/dev/null 2>&1; then \
|
||
|
|
swag init -g $(MAIN_PATH) -o docs/swagger; \
|
||
|
|
else \
|
||
|
|
echo "swag 未安装,跳过文档生成"; \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 性能测试
|
||
|
|
bench:
|
||
|
|
@echo "运行性能测试..."
|
||
|
|
$(GOTEST) -bench=. -benchmem ./...
|
||
|
|
|
||
|
|
## 内存泄漏检测
|
||
|
|
race:
|
||
|
|
@echo "运行竞态条件检测..."
|
||
|
|
$(GOTEST) -race ./...
|
||
|
|
|
||
|
|
## 安全扫描
|
||
|
|
security:
|
||
|
|
@echo "运行安全扫描..."
|
||
|
|
@if command -v gosec >/dev/null 2>&1; then \
|
||
|
|
gosec ./...; \
|
||
|
|
else \
|
||
|
|
echo "gosec 未安装,跳过安全扫描"; \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 生成模拟数据
|
||
|
|
mock:
|
||
|
|
@echo "生成模拟数据..."
|
||
|
|
@if command -v mockgen >/dev/null 2>&1; then \
|
||
|
|
echo "生成模拟数据..."; \
|
||
|
|
else \
|
||
|
|
echo "mockgen 未安装,请先安装: go install github.com/golang/mock/mockgen@latest"; \
|
||
|
|
fi
|
||
|
|
|
||
|
|
## 完整的 CI 流程
|
||
|
|
ci: deps fmt lint test build
|
||
|
|
|
||
|
|
## 完整的发布流程
|
||
|
|
release: ci build-all docker-build
|
||
|
|
|
||
|
|
.PHONY: help deps fmt lint test coverage build build-prod build-all run dev migrate version health clean env setup docker-build docker-run docker-stop docker-push services-up services-down logs docs bench race security mock ci release
|