init: ops-assistant codebase
This commit is contained in:
110
Makefile
Normal file
110
Makefile
Normal file
@@ -0,0 +1,110 @@
|
||||
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: 补丁版本 +1(x.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: 次版本 +1(x.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: 主版本 +1(x.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 tag(vX.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/^## / /'
|
||||
Reference in New Issue
Block a user