223 lines
8.4 KiB
Makefile
223 lines
8.4 KiB
Makefile
# Makefile for matching-app
|
|
|
|
# Go parameters
|
|
GOCMD=go
|
|
GOBUILD=$(GOCMD) build
|
|
GOCLEAN=$(GOCMD) clean
|
|
GOTEST=$(GOCMD) test
|
|
GOGET=$(GOCMD) get
|
|
GOFMT=$(GOCMD) fmt
|
|
GOVET=$(GOCMD) vet
|
|
GOINSTALL=$(GOCMD) install
|
|
GOMOD=$(GOCMD) mod
|
|
# Use 'go run' for govulncheck to avoid potential version conflicts if installed globally
|
|
GOVULNCHECK=$(GOCMD) run golang.org/x/vuln/cmd/govulncheck@latest
|
|
|
|
# Tools - Ensure these are installed or use 'make install-tools'
|
|
# You might need to adjust paths or commands based on your installation method
|
|
GOLANGCILINT ?= golangci-lint
|
|
GOSEC ?= gosec # Rely on gosec being in PATH after 'make install-tools'
|
|
|
|
# Project settings
|
|
BINARY_NAME=matching-app
|
|
# Quản lý phiên bản
|
|
VERSION=1.0.0
|
|
GIT_COMMIT=$(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
|
BUILD_DATE=$(shell date +%FT%T%z)
|
|
|
|
# Use forward slashes for Go compatibility, even on Windows
|
|
CMD_DIR=./cmd/server
|
|
BUILD_DIR=./build
|
|
ALL_DIRS=./...
|
|
PORT ?= 8080
|
|
|
|
# Docker settings
|
|
DOCKER_COMPOSE=docker-compose
|
|
DEV_COMPOSE_FILE=./template/docker-compose.dev.yml
|
|
DOCKER_REGISTRY=
|
|
DOCKER_IMAGE_NAME=$(BINARY_NAME)
|
|
DOCKER_IMAGE_TAG=$(VERSION)
|
|
STAGING_COMPOSE_FILE=./template/docker-compose.staging.yml
|
|
PROD_COMPOSE_FILE=./template/docker-compose.prod.yml
|
|
|
|
# Default target executed when running 'make'
|
|
.DEFAULT_GOAL := help
|
|
|
|
# Phony targets are rules that don't represent files
|
|
.PHONY: all build clean lint lint-fmt lint-vet lint-style sast test sca ci-local install-tools help \
|
|
run dev docker-build docker-up docker-down docker-logs dev-workflow dev-docker \
|
|
version tag docker-tag
|
|
|
|
all: ci-local build ## Run CI checks and build the application
|
|
|
|
# --- Build ---
|
|
build: ## Build the Go application binary
|
|
@echo ">>> Building application..."
|
|
-mkdir "$(BUILD_DIR)"
|
|
$(GOBUILD) -o "$(BUILD_DIR)/$(BINARY_NAME)" "$(CMD_DIR)/main.go"
|
|
|
|
# --- Run ---
|
|
run: build ## Build and run the application
|
|
@echo ">>> Running application on port $(PORT)..."
|
|
@set PORT=$(PORT) && "$(BUILD_DIR)/$(BINARY_NAME)"
|
|
|
|
# --- Dev Mode ---
|
|
dev: ## Run the application with hot-reload (requires installing air first)
|
|
@echo ">>> Checking if air is installed..."
|
|
@where air.exe > NUL 2>&1 || where air > NUL 2>&1
|
|
@if errorlevel 1 ( \
|
|
echo Installing air for hot-reload... && \
|
|
$(GOINSTALL) github.com/cosmtrek/air@latest \
|
|
) else ( \
|
|
echo Found air, starting hot-reload server... \
|
|
)
|
|
@set PORT=$(PORT) && air
|
|
|
|
# --- Installation ---
|
|
install-tools: ## Install necessary Go tools (gosec, air, etc.)
|
|
@echo ">>> Installing/Updating Tools..."
|
|
@echo " Installing gosec..."
|
|
$(GOINSTALL) github.com/securego/gosec/v2/cmd/gosec@latest
|
|
@echo " Installing air for hot-reload development..."
|
|
$(GOINSTALL) github.com/cosmtrek/air@latest
|
|
@echo " Verifying golangci-lint installation..."
|
|
@where $(GOLANGCILINT).exe > NUL 2>&1 || where $(GOLANGCILINT) > NUL 2>&1
|
|
@if errorlevel 1 ( \
|
|
echo Info: golangci-lint not found or not in PATH. ; \
|
|
echo Please install it following instructions at: https://golangci-lint.run/usage/install/ ; \
|
|
echo Continuing without golangci-lint for now... \
|
|
) else ( \
|
|
echo Info: golangci-lint found. \
|
|
)
|
|
@echo " Installation/Verification complete."
|
|
|
|
# --- Linting ---
|
|
lint: lint-fmt lint-vet lint-style ## Run all linters (fmt, vet, style)
|
|
@echo ">>> Linting finished."
|
|
|
|
lint-fmt:
|
|
@echo "--> Running go fmt..."
|
|
$(GOFMT) $(ALL_DIRS)
|
|
|
|
lint-vet:
|
|
@echo "--> Running go vet..."
|
|
$(GOVET) $(ALL_DIRS)
|
|
|
|
lint-style:
|
|
@echo "--> Running golangci-lint..."
|
|
@where $(GOLANGCILINT).exe > NUL 2>&1 || where $(GOLANGCILINT) > NUL 2>&1
|
|
@if errorlevel 1 ( \
|
|
echo Info: $(GOLANGCILINT) not found or not in PATH. Skipping style lint. ; \
|
|
echo Please install it following instructions at: https://golangci-lint.run/usage/install/ \
|
|
) else ( \
|
|
echo Info: $(GOLANGCILINT) found, running... ; \
|
|
$(GOLANGCILINT) run ./... \
|
|
)
|
|
|
|
# --- Security Analysis ---
|
|
sast: ## Run Static Application Security Testing (SAST) using gosec
|
|
@echo ">>> Running SAST (gosec)..."
|
|
@echo " (Executing $(GOPATH)/bin/$(GOSEC)...)"
|
|
-$(GOPATH)/bin/$(GOSEC) ./...
|
|
|
|
sca: ## Run Software Composition Analysis (SCA) using govulncheck
|
|
@echo ">>> Running SCA (govulncheck)..."
|
|
-$(GOCMD) run golang.org/x/vuln/cmd/govulncheck@latest ./...
|
|
|
|
# --- Testing ---
|
|
test: ## Run unit tests (short mode)
|
|
@echo ">>> Running unit tests..."
|
|
-mkdir "$(BUILD_DIR)"
|
|
$(GOTEST) -short -v -coverprofile="$(BUILD_DIR)/coverage.out" $(ALL_DIRS)
|
|
$(GOCMD) tool cover -func="$(BUILD_DIR)/coverage.out"
|
|
|
|
# --- Docker ---
|
|
docker-build: ## Build the Docker image
|
|
@echo ">>> Building Docker image..."
|
|
docker build -t $(BINARY_NAME) .
|
|
|
|
docker-up: ## Start Docker containers with docker-compose dev configuration
|
|
@echo ">>> Starting Docker containers (dev environment)..."
|
|
$(DOCKER_COMPOSE) -f $(DEV_COMPOSE_FILE) --env-file .env up -d
|
|
|
|
docker-down: ## Stop and remove Docker containers
|
|
@echo ">>> Stopping Docker containers..."
|
|
$(DOCKER_COMPOSE) -f $(DEV_COMPOSE_FILE) down
|
|
|
|
docker-logs: ## View logs from Docker containers
|
|
@echo ">>> Showing Docker logs..."
|
|
$(DOCKER_COMPOSE) -f $(DEV_COMPOSE_FILE) logs -f
|
|
|
|
# --- CI/CD Helpers (Chỉ dành cho CI/CD pipeline, không gọi trực tiếp) ---
|
|
# Các lệnh này KHÔNG nên được gọi trực tiếp bởi Developer, chỉ dành cho hệ thống CI/CD
|
|
|
|
# Các lệnh triển khai đã được chuyển vào pipeline CI/CD
|
|
# Xem tài liệu ci-cd-pipeline.md để biết chi tiết về quy trình triển khai
|
|
|
|
# --- Local CI Pipeline ---
|
|
# Ensures tools are checked/installed before running sequence
|
|
ci-local: lint sast test sca ## Run full local CI check (Lint -> SAST -> Test -> SCA)
|
|
@echo "========================================"
|
|
@echo ">>> Local CI Checks Completed Successfully <<<"
|
|
@echo "========================================"
|
|
|
|
# --- Developer Workflow ---
|
|
dev-workflow: clean install-tools build test lint ## Developer workflow: clean, install tools, build, test, and lint
|
|
@echo "========================================"
|
|
@echo ">>> Developer Setup Completed Successfully <<<"
|
|
@echo ">>> Run 'make run' to start the application or 'make dev' for hot-reload <<<"
|
|
@echo "========================================"
|
|
|
|
dev-docker: docker-build docker-up ## Developer Docker workflow: build and start Docker containers
|
|
@echo "========================================"
|
|
@echo ">>> Docker Development Environment Running <<<"
|
|
@echo ">>> Run 'make docker-logs' to view logs <<<"
|
|
@echo ">>> Run 'make docker-down' to stop containers <<<"
|
|
@echo "========================================"
|
|
|
|
# --- Cleanup ---
|
|
clean: ## Remove build artifacts, binary, and coverage file
|
|
@echo ">>> Cleaning up..."
|
|
-$(GOCLEAN)
|
|
-@if exist "$(BUILD_DIR)" rmdir /s /q "$(BUILD_DIR)" # Windows compatible rmdir, ignore errors
|
|
|
|
# --- Version Management ---
|
|
version: ## Hiển thị thông tin phiên bản hiện tại của ứng dụng
|
|
@echo ">>> Phiên bản hiện tại của $(BINARY_NAME):"
|
|
@echo " Version: $(VERSION)"
|
|
@echo " Commit: $(GIT_COMMIT)"
|
|
@echo " Date: $(BUILD_DATE)"
|
|
@echo " Docker: $(DOCKER_REGISTRY)$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)"
|
|
|
|
# Cập nhật phiên bản trong code và tạo tag mới
|
|
tag: ## Tạo tag Git mới với phiên bản hiện tại
|
|
@echo ">>> Tạo tag v$(VERSION) cho phiên bản hiện tại..."
|
|
git tag -a v$(VERSION) -m "Version $(VERSION)"
|
|
@echo ">>> Đã tạo tag v$(VERSION)"
|
|
@echo ">>> Đẩy tag lên repository với lệnh: git push origin v$(VERSION)"
|
|
|
|
docker-tag: docker-build ## Tạo Docker image với tag và latest
|
|
@echo ">>> Tagging Docker image $(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)..."
|
|
docker tag $(DOCKER_IMAGE_NAME) $(DOCKER_REGISTRY)$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)
|
|
docker tag $(DOCKER_IMAGE_NAME) $(DOCKER_REGISTRY)$(DOCKER_IMAGE_NAME):latest
|
|
|
|
# Các lệnh phát hành đã được chuyển vào pipeline CI/CD
|
|
# Xem tài liệu workflow_guideline.md và ci-cd-pipeline.md để biết thêm
|
|
|
|
# --- Help ---
|
|
help: ## Display this help screen
|
|
@echo "----------------------------------------"
|
|
@echo "Makefile Commands for matching-app:"
|
|
@echo "----------------------------------------"
|
|
@echo "Usage: make [target]"
|
|
@echo ""
|
|
@echo "Available targets:"
|
|
@findstr /R /C:"## " Makefile | findstr /V /C:"@findstr" | findstr /V /C:"echo" | sort
|
|
@echo "----------------------------------------"
|
|
@echo "Development Workflow:"
|
|
@echo " 1. make dev-workflow - Set up development environment"
|
|
@echo " 2. make dev - Run with hot-reload"
|
|
@echo " 3. make test - Run tests"
|
|
@echo " 4. make ci-local - Run all checks"
|
|
@echo "----------------------------------------"
|