All checks were successful
Go Linter / Tag Commit (push) Successful in 14s
Deploy Production / Deploy to Staging (push) Has been skipped
Go Linter / Run golangci-lint (api_gateway) (push) Successful in 3m47s
Go Linter / Build golang services (api_gateway) (push) Successful in 4m15s
Go Linter / Push Docker Images (api_gateway) (push) Successful in 5m4s
144 lines
5.1 KiB
Makefile
144 lines
5.1 KiB
Makefile
BIN_DIR := $(CURDIR)/bin
|
||
APP_NAME ?= molva-app-backend
|
||
VERSION ?= $(shell git describe --tags 2>/dev/null || echo "v0.0.0")
|
||
BUILD_DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||
GIT_COMMIT := $(shell git rev-parse HEAD 2>/dev/null)
|
||
LDFLAGS := "-s -w -X main.version=$(VERSION) -X main.commit=$(GIT_COMMIT) -X main.date=$(BUILD_DATE)"
|
||
GOLANGCI_LINT_VERSION := v1.62.2
|
||
SWAG_VERSION := v1.16.2
|
||
ENV := "local"
|
||
UNAME_S := $(shell uname -s)
|
||
CONFIG_PATH := .build/config/
|
||
SWAGGER_DOCS_PATH := internal/http/swagger/docs
|
||
ifeq ($(UNAME_S),Darwin)
|
||
SED_INPLACE := -i ''
|
||
else
|
||
SED_INPLACE := -i
|
||
endif
|
||
|
||
ifeq ($(OS),Windows_NT)
|
||
CONFIG_PATH := $(subst /,\,$(CONFIG_PATH))
|
||
endif
|
||
|
||
.PHONY: all
|
||
all: lint build
|
||
|
||
## -- Dependency Management --
|
||
.PHONY: install-tools
|
||
install-tools: $(BIN_DIR)/golangci-lint $(BIN_DIR)/swag
|
||
|
||
.PHONY: $(BIN_DIR)/golangci-lint
|
||
$(BIN_DIR)/golangci-lint:
|
||
@mkdir -p $(@D)
|
||
@echo "Installing golangci-lint $(GOLANGCI_LINT_VERSION)..."
|
||
@GOBIN=$(BIN_DIR) go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION)
|
||
|
||
.PHONY: $(BIN_DIR)/swag
|
||
$(BIN_DIR)/swag:
|
||
@mkdir -p $(@D)
|
||
@echo "Installing swag $(SWAG_VERSION)..."
|
||
@GOBIN=$(BIN_DIR) go install github.com/swaggo/swag/cmd/swag@$(SWAG_VERSION)
|
||
|
||
## -- Linting --
|
||
.PHONY: lint
|
||
lint: $(BIN_DIR)/golangci-lint
|
||
@echo "Running linter..."
|
||
@$(BIN_DIR)/golangci-lint run --config .golangci-lint.yaml --fix=false --color=always
|
||
|
||
## -- Documentation --
|
||
.PHONY: docs
|
||
docs: $(BIN_DIR)/swag
|
||
@echo "Generating Swagger documentation..."
|
||
@if [ -n "$(SWAGGER_HOST)" ]; then \
|
||
echo "Using SWAGGER_HOST: $(SWAGGER_HOST)"; \
|
||
$(MAKE) .generate-swagger-with-host HOST=$(SWAGGER_HOST); \
|
||
else \
|
||
echo "Using default host: localhost:8000"; \
|
||
mkdir -p $(SWAGGER_DOCS_PATH); \
|
||
$(BIN_DIR)/swag init -g cmd/main.go -o $(SWAGGER_DOCS_PATH) --parseDependency --parseInternal; \
|
||
echo "Swagger documentation generated in $(SWAGGER_DOCS_PATH)"; \
|
||
fi
|
||
|
||
.PHONY: .generate-swagger-with-host
|
||
.generate-swagger-with-host: $(BIN_DIR)/swag
|
||
@echo "Генерация Swagger документации с host: $(HOST)"
|
||
@mkdir -p $(SWAGGER_DOCS_PATH)
|
||
@TEMP_MAIN="cmd/main_temp.go" && \
|
||
cp cmd/main.go $$TEMP_MAIN && \
|
||
ESC_HOST=$$(printf '%s\n' "$(HOST)" | sed -e 's/[\\\/&]/\\\\&/g') && \
|
||
sed $(SED_INPLACE) "s|localhost:8000|$${ESC_HOST}|g" $$TEMP_MAIN && \
|
||
$(BIN_DIR)/swag init -g $$TEMP_MAIN -o $(SWAGGER_DOCS_PATH) --parseDependency --parseInternal && \
|
||
rm -f $$TEMP_MAIN && \
|
||
echo "Swagger документация успешно сгенерирована с host: $(HOST)" && \
|
||
echo "Документация доступна по адресу: $(HOST)/swagger/index.html"
|
||
|
||
## -- Run --
|
||
## To change env use: make run CONFIG_PATH={config file dir path} ENV={env}
|
||
.PHONY: run
|
||
run:
|
||
@echo "Starting $(APP_NAME)..."
|
||
@echo CGO_ENABLED=0 go run -ldflags=$(LDFLAGS) ./cmd/main.go --config_path=$(CONFIG_PATH) --env=$(ENV)
|
||
@CGO_ENABLED=0 go run -ldflags=$(LDFLAGS) ./cmd/main.go --config_path=$(CONFIG_PATH) --env=$(ENV)
|
||
|
||
## -- Building --
|
||
.PHONY: build
|
||
build: build-linux build-darwin build-windows
|
||
|
||
# Build for Linux
|
||
.PHONY: build-linux
|
||
build-linux:
|
||
@echo "Building for Linux..."
|
||
@GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_linux_amd64 ./cmd/main.go
|
||
@GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_linux_arm64 ./cmd/main.go
|
||
|
||
# Build for macOS (Darwin)
|
||
.PHONY: build-darwin
|
||
build-darwin:
|
||
@echo "Building for macOS..."
|
||
@GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_darwin_amd64 ./cmd/main.go
|
||
@GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_darwin_arm64 ./cmd/main.go
|
||
|
||
# Build for Windows
|
||
.PHONY: build-windows
|
||
build-windows:
|
||
@echo "Building for Windows..."
|
||
@GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_windows_amd64.exe ./cmd/main.go
|
||
@GOOS=windows GOARCH=arm64 CGO_ENABLED=0 go build -ldflags=$(LDFLAGS) -o $(BIN_DIR)/$(APP_NAME)_windows_arm64.exe ./cmd/main.go
|
||
|
||
## -- Docker --
|
||
.PHONY: docker-build
|
||
docker-build:
|
||
@echo "Building Docker image..."
|
||
@docker build \
|
||
--build-arg BUILD_LDFLAGS=$(LDFLAGS) \
|
||
--build-arg SWAGGER_HOST=$(SWAGGER_HOST) \
|
||
--build-arg CONFIG_FILE_PATH="$(CONFIG_PATH)$(ENV).yaml" \
|
||
-t $(APP_NAME):$(VERSION) \
|
||
.
|
||
|
||
.PHONY: docker-build-staging
|
||
docker-build-staging:
|
||
@echo "Building Docker image for staging..."
|
||
@docker build \
|
||
--build-arg BUILD_LDFLAGS=$(LDFLAGS) \
|
||
--build-arg SWAGGER_HOST=api-staging.example.com \
|
||
--build-arg CONFIG_FILE_PATH="$(CONFIG_PATH)$(ENV).yaml" \
|
||
-t $(APP_NAME):staging \
|
||
.
|
||
|
||
.PHONY: docker-build-production
|
||
docker-build-production:
|
||
@echo "Building Docker image for production..."
|
||
@docker build \
|
||
--build-arg BUILD_LDFLAGS=$(LDFLAGS) \
|
||
--build-arg SWAGGER_HOST=api.example.com \
|
||
--build-arg CONFIG_FILE_PATH="$(CONFIG_PATH)$(ENV).yaml" \
|
||
-t $(APP_NAME):production \
|
||
.
|
||
|
||
## -- Cleanup --
|
||
.PHONY: clean
|
||
clean:
|
||
@echo "Cleaning..."
|
||
@rm -rf $(BIN_DIR)
|