Files
ops-assistant/Makefile
2026-03-19 21:23:28 +08:00

111 lines
4.3 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
APP_NAME := ops-assistant
VERSION_FILE := VERSION
VERSION ?= $(shell cat $(VERSION_FILE) 2>/dev/null || echo "0.1.0")
GIT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
BUILD_TIME := $(shell date -u '+%Y-%m-%dT%H:%M:%SZ')
LDFLAGS := -X ops-assistant/version.Version=$(VERSION) \
-X ops-assistant/version.GitCommit=$(GIT_COMMIT) \
-X ops-assistant/version.BuildTime=$(BUILD_TIME)
DOCKER_IMAGE := ouaone/ops-assistant
DOCKER_TAG := $(VERSION)
RELEASE_TAG := v$(VERSION)
DIST_DIR := dist
ASSET_NAME := $(APP_NAME)-$(RELEASE_TAG)-linux-amd64
.PHONY: build clean run docker docker-push release help version show-version set-version bump-patch bump-minor bump-major release-plan package-release tag-release release-check
## build: 编译二进制文件
build:
go build -ldflags "$(LDFLAGS)" -o $(APP_NAME) cmd/main.go
## build-linux: 交叉编译 Linux amd64
build-linux:
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o $(APP_NAME)-linux-amd64 cmd/main.go
## clean: 清理编译产物
clean:
rm -f $(APP_NAME) $(APP_NAME)-linux-amd64
## run: 编译并运行
run: build
./$(APP_NAME)
## docker: 构建 Docker 镜像
docker:
docker build -t $(DOCKER_IMAGE):$(DOCKER_TAG) -t $(DOCKER_IMAGE):latest \
--build-arg VERSION=$(VERSION) \
--build-arg GIT_COMMIT=$(GIT_COMMIT) \
--build-arg BUILD_TIME=$(BUILD_TIME) .
## docker-push: 推送 Docker 镜像
docker-push:
docker push $(DOCKER_IMAGE):$(DOCKER_TAG)
docker push $(DOCKER_IMAGE):latest
## show-version: 显示语义化版本vx.y.z
show-version:
@echo "v$(VERSION)"
## version: 显示版本信息
version:
@echo "$(APP_NAME) v$(VERSION) ($(GIT_COMMIT))"
## set-version: 设置版本号(示例: make set-version VERSION=1.2.3
set-version:
@echo "$(VERSION)" > $(VERSION_FILE)
@echo "✅ version set to v$(VERSION)"
## bump-patch: 补丁版本 +1x.y.z -> x.y.z+1
bump-patch:
@python3 -c 'from pathlib import Path;p=Path("VERSION");s=p.read_text().strip() if p.exists() else "0.1.0";a,b,c=[int(x) for x in s.split(".")[:3]];n=f"{a}.{b}.{c+1}";p.write_text(n+"\n");print(f"✅ bump patch: v{s} -> v{n}")'
## bump-minor: 次版本 +1x.y.z -> x.y+1.0
bump-minor:
@python3 -c 'from pathlib import Path;p=Path("VERSION");s=p.read_text().strip() if p.exists() else "0.1.0";a,b,c=[int(x) for x in s.split(".")[:3]];n=f"{a}.{b+1}.0";p.write_text(n+"\n");print(f"✅ bump minor: v{s} -> v{n}")'
## bump-major: 主版本 +1x.y.z -> x+1.0.0
bump-major:
@python3 -c 'from pathlib import Path;p=Path("VERSION");s=p.read_text().strip() if p.exists() else "0.1.0";a,b,c=[int(x) for x in s.split(".")[:3]];n=f"{a+1}.0.0";p.write_text(n+"\n");print(f"✅ bump major: v{s} -> v{n}")'
## release-plan: 显示发布参数预览
release-plan:
@echo "APP_NAME=$(APP_NAME)"
@echo "VERSION=$(VERSION)"
@echo "RELEASE_TAG=$(RELEASE_TAG)"
@echo "DOCKER_IMAGE=$(DOCKER_IMAGE)"
@echo "DOCKER_TAG=$(DOCKER_TAG)"
@echo "ASSET=$(DIST_DIR)/$(ASSET_NAME)"
## release-check: 发布前基础检查(工作区、版本格式)
release-check:
@test -z "$$(git status --porcelain)" || (echo "❌ git 工作区不干净,请先提交" && exit 1)
@echo "$(VERSION)" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$$' || (echo "❌ VERSION 格式必须是 x.y.z" && exit 1)
@echo "✅ release-check passed (v$(VERSION))"
## package-release: 产出发布二进制与 sha256
package-release:
@mkdir -p $(DIST_DIR)
@CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o $(DIST_DIR)/$(ASSET_NAME) cmd/main.go
@sha256sum $(DIST_DIR)/$(ASSET_NAME) > $(DIST_DIR)/$(ASSET_NAME).sha256
@echo "✅ package ready: $(DIST_DIR)/$(ASSET_NAME)"
## tag-release: 创建并推送 git tagvX.Y.Z
tag-release:
@git rev-parse -q --verify refs/tags/$(RELEASE_TAG) >/dev/null && (echo "❌ tag exists: $(RELEASE_TAG)" && exit 1) || true
@git tag -a $(RELEASE_TAG) -m "release: $(RELEASE_TAG)"
@git push origin $(RELEASE_TAG)
@echo "✅ pushed tag $(RELEASE_TAG)"
## release: 本地发布编排check + build + docker + package
release: release-check build docker package-release
@echo "✅ release local artifacts ready for $(RELEASE_TAG)"
@echo " next: make docker-push && make tag-release"
## help: 显示帮助
help:
@echo "$(APP_NAME) v$(VERSION)"
@echo ""
@echo "可用目标:"
@grep -E '^## ' Makefile | sed 's/^## / /'